web-dev-qa-db-ja.com

アプリの許可設定を開く

Android M.

ユーザーが許可のリクエストを2回拒否した場合、

または、ユーザーが「二度と尋ねない」とマークすること。

アプリのアクセス許可設定に直接開く/リンクするにはどうすればよいですか?

29
David

AndroidManifest.xmlに次のものがあると仮定しましょう。

<uses-permission Android:name="Android.permission.WRITE_CALENDAR"/>
<uses-permission Android:name="Android.permission.WRITE_CONTACTS"/>
<!-- ETC. -->

次に、以下のサンプルアクティビティのように、既存の/許可された権限を確認し、権限がない場合はユーザーをアプリの設定に送信します。

package com.example.permissions.myapplication;

import Android.Manifest;
import Android.content.Intent;
import Android.content.pm.PackageManager;
import Android.net.Uri;
import Android.os.Build;
import Android.os.Bundle;
import Android.provider.Settings;
import Android.support.annotation.NonNull;
import Android.support.v7.app.AppCompatActivity;
import Android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private static final int REQUEST_APP_SETTINGS = 168;

    private static final String[] requiredPermissions = new String[]{
            Manifest.permission.WRITE_CALENDAR,
            Manifest.permission.WRITE_CONTACTS
            /* ETC.. */
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        /* All version with SDK_INT < 22 grant permissions on install time. */
        if (Build.VERSION.SDK_INT > 22 && !hasPermissions(requiredPermissions)) {
            Toast.makeText(this, "Please grant all permissions", Toast.LENGTH_LONG).show();
            goToSettings();
        }
    }

    private void goToSettings() {
        Intent myAppSettings = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + getPackageName()));
        myAppSettings.addCategory(Intent.CATEGORY_DEFAULT);
        myAppSettings.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivityForResult(myAppSettings, REQUEST_APP_SETTINGS);
    }

    public boolean hasPermissions(@NonNull String... permissions) {
        for (String permission : permissions)
            if (PackageManager.PERMISSION_GRANTED != checkSelfPermission(permission))
                return false;
        return true;
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_APP_SETTINGS) {
            if (hasPermissions(requiredPermissions)) {
                Toast.makeText(this, "All permissions granted!", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(this, "Permissions not granted.", Toast.LENGTH_LONG).show();
            }
        }
        super.onActivityResult(requestCode, resultCode, data);
    }
}

Nexus 6/AndroidOS 6(Marshmallow)で試しました。

23
Andrei Marcut

このコードを使用して、アプリのアクセス許可設定ページを起動します

Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
            Uri.parse("package:" + getPackageName()));
    intent.addCategory(Intent.CATEGORY_DEFAULT);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
6
Deena Nath