Androidでパーミッション許可ダイアログの出し方

Androidでのパーミッションについて

昔(APIレベル < 23)はこんな緩い許可でOKでした。

  • ただAndroidManifest.xmlに書くだけ
  • インストール時に自動的に許可される

これは大昔の話。

現在(APIレベル >=  23)はスゴク厳格になってます。

いわゆるパーミッション許可ダイアログの表示必須です。

意外とやり方が面倒だったので、
ここでは そのパーミッション許可ダイアログの出し方 をまとめました。

許可ダイアログを出す必要があるパーミッションの種類

まずパーミッションと許可ダイアログについて

別に全パーミッションで必須なわけじゃないです。

一部の Dangerousパーミッション に必要になります。

▼ 公式での Dangerousパーミッション の解説

Dangerous パーミッションは、アプリがユーザーの個人情報を含むデータやリソースを必要とする、あるいはユーザーが保存したデータや他のアプリ操作に影響を及ぼす可能性があるケースを対象とします。たとえば、ユーザーのコンテンツを読み取る機能には、Dangerous パーミッションが必要です。アプリが Dangerous パーミッションが必要性であると宣言している場合、ユーザーはアプリに明示的にパーミッションを付与しなければなりません。

引用元 : https://developer.android.com/guide/topics/security/permissions?hl=ja

個人情報を含むデータやリソース

ここが重要なところ

 

一例(というか全部?)を挙げると、以下の通りです。

抜けてるパーミッションがあれば教えてください。

  • READ_CALENDAR
  • WRITE_CALENDAR
  • CAMERA
  • READ_CONTACTS
  • WRITE_CONTACTS
  • GET_ACCOUNTS
  • ACCESS_FINE_LOCATION
  • ACCESS_COARSE_LOCATION
  • RECORD_AUDIO
  • READ_PHONE_STATE
  • CALL_PHONE
  • READ_CALL_LOG
  • WRITE_CALL_LOG
  • ADD_VOICEMAIL
  • USE_SIP
  • PROCESS_OUTGOING_CALLS
  • BODY_SENSORS
  • READ_EXTERNAL_STORAGE
  • WRITE_EXTERNAL_STORAGE

アプリを確実にAPIレベル23以降に対応させたいなら・・・

これらパーミッションの許可ダイアログ表示が必要

よく使うのは WRITE_EXTERNAL_STORAGE とかですね。

パーミッション許可ダイアログの表示手順&コード例

実際にとあるアプリでは、以下2つの権限が必要でした。

  • WRITE_EXTERNAL_STORAGE
  • READ_CONTACTS

これを例に取ると、以下手順でダイアログ表示できます。

1.普通にAndroidManifest.xmlに権限追加

まずは AndroidManifest.xml の編集

ここに今まで通りパーミッションを追加します。

▼ ここでは2つのパーミッションを追加

Android6.0以上では、これだけでは不完全です。

起動時にも許可を取るコードが必要になりました。

2.許可ダイアログを起動時に表示する

そしたら次からが肝心な処理です。

許可ダイアログの表示

以下の条件に当てはまるなら、表示しないとダメです。

  • Android6.0以降に対応させる場合
  • APIレベル23以降に対応させる場合
  • そのうえで許可を取れていない場合

 

実際には onCreate 内にこういうコード書いてみました。

▼ onCreate内にて・・・

▼ またActivityの内側に定数も宣言しておく

ちなみに対応は Build.VERSION.SDK_INT >= 23  だけでOK。

それ以前のバージョンでは許可ダイアログは不要なようです。

3.許可ダイアログの結果を受け取る

許可ダイアログを表示したら・・・

その許可ダイアログの結果受け取りが必要

結果には大きく分けて次の2種類があります。

  • 許可が取れた場合
    => そのまま通常通りにアプリを起動する
  • 許可が取れなかった場合
    => 再度許可を取ったりトースト表示したり

結果は onRequestPermissionsResult  をオーバーライドして受け取り可能です。

 

実際に書いてみたコードは以下のようなもの

▼ Actiivty内でオーバーライド

こういう感じ。

許可が取れない場合はトースト表示してます。

 

実際にこのコードを追加すると・・・

起動時にこんなダイアログが表示されます。

▼ WRITE_EXTERNAL_STORAGE の許可ダイアログ

WRITE_EXTERNAL_STORAGE の許可ダイアログの表示例

▼ READ_CONTACTS の許可ダイアログ

READ_CONTACTS の許可ダイアログの表示例

よく見かけるダイアログが表示できました。

これで心置きなくアプリリリースできます。

ここまでのまとめ - 許可ダイアログは必ず表示しよう

という訳で許可ダイアログ表示についてでした。

  • Android6.0以降に対応させたい
  • 個人情報を含むデータにアクセスする

そんな場合はパーミッションリクエスト必須ですね。

アプリ公開前に必ず実装するようにしたいです。

Shareこの記事をシェアしよう!

Commentsこの記事についたコメント

3件のコメント
  • Rocky

    はじめまして。
    この度、Androidアプリ開発を久しぶりに行いまして権限周りにつまずきこのページにたどり着きました。どのプログラムをどことどこの間に書く・・・と書かれていてとてもわかり易かったです。
    さて、上記のプログラムを書いたのですが、権限ダイアログが表示されずにすぐに「アプリを起動できません」とトーストが出てアプリが終了してしまいます。何が原因でしょうか?
    今回私が作っているアプリでは”WRITE_SETTINGS”という権限が必要となっています。

    もしわかればご教授ください。

    9月 6, 2021 7:49 pm
    • ぴー助

      はじめまして。
      コメントありがとうございます。

      まずそういった「起動できません」というエラーが出る場合、それだけでコードの問題個所を特定するのはほぼ不可能です。まずはエラーログ確認が大事ですね。ただしadb接続などが必須であり、デバッグ環境以外ではログ出力・エラー確認ができないので注意が必要です。(参考 – Wifiによるadb接続について : https://pisuke-code.com/android-use-adb-over-wifi/)

      エラー原因というのは実際のコード・開発環境依存なので断言することはできません。開発環境(Android Studioなど)でのログ出力・エラーログ確認の方法を調べ、コードのどこに原因があるのか調べられた方がいいと思います。(仮に推測するならnull参照などの実行時エラーかもしれません)

      9月 6, 2021 8:58 pm
  • Rocky

    お世話になります。
    ご返信遅くなりまして申し訳ございません。

    情報不足な状態でのご質問失礼致しました。
    はじめに質問させて頂きましたパーミッションについて自分でも調べたところ、自分のアプリで求められているパーミッションがよくあるダイアログで許可するものではありませんでした。
    外部リンクの貼り付けではありますが、以下リンク内の「システム設定の変更」のパーミッションです。
    https://qiita.com/KeithYokoma/items/b434db6b501f369d3d20

    こちらはよくあるダイアログでの許可は不可のようです。しかし、パーミッションが許可状態にあるのかを判定してアプリ起動時にダイアログを表示するなどできたらと思っています。

    9月 10, 2021 7:10 pm

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください