安卓电池电量检测问题
问题描述:
我是一个新用户,它是我的第一篇文章,如果我做了任何错误,请随时告诉我,谢谢。安卓电池电量检测问题
我正在开发一个android应用程序来监视电池电量并更改屏幕亮度,但我有一个奇怪的问题,并且在Google搜索多次后无法找到它。
public class SmartBrightnessProcessor extends BroadcastReceiver{
Context mContext;
IntentFilter intentFilter;
ContentResolver contentResolver;
public SmartBrightnessProcessor(Context context){
this.mContext = context;
intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);
}
public void registerReceiver(){
mContext.registerReceiver(this, intentFilter);
}
public void unRegisterReceiver(){
mContext.unregisterReceiver(this);
}
@Override
public void onReceive(Context context, Intent intent){
contentResolver = context.getContentResolver();
boolean isEnabled = context.getSharedPreferences("SmartBrightness",
Context.MODE_PRIVATE).getBoolean("SmartBrightness", false);
int batteryLevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
if(isEnabled){
if(Build.VERSION.SDK_INT >= 23){
if(Settings.System.canWrite(context)){
if(batteryLevel >= 70){
Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS, 85);
}else if(batteryLevel >= 50 && batteryLevel <= 69){
Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS, 70);
}else if(batteryLevel >= 20 && batteryLevel <= 49){
Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS, 50);
}else if(batteryLevel >= 10 && batteryLevel <= 19){
Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS, 30);
}else if(batteryLevel <= 9){
Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS, 10);
}
}
}else{
if(batteryLevel >= 70){
Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS, 85);
}else if(batteryLevel >= 50 && batteryLevel <= 69){
Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS, 70);
}else if(batteryLevel >= 20 && batteryLevel <= 49){
Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS, 50);
}else if(batteryLevel >= 10 && batteryLevel <= 19){
Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS, 30);
}else if(batteryLevel <= 9){
Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS, 10);
}
}
}
}
}
当我测试它在真实的设备上面的代码工作正常,但我想,当用户启用该选项立即设置屏幕亮度,所以我用这个代码做动作时用户点击按钮。
public class SmartBrightness extends Fragment {
SharedPreferences sharedPreferences;
Context context;
ContentResolver contentResolver;
Intent intent;
int batteryLevel;
Switch aSwitch;
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
View view = inflater.inflate(R.layout.smart_brightness, container, false);
context = getActivity().getApplicationContext();
sharedPreferences = getActivity().getSharedPreferences("SmartBrightness", 0);
Boolean smartBrightness = sharedPreferences.getBoolean("SmartBrightness", false);
aSwitch = (Switch)view.findViewById(R.id.switch1);
aSwitch.setChecked(smartBrightness);
intent = new Intent();
contentResolver = context.getContentResolver();
batteryLevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
aSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(isChecked){
if(Build.VERSION.SDK_INT >= 23){
if(!writeSettingsPermissionGranted()){
showMissingPermissionDialog();
aSwitch.setChecked(false);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putBoolean("SmartBrightness", false);
editor.apply();
}else{
if(batteryLevel >= 70){
Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS, 85);
}else if(batteryLevel >= 50 && batteryLevel <= 69){
Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS, 70);
}else if(batteryLevel >= 20 && batteryLevel <= 49){
Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS, 50);
}else if(batteryLevel >= 10 && batteryLevel <= 19){
Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS, 30);
}else if(batteryLevel <= 9){
Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS, 10);
}
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putBoolean("SmartBrightness", true);
editor.apply();
}
}else{
if(batteryLevel >= 70){
Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS, 85);
}else if(batteryLevel >= 50 && batteryLevel <= 69){
Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS, 70);
}else if(batteryLevel >= 20 && batteryLevel <= 49){
Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS, 50);
}else if(batteryLevel >= 10 && batteryLevel <= 19){
Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS, 30);
}else if(batteryLevel <= 9){
Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS, 10);
}
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putBoolean("SmartBrightness", true);
editor.apply();
}
}else{
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putBoolean("SmartBrightness", false);
editor.apply();
}
}
});
return view;
}
private void requestWriteSettingsPermission(){
if(Build.VERSION.SDK_INT >= 23){
Intent intent = new Intent(android.provider.Settings.ACTION_MANAGE_WRITE_SETTINGS);
intent.setData(Uri.parse("package:" + context.getPackageName()));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
}
public void showMissingPermissionDialog(){
final ViewGroup nullParent = null;
AlertDialog.Builder alertDialog = new AlertDialog.Builder(getActivity());
LayoutInflater layoutInflater = LayoutInflater.from(getActivity());
View view = layoutInflater.inflate(R.layout.write_settings_explaination, nullParent);
alertDialog.setView(view);
alertDialog.setCancelable(false);
alertDialog.setPositiveButton("Continue", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
requestWriteSettingsPermission();
dialog.dismiss();
}
});
alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
alertDialog.show();
}
public boolean writeSettingsPermissionGranted(){
if(Build.VERSION.SDK_INT >= 23){
if(android.provider.Settings.System.canWrite(context)){
return true;
}
}
return false;
}
}
但问题是,当我在真实的设备测试,甚至我的设备电池电量在50%以上
当我点击按钮,屏幕亮度更改为10,这也意味着这个代码被执行。
Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS, 10);
我不知道为什么它在广播接收器中完美工作,但不能使用按钮单击。
如果有人有解决此问题或遇到同样的问题之前请帮助我,在此先感谢。
答
如果检查documentation for BatteryManager.EXTRA_LEVEL
你会看到它是一个包含当前电池电量
整型字段,从0到EXTRA_SCALE。
EXTRA_SCALE
是另一个值可供你抢,我的假设在这里,和你所面临的问题,是规模大概是1.0,这意味着20%的电池实际上是0.20
要正确地计算电池的百分比,在0 - > 100规模,使用以下
batteryLevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
levelScale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, 0);
double realPercent = (((double)batteryLevel)/levelScale) * 100 ;
编辑
我只是重读你的代码,我并不感到惊讶,你看到0
作为您的onClick方法的报道比例,你写的:
intent = new Intent();
batteryLevel = intent.getIntExtra(...);
在这里,你想从一个意向数据您刚刚创建,而不是实际包含您正在查找的数据的人。
尝试改变你的意图,以实际获得电池电量,然后使用我的上述修复程序来获得适当的百分比。
Intent batteryIntent = registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
我曾尝试你的代码刚才但是如果块已执行 – Dragon957
抱歉耽搁也不会在别的工作,什么都没有,看到我的编辑。您正试图从没有可用数据的意图中获取数据。 –
非常感谢!你的回答真的解决了我的问题。最后一个问题,我是否需要在onDestroy()方法中取消注册接收方? – Dragon957