Androidはアプリケーション通知欄の権限を取得し、通知設定ページをジャンプします(全バージョン対応)
23886 ワード
前言
現在、一般的なアプリケーションはプッシュ機能を統合し、ユーザーに関連するメッセージをプッシュする必要があります.これはアプリケーションがアプリケーション通知欄権限を取得する必要がありますが、現在、国内のほとんどのメーカーはデフォルトで通知欄権限を開かないので、必要に応じて、まず通知欄権限を開くかどうかを検出し、開かない場合は、ユーザーに通知欄権限を設定するように誘導します.
通知バーを開くかどうかの権限の取得
比較しないで、直接コードをつけます:
では4.4以下のバージョンは反射で取得できますか?答えは否定的!Android 4.1:How to check notifications are disabled for the application?
回答では、12年のIO大会で質問がありましたが、プロジェクト担当者はできないと言っていました!
もう一つは、16年に編集され、v 4パックに入ったという答えです.
通知バー権限をオンにするかどうかを判断できます.
親測では、
ジャンプ通知設定ページ
よし、終わりだ!
参考記事:https://www.jianshu.com/p/2d0a9d5559fc https://www.jianshu.com/p/757476ca3d67
現在、一般的なアプリケーションはプッシュ機能を統合し、ユーザーに関連するメッセージをプッシュする必要があります.これはアプリケーションがアプリケーション通知欄権限を取得する必要がありますが、現在、国内のほとんどのメーカーはデフォルトで通知欄権限を開かないので、必要に応じて、まず通知欄権限を開くかどうかを検出し、開かない場合は、ユーザーに通知欄権限を設定するように誘導します.
通知バーを開くかどうかの権限の取得
比較しないで、直接コードをつけます:
public class NotificationUtil {
private static final String CHECK_OP_NO_THROW = "checkOpNoThrow";
private static final String OP_POST_NOTIFICATION = "OP_POST_NOTIFICATION";
//
public static boolean isNotifyEnabled(Context context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
return isEnableV26(context);
} else {
return isEnabledV19(context);
}
}
/**
* 8.0
*
* @param context api19 4.4
* @return
*/
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
private static boolean isEnabledV19(Context context) {
AppOpsManager mAppOps =
(AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
ApplicationInfo appInfo = context.getApplicationInfo();
String pkg = context.getApplicationContext().getPackageName();
int uid = appInfo.uid;
Class appOpsClass = null;
try {
appOpsClass = Class.forName(AppOpsManager.class.getName());
Method checkOpNoThrowMethod =
appOpsClass.getMethod(CHECK_OP_NO_THROW,
Integer.TYPE, Integer.TYPE, String.class);
Field opPostNotificationValue = appOpsClass.getDeclaredField(OP_POST_NOTIFICATION);
int value = (Integer) opPostNotificationValue.get(Integer.class);
return ((Integer) checkOpNoThrowMethod.invoke(mAppOps, value, uid, pkg) ==
AppOpsManager.MODE_ALLOWED);
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
/**
* 8.0
*
* @param context
* @return
*/
private static boolean isEnableV26(Context context) {
ApplicationInfo appInfo = context.getApplicationInfo();
String pkg = context.getApplicationContext().getPackageName();
int uid = appInfo.uid;
try {
NotificationManager notificationManager = (NotificationManager)
context.getSystemService(Context.NOTIFICATION_SERVICE);
Method sServiceField = notificationManager.getClass().getDeclaredMethod("getService");
sServiceField.setAccessible(true);
Object sService = sServiceField.invoke(notificationManager);
Method method = sService.getClass().getDeclaredMethod("areNotificationsEnabledForPackage"
, String.class, Integer.TYPE);
method.setAccessible(true);
return (boolean) method.invoke(sService, pkg, uid);
} catch (Exception e) {
return true;
}
}
}
では4.4以下のバージョンは反射で取得できますか?答えは否定的!Android 4.1:How to check notifications are disabled for the application?
回答では、12年のIO大会で質問がありましたが、プロジェクト担当者はできないと言っていました!
もう一つは、16年に編集され、v 4パックに入ったという答えです.
NotificationManagerCompat.from(this).areNotificationsEnabled();
通知バー権限をオンにするかどうかを判断できます.
親測では、
support v4:28.0.0
を使用してこのapiを使用すると、通知欄を開くかどうかを全バージョンで判断できます.ジャンプ通知設定ページ
Intent localIntent = new Intent();
// :
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {//8.0
localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
localIntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
localIntent.setData(Uri.fromParts("package", getPackageName(), null));
} else if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//5.0 8.0
localIntent.setAction("android.settings.APP_NOTIFICATION_SETTINGS");
localIntent.putExtra("app_package", getPackageName());
localIntent.putExtra("app_uid", getApplicationInfo().uid);
} else if (android.os.Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT) {//4.4
localIntent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
localIntent.addCategory(Intent.CATEGORY_DEFAULT);
localIntent.setData(Uri.parse("package:" + getPackageName()));
} else {
//4.4 app Action, ,
localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (Build.VERSION.SDK_INT >= 9) {
localIntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
localIntent.setData(Uri.fromParts("package", getPackageName(), null));
} else if (Build.VERSION.SDK_INT <= 8) {
localIntent.setAction(Intent.ACTION_VIEW);
localIntent.setClassName("com.android.settings", "com.android.setting.InstalledAppDetails");
localIntent.putExtra("com.android.settings.ApplicationPkgName", getPackageName());
}
}
startActivity(localIntent);
よし、終わりだ!
参考記事:https://www.jianshu.com/p/2d0a9d5559fc https://www.jianshu.com/p/757476ca3d67