2017-02-12 111 views
3

我是一个新用户,它是我的第一篇文章,如果我做了任何错误,请随时告诉我,谢谢。安卓电池电量检测问题

我正在开发一个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); 

我不知道为什么它在广播接收器中完美工作,但不能使用按钮单击。

如果有人有解决此问题或遇到同样的问题之前请帮助我,在此先感谢。

回答

1

如果检查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)); 
+0

我曾尝试你的代码刚才但是如果块已执行 – Dragon957

+0

抱歉耽搁也不会在别的工作,什么都没有,看到我的编辑。您正试图从没有可用数据的意图中获取数据。 –

+0

非常感谢!你的回答真的解决了我的问题。最后一个问题,我是否需要在onDestroy()方法中取消注册接收方? – Dragon957