关于华为EMUI4.0忽略电池优化失败的问题

android6.0引入了doze机制。忽略电池优化就相当于将应用加入了doze白名单。
通过下面的代码,调用系统的dialog,让用户做出选择。

Intent intent = new Intent();
intent.setAction(android.provider.Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("package:" + packageName));
startActivity(intent);

但是,在华为EMUI4.0(android6.0)的手机上,会报ActivityNotFound异常,之前因为未加异常捕获,导致部分华为手机直接崩溃。导致问题的原因,估计是华为EMUI4.0修改了或者误改了电池优化的ACTION。
我找到了EMUI4.0和EMUI4.0的手机各一台(都是android6.0),发现设置-应用管理-高级-忽略电池优化页面都是有的,但是EMUI4.0无法通过设置action:ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS呼出dialog,也无法通过ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS打开对应设置页面。
对于这种情况,一般解决方法是,通过提示,让用户手动进入设置页面设置。
另外,我还测试了另外一种直接进入忽略电池优化页面的方法,思路是,通过包名打开设置,在通过指定component,进入相应页面,经测试,可行。但是,需要两个参数:1,“设置”的包名;2,忽略电池优化页面的类名。
查找设置的包名和对应页面的类名,有很多方法,我知道两种:1,adb shell dumpsys activity | grep “mFoc”; 2,打开一个页面时,查看logcat,从里面查找。我查到的包名是“com.android.settings”,类名是“com.android.com.settings.Settings@HighPowerApplicationsActivity”
然后,通过下面的代码,成功打开忽略电池优化页面:

 Intent intent = new Intent(Intent.ACTION_MAIN);  
 intent.addCategory(Intent.CATEGORY_LAUNCHER);  

 // 设置ComponentName参数1:packagename参数2:Activity路径  
 ComponentName cn = new ComponentName(packageName, className);  

 intent.setComponent(cn);  
 startActivity(intent);  

——————–9月12日补充——————-
昨个突然想到,既然忽略电池优化的dialog是通过Intent呼出的,那么这个dialog应该是一个activity,但外观看起来是dialog。所以今天,找到上面测试的手机,打开忽略电池优化的dialog,通过adb查看发现,果然,就是一个activity。activity全名是:com.android.settings/.fuelgauge.RequestIgnoreBatteryOptimizations。通过设置componentName,应该可以打开,只是,需要忽略的应用的包名, 需要作为参数传递过去,像这样,intent.setData(Uri.parse(“package:” + packageName));因为时间问题,这一步没有验证,有空验证一下。

———-2017/02/21补充———-
阿里巴巴的云os没有忽略电池优化这项设置,同样会遇到这个问题。执行到startActivity方法,会抛出ActivityNotFoundException,可以添加异常捕获,也可以通过代码判断当前是否是阿里云os,跳过异常代码。判断系统是否是云os,参考:http://blog.csdn.net/u010209842/article/details/53743895。

你可能感兴趣的:(android)