2016-12-23 181 views
0

我想設置的鈴聲爲靜音,使用以下權限需要NotificationManager

AudioManager myAudioMgr = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 
NotificationManager myNOtificationMgr = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 

myAudioMgr.setRingerMode(AudioManager.RINGER_MODE_SILENT); 
myNOtificationMgr.setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_PRIORITY); 

只有我不斷收到安全錯誤

java.lang中不要打擾到優先級。 RuntimeException:無法啓動接收器MyBroadcastReceiver:java.lang.SecurityException:通知策略訪問被拒絕

我已經添加了Access通知我的清單文件的政策許可

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

我是否缺少額外的權限?

+2

什麼版本的Android?我知道在最近的版本中,您需要通過對話框請求權限才能使用。 Manifest權限僅用於舊設備,因此他們可以在市場上顯示權限使用情況。 –

+0

最小和目標API是23 – jradich1234

+0

看看這個:https://developer.android.com/training/permissions/requesting.html –

回答

1

好像用戶需要明確地授予通過設置屏幕到App,以使應用程序來操作的優先級/通過通知API無聲的權限。我假設你正在使用notificationManager類。一些鏈接,可以幫助你:

https://developer.android.com/reference/android/provider/Settings.html#ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS

https://developer.android.com/reference/android/app/NotificationManager.html#ACTION_NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED

我覺得本質上,你需要做的是將用戶引導到「顯示請勿打擾訪問設置」,讓他啓用選項通知管理(有什麼什麼,你會爲模擬位置例如做類似)

示例代碼:

startActivityForResult(new Intent(android.settings.NOTIFICATION_POLICY_ACCESS_SETTINGS), 0); 

希望這會有所幫助。

+0

確切的問題!感謝您的幫助! – jradich1234

-1

你需要做的是這樣

public class SomeFragment extends FragmentCompat { 
    @Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

     int permissionNotifications = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission. ACCESS_NOTIFICATION_POLICY); 

     if (permissionNotifications != PackageManager.PERMISSION_GRANTED) { 
      ActivityCompat.requestPermissions(
        getActivity(), 
        new String[] { Manifest.permission.ACCESS_NOTIFICATION_POLICY }, 
        PERMISSION_REQUEST 
      ); 
     } 
    } 
} 

記住我不能運行該代碼,因此它可能需要一些薄層色譜法,但它是一個開始

+0

ACCESS_NOTIFICATION_POLICY不是危險的許可... – Selvin

+1

錯誤的答案... – user2511882

+0

@ user2511882我同意顯式請求權限不是必需的。當我檢查ACCESS_NOTIFICATION_POLICY的ContextCompat.checkSelfPermission時,我得到了PackageManager.PERMISSION_GRANTED。 – jradich1234

0

從Android開發者:

通過向用戶發送匹配 系統意向操作ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS的活動請求策略訪問。

使用ACTION_NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED來監聽 用戶授予或拒絕此訪問。

因此,要獲得許可,您應該通過發送用戶相匹配的系統意圖動作ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS活動請求策略的訪問和監聽使用廣播接收器與行動ACTION_NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED響應。

而且看一看從NotificationManager方法isNotificationPolicyAccessGranted(),以檢查是否同意授予。

0

要更正java.lang.SecurityException: Access denied to process: 3454錯誤,必須將android.permission.SET_WALLPAPER權限添加到Android清單。

添加下面一行在你AndroidManifest.xml

uses-permission android:name="android.permission.SET_WALLPAPER"