トップAndroid Java > Android Java: 権限許可ダイアログの出し方

Android Java: 権限許可ダイアログの出し方

はじめに

アプリに与える権限は Manifestファイルに記述することは必須であるが、 スマホ実機については設定で与えると、コード上は多少はしょることができる。

Windowsプログラムに比べて、Androidプログラムは初期化関連の記述が色々面倒なため、 記述を簡略化していた。

アプリに設定で与えていた権限はアップデートなど何かのタイミングで変わってしまうことがある。 初期化関連の記述を簡略化していると、原因究明に時間がかかってしまう。

したがって、実機の設定で必要な権限を与えていた場合、実行されることはないが、 そうでないときに権限許可ダイアログが表示されるようにしておくべきである。

外部ファイル書き込み権限

元のプログラム

これまでのプログラムを下に示す。

実機において、ファイルとメディアの権限を「すべてのファイルの管理を許可」とした場合には問題なく動作する。 「許可しない」とした場合には、デバイス内の写真やメディアへのアクセスを「MapX」に許可しますか、 というダイアログが表示される。 「許可」した場合、「メディアへのアクセスのみを許可」となり、書き込み等は許可されていない。

ネット記事を真似たと思われるが、

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
  ...
}
が必要なのではないか。ここに適切なコードがないと、書き込みは許可されないのであろう。

しかし、これも今は非推奨になっている。 次から次へと非推奨になるので、Toastで "設定で、すべてのファイル管理を許可してください" とでもした方が無難であろう。

public class MainActivity extends AppCompatActivity implements SensorEventListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

	// 中略

        // ファイルの権限チェック
        verifyStoragePermissions(this);

	// 後略
    }

    private static final String[] mPermissions = {
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE };

    private static void verifyStoragePermissions(Activity activity) {
        int readPermission = ContextCompat.checkSelfPermission(activity, mPermissions[0]);
        int writePermission = ContextCompat.checkSelfPermission(activity, mPermissions[1]);
        if (writePermission != PackageManager.PERMISSION_GRANTED ||
                readPermission != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(activity, mPermissions, REQUEST_EXTERNAL_STORAGE_CODE);
        }
    }

}

修正プログラム1

少なくとも当面はダイアログ表示はやめ、Toast表示とした。設定で権限を与えて、再起動する。 通常は、何も表示されず、起動する。

チェックは MANAGE_EXTERNAL_STORAGE だけでもいいかもしれない。

設定で「すべてのファイル管理を許可」していても、トーストが表示される。また、Android 9 には対応していない。

    private static final String[] mPermissions = {
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.MANAGE_EXTERNAL_STORAGE,
    };

    private static void verifyStoragePermissions(Activity activity) {
        int readPermission = ContextCompat.checkSelfPermission(activity, mPermissions[0]);
        int writePermission = ContextCompat.checkSelfPermission(activity, mPermissions[1]);
        int managePermission = ContextCompat.checkSelfPermission(activity, mPermissions[2]);
        if (writePermission != PackageManager.PERMISSION_GRANTED ||
                readPermission != PackageManager.PERMISSION_GRANTED ||
                managePermission != PackageManager.PERMISSION_GRANTED
        ) {
            //ActivityCompat.requestPermissions(activity, mPermissions, REQUEST_EXTERNAL_STORAGE_CODE);
            Toast.makeText(activity, "設定で、すべてのファイル管理を許可してください", Toast.LENGTH_LONG).show();
        }
    }
    private static final String[] mPermissions = {
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
    };

    private static void verifyStoragePermissions(Activity activity) {
        int readPermission = ContextCompat.checkSelfPermission(activity, mPermissions[0]);
        int writePermission = ContextCompat.checkSelfPermission(activity, mPermissions[1]);
        if (writePermission != PackageManager.PERMISSION_GRANTED ||
                readPermission != PackageManager.PERMISSION_GRANTED
        ) {
            //ActivityCompat.requestPermissions(activity, mPermissions, REQUEST_EXTERNAL_STORAGE_CODE);
            Toast.makeText(activity, "設定で、すべてのファイル管理を許可してください", Toast.LENGTH_LONG).show();
        }
    }

リファレンス

[1] Androidでパーミッション許可ダイアログの出し方
[2] Androidの実行時パーミッションチェックを実装する
[3] AndroidでRuntimePermissionを実装