如何检查我的应用程序是否允许显示通知
How to check if my app is allowed to show notification
在 Android 设置中,用户可以关闭通知(如果他们不想的话)。那么有没有像 isNotificationAllowed()
这样的方法来检查我的应用程序是否允许显示通知?以及如何打开 android 设置页面来引导我的用户打开通知?
试试这个:
Is there a way an app can check if it is allowed to access notifications?
这里还有更多解释:
Check for access to notifications using NotificationListenerService
试试这个:
if (Settings.Secure.getString(getActivity().getContentResolver(), "enabled_notification_listeners").contains(getActivity().getPackageName())) {
// Notification access service already enabled
Toast.makeText(getActivity(),"notification enabled",Toast.LENGTH_LONG).show();
} else {
Intent intent = new Intent();
intent.setClassName("com.android.settings", "com.android.settings.Settings$AppNotificationSettingsActivity");
intent.putExtra("app_package", getPackageName());
intent.putExtra("app_uid", getApplicationInfo().uid);
startActivity(intent);
}
编辑 - 新答案:
似乎 google 添加了正确的 API 调用:
NotificationManagerCompat.from(context).areNotificationsEnabled()
旧答案:
对于正在查看此问题的任何人,请注意 NotificationListenerService 不同于 "Show Notification"。 这两个是不同的东西!如果应用程序有权访问 NotificationListenerService
并不意味着它的通知会显示,反之亦然。为了检查用户是否阻止了来自您应用的通知,您可以使用反射:
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() {
AppOpsManager mAppOps = (AppOpsManager) GlobalContext.getContext().getSystemService(Context.APP_OPS_SERVICE);
ApplicationInfo appInfo = GlobalContext.getContext().getApplicationInfo();
String pkg = GlobalContext.getContext().getApplicationContext().getPackageName();
int uid = appInfo.uid;
Class appOpsClass = null; /* Context.APP_OPS_MANAGER */
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 = (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();
}
return false;
}
}
NotificationManagerCompat.from(context).areNotificationsEnabled()
似乎是一个可行的方法。
if(NotificationManagerCompat.from(context).areNotificationsEnabled())
{
//Do your Work
}
else
{
//Ask for permission
}
这里是这个问题的更完整的答案
fun areNotificationsEnabled(context: Context, channelId: String = "fcm_fallback_notification_channel"): Boolean {
// check if global notification switch is ON or OFF
if (NotificationManagerCompat.from(context).areNotificationsEnabled())
// if its ON then we need to check for individual channels in OREO
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val manager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
val channel = manager.getNotificationChannel(channelId)
return channel?.importance != NotificationManager.IMPORTANCE_NONE
} else {
// if this less then OREO it means that notifications are enabled
true
}
// if this is less then OREO it means that notifications are disabled
return false
}
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Main Code Below-
//NotificationManagerCompat.from(context).areNotificationsEnabled()
if(NotificationManagerCompat.from(this).areNotificationsEnabled())
{
Toast.makeText(this, "Notification is on for this Application", Toast.LENGTH_SHORT).show();
}
else
{
Toast.makeText(this, "Notification is off for this Application", Toast.LENGTH_SHORT).show();
}
}
}
在 Android 设置中,用户可以关闭通知(如果他们不想的话)。那么有没有像 isNotificationAllowed()
这样的方法来检查我的应用程序是否允许显示通知?以及如何打开 android 设置页面来引导我的用户打开通知?
试试这个:
Is there a way an app can check if it is allowed to access notifications?
这里还有更多解释:
Check for access to notifications using NotificationListenerService
试试这个:
if (Settings.Secure.getString(getActivity().getContentResolver(), "enabled_notification_listeners").contains(getActivity().getPackageName())) {
// Notification access service already enabled
Toast.makeText(getActivity(),"notification enabled",Toast.LENGTH_LONG).show();
} else {
Intent intent = new Intent();
intent.setClassName("com.android.settings", "com.android.settings.Settings$AppNotificationSettingsActivity");
intent.putExtra("app_package", getPackageName());
intent.putExtra("app_uid", getApplicationInfo().uid);
startActivity(intent);
}
编辑 - 新答案:
似乎 google 添加了正确的 API 调用:
NotificationManagerCompat.from(context).areNotificationsEnabled()
旧答案:
对于正在查看此问题的任何人,请注意 NotificationListenerService 不同于 "Show Notification"。 这两个是不同的东西!如果应用程序有权访问 NotificationListenerService
并不意味着它的通知会显示,反之亦然。为了检查用户是否阻止了来自您应用的通知,您可以使用反射:
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() {
AppOpsManager mAppOps = (AppOpsManager) GlobalContext.getContext().getSystemService(Context.APP_OPS_SERVICE);
ApplicationInfo appInfo = GlobalContext.getContext().getApplicationInfo();
String pkg = GlobalContext.getContext().getApplicationContext().getPackageName();
int uid = appInfo.uid;
Class appOpsClass = null; /* Context.APP_OPS_MANAGER */
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 = (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();
}
return false;
}
}
NotificationManagerCompat.from(context).areNotificationsEnabled()
似乎是一个可行的方法。
if(NotificationManagerCompat.from(context).areNotificationsEnabled())
{
//Do your Work
}
else
{
//Ask for permission
}
这里是这个问题的更完整的答案
fun areNotificationsEnabled(context: Context, channelId: String = "fcm_fallback_notification_channel"): Boolean {
// check if global notification switch is ON or OFF
if (NotificationManagerCompat.from(context).areNotificationsEnabled())
// if its ON then we need to check for individual channels in OREO
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val manager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
val channel = manager.getNotificationChannel(channelId)
return channel?.importance != NotificationManager.IMPORTANCE_NONE
} else {
// if this less then OREO it means that notifications are enabled
true
}
// if this is less then OREO it means that notifications are disabled
return false
}
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Main Code Below-
//NotificationManagerCompat.from(context).areNotificationsEnabled()
if(NotificationManagerCompat.from(this).areNotificationsEnabled())
{
Toast.makeText(this, "Notification is on for this Application", Toast.LENGTH_SHORT).show();
}
else
{
Toast.makeText(this, "Notification is off for this Application", Toast.LENGTH_SHORT).show();
}
}
}