2013-03-28 2 views
0

Я работаю над виджетами Android, которые отображают уровень батареи слева.Виджет уровня батареи Android

Кажется, что работает над эмулятором, за исключением того, что уровень заряда аккумулятора эмулятора не перемещается, поэтому я не могу проверить дальше. На реальном устройстве (ICS) он отображает только начальное текстовое представление («ТЕСТ») и ничего не делает.

манифеста

<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

Вы можете изменить уровень заряда батареи в эмуляторе с помощью telnet: http: // w ww.stealthcopter.com/blog/2010/07/changing-the-battery-percentage-in-an-avd-android-virtual-device-emulator/ – twaddington

ответ

0

Для рабочего примера взгляните на мой Mini Status Widget см code

+0

Спасибо, я узнал кое-что из вашего кода. – awonderer

0
Intent.ACTION_BATTERY_CHANGED 

Вы должны слушать его в Android Manifest

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

Вам не нужно регистрироваться там. Согласно официальному андроидному учебнику, BatteryManager передает их в липкие намерения. – awonderer

+0

Sticky означает, что после трансляции он будет придерживаться, но если вы хотите получать регулярную трансляцию, вам необходимо зарегистрировать ее в манифесте. – minhaz

+0

Я взял 'android.appwidget.action.APPWIDGET_UPDATE' вне и попробовал выше, за исключением того, что я поставил' android: name = "main.MyBatteryWidget" для приемника. Нужно ли мне модифицировать что-то еще в моем коде? Он ничего не делал на эмуляторе. – awonderer

 Смежные вопросы

  • Нет связанных вопросов^_^