自动静音android N及更高版本

时间:2018-05-14 04:21:24

标签: java android android-permissions android-7.0-nougat silent-notification

我正在构建一个Android应用程序,我需要将用户的手机置于静音模式。我正在使用不同的方法,它很好地工作到Android M(等级23)。 现在我们都知道android已经在Android N及更高版本中更新了自动静音模式的策略,并且需要Do Not Disturb Access的特殊许可才能将手机置于静音模式。我也为Android N和后来的OS版本做了同样的事情。但它还没有在Android N和Later上工作。当我做这一切时,它并没有给我任何错误,但仍然无法正常工作。我附上下面的代码片段看看,并试图找出问题。谢谢伙计们。

代码片段,我给予请勿打扰访问应用

public void onRingerPermissionsClicked(View view) {
    Intent intent = null;
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
        intent = new Intent(android.provider.Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS);
    }
    startActivity(intent);
}

Do Not Disturb Access Screenshot

将手机置于无声的方法

setRingerMode(context, AudioManager.RINGER_MODE_SILENT);

方法setRingerMode()

private void setRingerMode(Context context, int mode) {
    NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    // Check for DND permissions for API 24+
    if (android.os.Build.VERSION.SDK_INT < 24 ||
            (android.os.Build.VERSION.SDK_INT >= 24 && !nm.isNotificationPolicyAccessGranted())) {
        AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
        audioManager.setRingerMode(mode);
    }
}

1 个答案:

答案 0 :(得分:1)

您的方式仅适用于API&lt; 23,在API 23之后,您需要使用通知管理器将手机置于“免打扰模式”,以下是您可以执行此操作的方法。

NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        mNotificationManager.setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_NONE);

您是否在清单文件中添加了通知政策的权限?如果没有,那就加上这个,

<uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY" />

您需要打开单独的Dialog才能获得DND模式权限,您可以通过以下方式执行此操作,

//检查是否已为该应用授予通知政策访问权限。

NotificationManager mNotificationManager = (NotificationManager) getActivity().getSystemService(Context.NOTIFICATION_SERVICE);
if (!mNotificationManager.isNotificationPolicyAccessGranted()) {
     Intent intent = new Intent(android.provider.Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS);
     startActivity(intent);
 }