栏权限是否开启,以及如何ios 跳转到权限设置应用程序设置界面

Android 判断通知栏是否打开及前往设置页面
今天做项目用到通知,发现在oppo和360手机上,如果不去手动打开状态栏可以获取通知的设置,就算发送通知也看不到消息,但是小米手机就没事,有人说获取手机型号进行适配,但是安卓手机机型太多,那样做是在是头疼,后来有人说可以判断通知栏是否打开,这个方法不错,避免了要去判断所有的机型。看到别人写的方法,很是受用。
尊重原创,转载自博客
项目中用到日程提醒功能,如果应用的通知栏没有打开,则需要提示用户前去打开通知栏
判断通知栏是否打开代码如下:
private boolean isNotificationEnabled(Context context) {
String CHECK_OP_NO_THROW = "checkOpNoThrow";
String OP_POST_NOTIFICATION = "OP_POST_NOTIFICATION";
AppOpsManager mAppOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
ApplicationInfo appInfo = context.getApplicationInfo();
String pkg = context.getApplicationContext().getPackageName();
int uid = appInfo.
Class appOpsClass = null;
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 (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;
返回值为true时,通知栏打开,false未打开。
以下代码为前往设置页面:
private void goToSet(){
if (Build.VERSION.SDK_INT &= Build.VERSION_CODES.BASE) {
Intent intent = new Intent(Settings.ACTION_SETTINGS);
startActivity(intent);
} else if (Build.VERSION.SDK_INT &= Build.VERSION_CODES.LOLLIPOP) {
Intent intent = new Intent(Settings.ACTION_SETTINGS);
startActivity(intent);
* 同时附上写的测试可行的demo*
没有更多推荐了,android应用获取通知栏权限
android应用获取手机是否有通知栏的权限:
package com.jibo.health.
import android.app.AppOpsM
import android.content.C
import android.content.pm.ApplicationI
import java.lang.reflect.F
import java.lang.reflect.InvocationTargetE
import java.lang.reflect.M
public class NotificationsUtils {
private static final String CHECK_OP_NO_THROW = "checkOpNoThrow";
private static final String OP_POST_NOTIFICATION = "OP_POST_NOTIFICATION";
public static boolean isNotificationEnabled(Context context) {
AppOpsManager mAppOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
ApplicationInfo appInfo = context.getApplicationInfo();
String pkg = context.getApplicationContext().getPackageName();
int uid = appInfo.
Class appOpsClass =
/* Context.APP_OPS_MANAGER */
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 = (int) opPostNotificationValue.get(Integer.class);
(int) checkOpNoThrowMethod.invoke(mAppOps, 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();
没有更多推荐了,Android应用获取通知栏权限是否开启--以及跳转到系统设置界面--解决方案
因为项目用到推送功能,所以需求是知道用户是否开启了通知栏的权限,并且提供滑动按钮进行跳转以便用户进行关闭或者开启。
1.获取通知栏权限是否开启:
* 获取通知栏权限是否开启
public class NotificationsUtils {
private static final String CHECK_OP_NO_THROW = "checkOpNoThrow";
private static final String OP_POST_NOTIFICATION = "OP_POST_NOTIFICATION";
@SuppressLint("NewApi")
public static boolean isNotificationEnabled(Context context) {
AppOpsManager mAppOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
ApplicationInfo appInfo = context.getApplicationInfo();
String pkg = context.getApplicationContext().getPackageName();
int uid = appInfo.
Class appOpsClass = null;
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 (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;
1234567891011121314151617181920212223242526272829303132333435363738394041424312345678910111213141516171819202122232425262728293031323334353637383940414243
2.进入系统设置界面
第一种方法protected void requestPermission(int requestCode) {
Intent intent = new Intent(Settings.ACTION_SETTINGS);
startActivity(intent);
第二种方法以下代码可以跳转到应用详情,可以通过应用详情跳转到权限界面(6.0系统测试可用)
private void getAppDetailSettingIntent(Context context) {
Intent localIntent = new Intent();
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.settings.InstalledAppDetails");
localIntent.putExtra("com.android.settings.ApplicationPkgName", getPackageName());
startActivity(localIntent);
1234567812345678
这个功能不是特别重要,但是有时候确实有这样的需求。
没有更多推荐了,一名准Android程序员的博客
Android 判断通知栏权限的问题
在Android中,我们可以在设置中关闭某个应用的通知栏权限(Notification Permission)
在关闭通知栏权限后,应用将无法弹出toast以及Notification通知栏
判断应用的通知栏权限是否关闭的代码如下:
public class NotificationsUtils {
private static final String CHECK_OP_NO_THROW = "checkOpNoThrow";
private static final String OP_POST_NOTIFICATION = "OP_POST_NOTIFICATION";
public static boolean isNotificationEnabled(Context context) {
AppOpsManager mAppOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
ApplicationInfo appInfo = context.getApplicationInfo();
String pkg = context.getApplicationContext().getPackageName();
int uid = appInfo.
Class appOpsClass = /* Context.APP_OPS_MANAGER */
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 = (int)opPostNotificationValue.get(Integer.class);
return ((int)checkOpNoThrowMethod.invoke(mAppOps,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();
此方法可以成功获取当前应用是否具有通知栏权限,但是存在一个兼容问题:
在Android 4.4(API19)以下是没有AppOpsManager这个类的(见第8行),因此此方法在Android 4.4以下运行会导致应用crash
那么,我们该如何在Android 4.4以下获取应用通知栏权限呢?
很遗憾,答案是不能,详情可以参考stackoverflow:
另外,除了使用上述的反射方法来获取通知栏权限外,我们也可以使用support包提供的方法(也是官方推荐的方法,不过需要比较新的support.v4包):
NotificationManagerCompat.from(this).areNotificationsEnabled();
值得一提的是,由于在API 19以下的版本无法获得通知栏权限,该方法默认会返回true
没有更多推荐了,在这里记录我在常规开发维护过程中中遇到的BUG和解决方法
Android 应用权限管理默认开关的修改方法
修改系统属性:persist.sys.strict_op_enable
开启应用权限管理:true
关闭应用权限管理:false
说明:因为对源码不熟,此部分控制很简单,却走了不少弯路,记之,为大家节省些时间。
相关源码位置:
frameworks/base/services/java/com/android/server/AppOpsService.java
相关代码片段:
public AppOpsService(File storagePath) {
mStrictEnable = "true".equals(SystemProperties.get(STRICT_PERMISSION_PROPERTY));
private boolean isStrict(int code, int uid, String packageName) {
if (!mStrictEnable)
return ((uid & Process.FIRST_APPLICATION_UID) &&
(AppOpsManager.opStrict(code)) && !isInWhitelist(packageName));
没有更多推荐了,}

我要回帖

更多关于 ios 跳转到权限设置 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信