web-dev-qa-db-ja.com

In Android 7(API level 24)私のアプリは電話をミュートできません(着信音モードをサイレントに設定)

AudioManagerを使用し、このコードで着信音モードをサイレントに設定して電話をミュートするアプリがあります。

AudioManager audioManager = 
    (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
try {
    audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT)
} catch (Exception e) {
    e.printStackTrace();
}

これはAndroid 6で動作しますが、今ではAndroid 7で動作し、次のエラーが表示されます。

System.err: Java.lang.SecurityException: Not allowed to change Do Not Disturb state
System.err: at Android.os.Parcel.readException(Parcel.Java:1683)
System.err: at Android.os.Parcel.readException(Parcel.Java:1636)
System.err: at Android.media.IAudioService$Stub$Proxy.setRingerModeExternal(IAudioService.Java:962)
System.err: at Android.media.AudioManager.setRingerMode(AudioManager.Java:1022)
System.err: at controllers.SearchResultController.mutePhone(SearchResultController.Java:185)

この作業を行うために必要な新しい許可はありますか?

Android許可リストを調べましたが、関連があると思われるものは見つかりませんでした。

38

あなたの答えをありがとう、ここにもう少し詳細があります。

着信音モードをサイレントに設定するには、通知ポリシーへのアクセス許可を要求する必要があります(@ucsunilが言ったように)。

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

次に、この許可があるかどうかを確認します。そうでない場合は、アプリの「アクセスを許可する」の設定を開きます。

NotificationManager notificationManager = 
    (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
    && !notificationManager.isNotificationPolicyAccessGranted()) {

    Intent intent = new Intent(
                        Android.provider.Settings
                        .ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS);

    startActivity(intent);
}

StartActivity()を実行すると、Androidはアプリのアクセス拒否設定を開きます。

私を混乱させたのは、この許可を求める方法が他の許可とはまったく異なるということです。

参考までに、許可READ_CONTACTSを要求する方法は次のとおりです。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
    && ActivityCompat.checkSelfPermission(activity,
        Manifest.permission.READ_CONTACTS)
        == PackageManager.PERMISSION_DENIED) {

    ActivityCompat.requestPermissions(activity,
        new String[]{ Manifest.permission.READ_CONTACTS },
            REQUEST_CODE_READ_CONTACTS);
}
53

あなたが探しているアクセスは:

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

この特定の権限を提供するようにユーザーに要求する必要があります。

9
ucsunil

ACCESS_NOTIFICATION_POLICYは「通常の」許可と見なされます。つまり、実行時に許可を要求する必要はありません。 AndroidManifest.xmlに許可を追加するだけです

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

次に、すべての通知をミュートするには、割り込みフィルターをINTERRUPTION_FILTER_NONEに設定できます

NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            previous_notification_interrupt_setting = notificationManager.getCurrentInterruptionFilter();
            notificationManager.setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_NONE);
        }

INTERRUPTION_FILTER_ALARMS-アラームのみ
INTERRUPTION_FILTER_ALL-通常フィルター
INTERRUPTION_FILTER_NONE-中断なし(MUTE)
INTERRUPTION_FILTER_PRIORITY-優先的な中断

私が使う

 int previous_notification_interrupt_setting = notificationManager.getCurrentInterruptionFilter();

後でonPause()またはonStop()のときにフィルターをリセットする

5
Winston Brown

Androidドキュメンテーションに基づいて、「応答不可」へのアクセスを許可する必要があります。

N以降では、アプリにアクセスを許可する許可が与えられていない限り、着信拒否モードを切り替える着信音モードの調整は許可されません。 isNotificationPolicyAccessGranted()を参照してください。

リンク を確認してください

それが役に立てば幸い!

1
Lucas Santos

この問題は、設定メニューを開き、ユーザーにapi> 23の場合に許可を与えるように依頼することで解決しました。

どこからでもrequestMutePermissions()を呼び出すだけで機能します!

private void requestMutePermissions() {
    try {
        if (Build.VERSION.SDK_INT < 23) {
            AudioManager audioManager = (AudioManager)getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
            audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
        } else if( Build.VERSION.SDK_INT >= 23 ) {
            this.requestForDoNotDisturbPermissionOrSetDoNotDisturbForApi23AndUp();
        }
    } catch ( SecurityException e ) {

    }
}

private void requestForDoNotDisturbPermissionOrSetDoNotDisturbForApi23AndUp() {

    NotificationManager notificationManager = (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
    // if user granted access else ask for permission
    if ( notificationManager.isNotificationPolicyAccessGranted()) {
        AudioManager audioManager = (AudioManager) getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
        audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
    } else{
        // Open Setting screen to ask for permisssion
        Intent intent = new Intent(Android.provider.Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS);
        startActivityForResult( intent, ON_DO_NOT_DISTURB_CALLBACK_CODE );
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // Check which request we're responding to
    if (requestCode == ON_DO_NOT_DISTURB_CALLBACK_CODE ) {
        this.requestForDoNotDisturbPermissionOrSetDoNotDisturbForApi23AndUp();
    }
}
1
Waqar UlHaq