<HOME

uses-permissionを指定して特殊な権限を必要とする機能を実装する30分


SDカード(または内蔵ストレージ)に保存されているファイルの一覧を取得してみましょう。

  1. 「PermissionTraining」アプリを作成します。

    1. Android Studioを起動し、新規プロジェクトを作成します。

      「Welcome to Android Studio」画面の場合は、「Start a new Android Studio project」をクリックします。

      別のプロジェクトが開いている場合は、ツールバーから「File」→「New」→「New Project...」をクリックします。

    2. HelloWorldの時と同じようにプロジェクトを作成していきます。

      アプリ名は「PermissionTraining」としてください。

      今回は「Backwards Compatibility (AppCompat)」のチェックは外しておきます。

  2. まずはadbコマンドで/sdcard/(SDカードまたは内蔵ストレージのルートディレクトリのパス)の中身を確認します。

    1. コマンドプロンプトを起動し、以下のコマンドでAndroid端末のシェルに入ります。

      adb shell

    2. 以下のコマンドで/sdcard/の中身を確認します。

      cd /sdcard/

      ls -la

    3. 「.」「..」以外のファイルまたはディレクトリが存在すればOKです。

      ちなみに、「.」はカレントディレクトリ(現在のディレクトリ)、「..」は親ディレクトリです。

      もし何もファイルが無いようでしたら、以下のコマンドで空のファイルを作っておきましょう。

      touch emptyfile

  3. /sdcard/のファイル・サブディレクトリ一覧を表示する処理を実装します。

    1. 「activity_main.xml」を編集し、ListViewを表示するようにします。

      サンプル : activity_main.xml

      コードを表示するにはJavaScriptを有効にしてください

    2. 「Environment」クラスの「getExternalStorageDirectory」メソッドを使用して「/sdcard/」のFileオブジェクトを取得できます。

      そのFileオブジェクトから、ファイル・サブディレクトリの一覧を取得してListViewに表示する処理を実装します。

      コードを表示するにはJavaScriptを有効にしてください

      サンプル : MainActivity.java

      コードを表示するにはJavaScriptを有効にしてください

  4. アプリを起動して動作を確認してみましょう。

    ・・・何も表示されていません。

    実は、アプリでSDカードや内蔵ストレージにアクセスするには、特殊な権限が必要です。


    アプリが自由にSDカードにアクセスできてしまうと、悪意あるアプリが簡単にSDカード内の大切な思い出を削除できてしまいます。

    そういったことを防ぐために、アプリはSDカードや内蔵ストレージにアクセスすることを宣言し、ユーザー(端末)がそれを許可する必要があります。

    他にも、電話帳参照やカメラの操作、インターネット接続など、特殊な権限が必要な処理が多数存在します。

    概ね、個人情報などの機密情報の参照や、ハードウェアを操作する処理に対して必要になってきます。

  5. アプリに、SDカードや内蔵ストレージにアクセスすることを宣言させましょう。

    1. AndroidManifestに、以下の記述を追加します。

      コードを表示するにはJavaScriptを有効にしてください

      「uses-permission」にて、「このアプリは○○の権限を使うよ」ということを宣言します。

      今回は外部ストレージ(SDカード、または内蔵ストレージもこれにあたる)の内容を読み込みたいので、
      「READ_EXTERNAL_STORAGE」の権限使用を宣言します。

      サンプル : AndroidManifest.xml

      コードを表示するにはJavaScriptを有効にしてください

  6. アプリを起動して動作を確認してみましょう。

    ・・・何も表示されていません。

    「アプリはSDカードや内蔵ストレージにアクセスすることを宣言」しましたが、

    「ユーザー(端末)がそれを許可」していないためです。

    Android6.0以前のバージョンの端末は、この時点で/sdcard/の中身が表示されているかもしれません。

  7. 端末側で権限の使用を許可しましょう。

    設定アプリでアプリの設定画面を開き、権限を付与します。

  8. アプリを再起動して動作を確認してみましょう。

    SDカード(または内蔵ストレージ)のファイル・ディレクトリの一覧が表示されていればOKです。

  9. ちなみに、自分で開発したアプリやネットに転がっている野良アプリは今回のように設定アプリから権限を付与する必要がありますが、

    マーケット(Playストア)からインストールしたアプリは、基本的にインストールされた時点で権限が付与されています。

    (マーケットでのインストールの際に使用する権限の確認が行われ、ユーザーがそれを許可したうえでインストールしているため)


    ただし、ユーザーが後から権限の使用をOFFにすることもできるので、

    特殊な権限を使用するアプリは、アプリ起動時に権限の有無をチェックする処理を実装していることが好ましいです。


    権限の有無をチェックするには、PackageManagerの「checkPermission」メソッドを使用します。

    コードを表示するにはJavaScriptを有効にしてください

    checkPermissionの戻り値は「PERMISSION_GRANTED(権限付与されている)」「PERMISSION_DENIED(付与されていない)」のいずれかです。

    サンプル : MainActivity.java

    コードを表示するにはJavaScriptを有効にしてください

uses-permissionに関する詳細については公式ドキュメントに記載されています。

また、Androidは先人たちがネット上にたくさんの情報を残してくれています。

これらも活用して、是非このAPIを有効に使えるようになってください。