【问题标题】:Getting and Displaying Battery info on Android Wear Watchface在 Android Wear Watchface 上获取和显示电池信息
【发布时间】:2017-12-20 00:51:57
【问题描述】:

我正在使用下面的示例表盘代码 https://github.com/googlecodelabs/watchface

我正在尝试将电池电量信息添加到表盘,但出现此错误。

12-20 11:39:15.042 2914-2914/com.example.android.wearable.watchface E/AndroidRuntime: 致命异常: main 进程:com.example.android.wearable.watchface,PID:2914 java.lang.RuntimeException:无法实例化服务 com.example.android.wearable.watchface.watchface.DigitalWatchFaceService: java.lang.NullPointerException:尝试调用虚拟方法 'android.content.Intent android.content.Context.registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter)' 在空对象引用上 android.app.ActivityThread.handleCreateService(ActivityThread.java:3389) 在 android.app.ActivityThread.-wrap4(未知来源:0)
在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1683) 在 android.os.Handler.dispatchMessage(Handler.java:105)
在 android.os.Looper.loop(Looper.java:164)
在 android.app.ActivityThread.main(ActivityThread.java:6541)
在 java.lang.reflect.Method.invoke(本机方法)
在 com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
引起:java.lang.NullPointerException:尝试调用虚拟 方法'android.content.Intent android.content.Context.registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter)' 在空对象引用上
在 android.content.ContextWrapper.registerReceiver(ContextWrapper.java:603) 在 com.example.android.wearable.watchface.watchface.DigitalWatchFaceService.(DigitalWatchFaceService.java:81) 在 java.lang.Class.newInstance(Native Method)
在 android.app.ActivityThread.handleCreateService(ActivityThread.java:3386) 在 android.app.ActivityThread.-wrap4(未知来源:0)
在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1683) 在 android.os.Handler.dispatchMessage(Handler.java:105) android.os.Looper.loop(Looper.java:164)
在 android.app.ActivityThread.main(ActivityThread.java:6541)
在 java.lang.reflect.Method.invoke(本机方法)
在 com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 12-20 11:39:15.082 2914-2914/com.example.android.wearable.watchface I/Process:发送信号。 PID:2914 SIG:9

这是“DigitalWatchFaceService.java”中导致错误的代码

// Battery code
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = registerReceiver(null, ifilter);
int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);

float batteryPct = level / (float)scale;

【问题讨论】:

  • 格式化异常信息
  • 你为什么要注册一个空的BroadcastReceiver?

标签: wear-os batterylevel


【解决方案1】:

这使用了这个:

公共字符串 getBatteryLevel() { Intent batteryIntent = registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); int level = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); int scale = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);

// Error checking that probably isn't needed but I added just in case.
if(level == -1 || scale == -1) {
    return "error";
}


float batteryLevelWithDecimals = ((float)level / (float)scale) * 100.0f;
String battery = String.format("%.0f", batteryLevelWithDecimals);
return battery ;

}

然后你可以这样调用电池电量字符串:

        canvas.drawText(
                String.valueOf(getBatteryLevel()),
                mXOffset, mYOffset + mLineHeight * 3, mDatePaint);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-11
    相关资源
    最近更新 更多