【Android】アプリケーションから権限の取得方法
Androidアプリケーションがデバイスの機能へアクセスする場合、利用者に権限を許可してもらう必要があります。
デバイスの機能とは以下のようなものです。
- 連絡先
- 位置情報
- 内部ストレージ
- カメラ 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 で表示されるダイアログなのでデザインの修正はできません。 ユーザーが理解していればいいですが、そうでない場合「なんでこの権限が必要なんだろう?」と不審がられ離脱につながる可能性も無くはありません。 この問題を減らすためには以下の対応をしておくと良いです。
※どちらか片方のみ対応でもだいぶ効果はあると思います。 |
コメント
コメントを投稿