87

Android M Preview 3 でターゲット API を 23 にすると、Manifest.permission.WRITE_SETTTINGS パーミッションが取得できないようです。

requestPermissions(new String[]{Manifest.permission.WRITE_SETTINGS}, 101);

パーミッションをリクエストしても期待するダイアログは表示されませんが、このパーミッションなしで次の呼び出しを行うと、

 RingtoneManager.setActualDefaultRingtoneUri(activity, RingtoneManager.TYPE_RINGTONE, ringUri);

許可がないため、呼び出しは除外されます。

ここからどこへ行けばいいのかわからない。23 の新しい着信音 API はありますか? それとも、この許可の変更により、システム以外のアプリが着信音を変更できなくなっただけですか?

4

9 に答える 9

46

CommonsWare からの回答と Ogix からのコメントに加えて、いくつかのダミー コードを次に示します。

private boolean checkSystemWritePermission() {
    boolean retVal = true;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        retVal = Settings.System.canWrite(this);
        Log.d(TAG, "Can Write Settings: " + retVal);
        if(retVal){
            Toast.makeText(this, "Write allowed :-)", Toast.LENGTH_LONG).show();
        }else{
            Toast.makeText(this, "Write not allowed :-(", Toast.LENGTH_LONG).show();
            FragmentManager fm = getFragmentManager();
            PopupWritePermission dialogFragment = new PopupWritePermission();
            dialogFragment.show(fm, getString(R.string.popup_writesettings_title));
        }
    }
    return retVal;
}

Fragment PopupwritePermission は、状況を説明するウィンドウを提供します。[OK] ボタンをクリックすると、アクセス許可を付与できる Android システム メニューが開きます。

private void openAndroidPermissionsMenu() {
    Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
    intent.setData(Uri.parse("package:" + getActivity().getPackageName()));
    startActivity(intent);
}
于 2016-04-02T10:40:14.687 に答える
5

パーミッションandroid.permission.WRITE_SETTINGSは現在、次のsignature|appop|pre23|preinstalledようなグループにandroid.permission.CHANGE_NETWORK_STATEありますandroid.permission.SYSTEM_ALERT_WINDOW

これは、sdk 22 以下で取得できることを意味します。新しいバージョンでは、アプリのオペレーターである必要があります。

于 2015-09-11T15:00:36.723 に答える