【Android】アプリケーションから権限の取得方法

Androidアプリケーションがデバイスの機能へアクセスする場合、利用者に権限を許可してもらう必要があります。

デバイスの機能とは以下のようなものです。

  1. 連絡先
  2. 位置情報
  3. 内部ストレージ
  4. カメラ etc ・・・

ここでは連絡先を利用するアプリケーションを作ると想定して、どのように実装するのかをまとめます。

実装

対象権限の追加

AndroidManifest.xml

AndroidManifest.xmlに取得したい権限を追加します。

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

権限を貰うための処理

MainActivity.java

public class MainActivity extends AppCompatActivity {

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

        // このアプリケーションに連絡先にアクセスする権限が許可されているかチェック
        if (PermissionChecker.checkSelfPermission(this, Manifest.permission.READ_CONTACTS)
            != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.READ_CONTACTS,}, 0);
        } else{
            ((TextView) findViewById(R.id.textTest)).setText("すでに許可されています");
        }
    }
}

checkSelfPermissionメソッドで権限が許可されているかどうかをチェックします。

このときAndroidManifestで指定されたパーミッション以外のものを指定すると必ずPERMISSION_DENIED(-1)を返します。

これが != PERMISSION_GRANTED つまり許可されていない場合は、requestPermissionsで許可してもらうためのダイアログが表示されます。

これもAndroidManifestで指定されたパーミッション以外のものを指定するとダイアログが表示されません。

権限取得後の処理

MainActivityに次のメソッド追加します。

/**
 * パーミッションが許可されたときに呼ばれる
 * @param requestCode
 * @param permissions
 * @param grantResults
 */
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    if (requestCode == 0) {
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // パーミッションが許可されたときの処理
            ((TextView) findViewById(R.id.textTest)).setText("権限が許可されました");
        } else {
        	finish();
        }
    }
}

ダイアログで許可したか否かにかかわらず、結果がonRequestPermissionsResultメソッドに返ってきます。

許可された場合は連絡先へアクセスができるようになるので、ここで権限を使用した処理や画面の初期化などを行います。

許可されなかった場合は、権限を使用した処理ができないので、処理を制限した構成にするかアプリケーションを終了するかしかできなくなります。

実行結果

アプリケーションの初回起動時はこのように表示されます。

このダイアログは Android OS で表示されるダイアログなのでデザインの修正はできません。

ユーザーが理解していればいいですが、そうでない場合「なんでこの権限が必要なんだろう?」と不審がられ離脱につながる可能性も無くはありません。

この問題を減らすためには以下の対応をしておくと良いです。

  • 権限のリクエスト前にダイアログ等で、権限が必要な理由を明記する。
  • Play storeに権限を使用する理由を明記しておく。

※どちらか片方のみ対応でもだいぶ効果はあると思います。

コメント

このブログの人気の投稿

docker-compose up で proxyconnect tcp: dial tcp: lookup proxy.example.com: no such host

docker-compose で起動したweb、MySQLに接続できない事象

【PHP】PHP_CodeSnifferを使う(コーディングルールのカスタマイズ)