2013-03-28 1 views
0

Je travaille sur le widget android qui affiche le niveau de batterie à gauche.widget niveau de la batterie Android

Il semble fonctionner sur l'émulateur, sauf que le niveau de la batterie de l'émulateur ne bouge pas, donc je ne peux pas tester plus loin. Sur le périphérique réel (ICS), il affiche uniquement la vue de texte initiale ("TEST") et ne fait rien d'autre.

manifeste

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.example.battery" 
android:versionCode="1" 
android:versionName="1.0" > 

<uses-sdk 
    android:minSdkVersion="8" 
    android:targetSdkVersion="17" /> 

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <receiver android:name="main.MyBatteryWidget" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
     </intent-filter> 
     <meta-data android:name="android.appwidget.provider" 
      android:resource="@xml/widget_info" /> 
    </receiver> 
    <service android:name="main.MyBatteryWidget$BatteryUpdateService" 
     android:exported="false" > 
     <intent-filter> 
      <action android:name="com.example.battery.action.UPDATE" /> 
     </intent-filter> 
    </service> 
</application> 

widget_info.xml

<?xml version="1.0" encoding="utf-8"?> 
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" 
    android:updatePeriodMillis="0" 
    android:minWidth="40dip" 
    android:minHeight="72dip" 
    android:initialLayout="@layout/widget_layout" > 

</appwidget-provider> 

widget_layout.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <TextView android:id="@+id/textView" 
     android:text="TEST" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 


</LinearLayout> 

MyBatteryWidget.java

package main; 

import android.app.Service; 
import android.appwidget.AppWidgetManager; 
import android.appwidget.AppWidgetProvider; 
import android.content.BroadcastReceiver; 
import android.content.ComponentName; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.os.BatteryManager; 
import android.os.IBinder; 
import android.util.Log; 
import android.widget.RemoteViews; 

import com.example.battery.R; 

public class MyBatteryWidget extends AppWidgetProvider { 

    @Override 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
     int[] appWidgetIds) { 
     Log.d("TEST", "onUpdate"); 
     context.getApplicationContext().startService(new Intent("com.example.battery.action.UPDATE")); 
    } 

    public static class BatteryUpdateService extends Service { 
     private static int level = 0; 
     private static int scale = 0; 

     private BroadcastReceiver receiver = new BroadcastReceiver(){ 
      @Override 
      public void onReceive(Context context, Intent intent) { 
       String action = intent.getAction(); 

       if (action.equals(Intent.ACTION_BATTERY_CHANGED)) { 
        level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); 
        scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1); 
        Log.d("TEST", "receive"); 
        updateViews(context); 
       } 
      } 
     }; 

     private void updateViews(Context context) { 
      RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout); 
      views.setTextViewText(R.id.textView, String.valueOf(level/scale)); 
      ComponentName componentName = new ComponentName(context, MyBatteryWidget.class); 
      AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 
      appWidgetManager.updateAppWidget(componentName, views); 
     } 

     @Override 
     public int onStartCommand(Intent intent, int flags, int startId) { 
      // TODO Auto-generated method stub 
      Log.d("TEST", "start"); 
      registerReceiver(receiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); 
      return super.onStartCommand(intent, flags, startId); 
     } 

     @Override 
     public IBinder onBind(Intent intent) { 
      // TODO Auto-generated method stub 
      return null; 
     } 

    } 

} 

Logcat

03-27 19:51:34.963: D/dalvikvm(608): Not late-enabling CheckJNI (already on) 
03-27 19:51:35.043: E/Trace(608): error opening trace file: No such file or directory (2) 
03-27 19:51:35.083: D/TEST(608): onUpdate 
03-27 19:51:35.103: D/TEST(608): start 
03-27 19:51:35.133: D/TEST(608): receive 
+0

Vous pouvez changer le niveau de la batterie dans l'émulateur en utilisant telnet: http: // w ww.stealthcopter.com/blog/2010/07/changing-the-battery-percentage-in-an-avd-android-virtual-device-emulator/ – twaddington

Répondre

0

Pour un exemple de travail ont un oeil à mon Mini Status Widget, voir code

+0

Merci, j'ai appris certaines choses de votre code. – awonderer

0
Intent.ACTION_BATTERY_CHANGED 

Vous devez l'écouter dans Android Manifest

<receiver android:name=".myReceiver" > 
    <intent-filter> 
     <action android:name="Intent.ACTION_BATTERY_CHANGED" /> 
    </intent-filter> 
</receiver> 
+0

Vous ne devriez pas avoir besoin d'enregistrer cela. Selon le didacticiel Android officiel, BatteryManager les diffuse dans une intention collante. – awonderer

+0

Collant signifie qu'après la diffusion, il reste dans les parages, mais si vous voulez recevoir une diffusion régulière, vous devez l'enregistrer dans le manifeste. – minhaz

+0

J'ai pris 'android.appwidget.action.APPWIDGET_UPDATE' et essayé ci-dessus sauf que j'ai mis' android: name = "main.MyBatteryWidget" 'pour le récepteur. Dois-je modifier quelque chose d'autre dans mon code? Il n'a rien fait sur l'émulateur. – awonderer

Questions connexes