Android 啟動前臺服務(wù),華為薪鹦、小米掌敬、三星、OPPO池磁、VIVO的配合程度接 這是前文鏈接奔害,我先甩在這里,上篇文章主要分析了幾種品牌手機關(guān)于通知的配合程度框仔,這篇文章先寫第一期的解決方案舀武,畢竟需求還是要跟版發(fā)布的~
因為測試的「華為 6.0」「華為 4.4.2」「小米6」「紅米note 4X 6.0」「小米5.1.1」「三星手機 5.0.1」這幾種機型可以正常開啟前臺服務(wù),「vivo X9Plus 」「vivo X9 」「OPPO A59s」「OPPO R9s」不能開啟前臺服務(wù)离斩,所以第一期先對 vivo 與 OPPO 做一個特殊的處理银舱。
在 App 啟動之后的適當時機,用下面這段代碼
邏輯:判斷是否是 vivo or OPPO 手機跛梗,如果是寻馏,再判斷通知是否可用,如果不可用再彈出提示框引導(dǎo)用戶進入設(shè)置界面核偿。
if (Build.MANUFACTURER.equals("vivo") || Build.MANUFACTURER.equals("OPPO")){
if (!NotificationUtils.isNotificationEnabled(this)){
//未獲得通知權(quán)限诚欠,此時把用戶引向系統(tǒng)的設(shè)置界面,使用戶手動打開通知權(quán)限
//代碼不上了漾岳,總之在這里談提示框讓用戶打開設(shè)置界面就好了~
}
}
檢測通知是否可用的方法:
@SuppressLint("NewApi")
public static boolean isNotificationEnabled(Context context) {
AppOpsManager appOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
ApplicationInfo applicationInfo = context.getApplicationInfo();
String pkg = context.getApplicationContext().getPackageName();
int uid = applicationInfo.uid;
Class appOpsClass;
try {
appOpsClass = Class.forName(AppOpsManager.class.getName());
Method checkOpNoThrowMethod = appOpsClass.getMethod("checkOpNoThrow", Integer.TYPE, Integer.TYPE, String.class);
Field opPostNotificationValue = appOpsClass.getDeclaredField("OP_POST_NOTIFICATION");
int value = (Integer) opPostNotificationValue.get(Integer.class);
return ((Integer) checkOpNoThrowMethod.invoke(appOpsManager, value, uid, pkg) == AppOpsManager.MODE_ALLOWED);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return false;
}
開啟通知服務(wù)的代碼:
/**
* 未發(fā)現(xiàn)不能執(zhí)行「開啟通知」操作的機型
* 能夠進入「設(shè)置」頁面的機型有:vivo X9 6.0系統(tǒng) / vivo X9Plus 6.0系統(tǒng) / OPPO R9s 6.0系統(tǒng) / 華為ATH-TL00 6.0系統(tǒng)
*/
public static void toSettingPage(Context context){
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if(Build.VERSION.SDK_INT >= 9){
intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
intent.setData(Uri.fromParts("package", context.getPackageName(), null));
} else if(Build.VERSION.SDK_INT <= 8){
intent.setAction(Intent.ACTION_VIEW);
intent.setClassName("com.android.settings","com.android.settings.InstalledAppDetails");
intent.putExtra("com.android.settings.ApplicationPkgName", context.getPackageName());
}
context.startActivity(intent);
}
第一期先這樣處理轰绵,然后繼續(xù)調(diào)研~