アンドロイドQ - 新しいリポジトリ政策、Scoped Storageこちら

アンドロイドQから外部ストレージを扱う新しい政策、Scoped Storageが紹介されました。 Q以前の既存のポリシーは、アプリがデバイスの任意のファイルにアクセスするときにユーザーにストアのアクセス許可のみ取得しました。 だからアプリは、すべてのフォルダに移動することができたファイルのPathを得、データを読み書きすることができました。

しかし、QのScoped Storageは、基本的にアプリがデバイスのすべてのファイルを閲覧していないという前提が敷かれています。 公共メディアファイルは、 READ_EXTERNAL_STORAGE権限が必要アクセスが可能で、それ以外のファイルは、ユーザーにアクセス権を個別に必要です。アプリが自由にアクセスすることができるのは、自分の個人的なアプリのデータのみです。

Googleのような政策は、最近のトレンドであるセキュリティを向上させるための目的です。 ユーザーはアプリが知る必要はないファイルへのアクセス権を与えなくてもされて、個人情報を保護することができます。

Scoped Storageに対して学ぶ前に、今まで使用してきた外部ストレージポリシーに対して、まず調べ、Scoped Storageを知ってみましょう。

内部ストレージ vs 外部ストレージ

アンドロイドのストレージは大きく、内部ストレージ(Internal Storage)と外部ストレージ(External Storage)に分けられます。 内部ストレージは /data/の下のパスのファイルを意味し、外部ストレージは /storage/の下のパスのファイルを意味します。

すべてのアプリは、自分だけのデータフォルダーを持っています。自分のデータフォルダーは、自分だけアクセスすることができます。つまり、いくつかの他のアプリのデータフォルダーにアクセスすることができないことを意味します。 データフォルダーは、内部ストレージと外部ストレージの両方に存在し、パスは次のとおりです。

  • 内部ストレージのデータフォルダ: /data/data/[アプリのPackage Name]/
  • 外部ストレージのデータフォルダ: /storage/emulated/0/Android/data/[アプリのpackage name]/

Scoped Storageは、外部ストレージのポリシーです。そのため、外部ストレージに焦点を合わせて確認してください良さそうです。

Q以前の外部ストレージポリシー

アンドロイドP以下のバージョンでは、外部記憶装置には、次のようなフォルダがあります。

  • アプリのデータフォルダー: /storage/Android/data/[アプリのpackage name]/
  • パブリックフォルダ(DCIM、Picturesなど): /storage/[フォルダ名]

アプリデータフォルダーはアプリ独自アクセスすることができます。そして、アプリが削除されるときに、データも削除されます。

一方、パブリックフォルダは、すべてのアプリがアクセスすることができます。 Pictures、DCIMなどのフォルダが自動的に作成されているが、他の目的のために使用するフォルダを作成することもできます。 このフォルダにファイルを読み書きするには、 READ_EXTERNAL_STORAGEまたはWRITE_EXTERNAL_STORAGE権限を取得する必要があります。そしてファイルを作成したアプリを削除してもデータは削除されません。

そしてシステムは、MediaStoreを介してデバイスに存在するメディアデータを共有します。 MediaStoreは、システムでは、メディアデータに関する情報を提供するProviderです。

ストア内のフォルダのパスに対して疑問ウルAndroidのデータフォルダのパスと内部/外部ストレージの説明を参照してください。

QのScoped Storageポリシー

GoogleはScoped Storageを次の3つに分けて説明しています。

  • アプリのデータフォルダー(App specific directory)
  • メディアファイル(MediaStore)
  • 公共ファイル(Storage Access Framework)

アプリのデータフォルダー(App specific directory、Sandbox)

アプリデータフォルダは以前と同じです。読み書き権限が必要なく、他のアプリは、自分のデータフォルダにアクセスすることはできません。 アプリが削除されると、データのフォルダも削除されます。

メディアファイル(MediaStore)

パブリックフォルダの中にあるメディアファイルはMediaStoreを介して読み取ることができます。たとえば、写真や動画のファイルを探してたいパブリックフォルダの下にあるすべてのファイルを移動して探すのではなくMediaStoreにクエリをしてUriオブジェクトを得て使用します。

次のようなコレクションに保存されたファイルはMediaStoreを介して読み取ることができます。

  • MediaStore.Images: 写真ファイル
  • MediaStore.Video: ビデオファイル
  • MediaStore.Audio: 音楽ファイル

また、MediaStoreを介してファイルを読むには READ_EXTERNAL_STORAGE権限が必要です。 しかし、ファイルを作成することは、権限がなくてもされます。

イメージファイルの位置情報を読み取るには、 ACCESS_MEDIA_LOCATION権限が必要です。 この権限は、Android 10(SDK 29)から追加された新規パーミッションであるので、 SDK 28以下でビルドされたアプリケーションの場合、 READ_EXTERNAL_STORAGE権限のみを要求するとACCESS_MEDIA_LOCATIONも付与されます。

共通ファイルの(Downloadsフォルダ、Storage Access Framework)

公共メディアファイルを除き、Downloadsフォルダなどをアクセスするときは、SAF(Storage Access Framework)を利用します。 SAFはAndroid Lollipopから紹介されたが、システムの構造が直接アクセスする方式よりも簡単でなく、UXが複雑に多くのアプリが使用していない。 SAFは、フォルダを管理するDocumentsProviderと、ユーザーがアプリにファイルのアクセスを許可することができるようなUIを提供するDocumentsUIで構成されています。

Qでアプリは公開ファイルにアクセスするときDocumentsUIのアクティビティを浮かべ、ユーザーにどのようなファイルへのアクセス権を与える必要があります。 その後に、そのファイルを読み書きするようにする必要があります。ユーザーがファイルまたはフォルダを選択するため、ユーザーはより狭い範囲に権限を付与することができました。

Android developers:scoped storageにSAFを利用する方式の導入があり、ケースバイどのように処理する必要がありかどうかをご案内しています。 SAFの説明は、Android developers:document providerを参照してください。

アプリの更新

アプリ開発者は、すぐに自分のアプリにScoped Storageを適用しなくてもされます。 Scoped Storageをすぐに適用する準備ができダメ開発のために、Googleは、Qで従来の方法を使用できるように猶予期間をおきました。

このAndroid 10デバイスでScoped storageポリシーを適用受け取らないようにするには、次の中1つの方法に従ってください。

  • AndroidのAPI 28以下をTarget SDKに設定
  • AndroidのAPI 29以上のTarget SDKに設定する場合は、requestLegacyExternalStorageをtrueに設定します。

次のようにアプリのAndroidManifest.xmlに requestLegacyExternalStorageプロパティをtrueに設定すると、Scoped Storageポリシーが適用されません。

<manifest ... >
  <!-- This attribute is "false" by default on apps targeting Android Q. -->
  <application android:requestLegacyExternalStorage="true" ... >
    ...
  </application>
</manifest>

しかし、Googleは、以下のOSのバージョンでは、このポリシーを強制化する計画であるため、1〜2年以内にScoped storageポリシーに従うようにアプリを変更する必要があります。

まとめ

長々と説明したScoped storageを簡単に説明すると、アプリは、直接ファイルにアクセスすることができず、MediaStoreとSAFを介してファイルのUriを得アプローチする必要があります。このポリシーは、ユーザーがアプリが必要とするファイルのみアクセス権を付与することができるように作って、セキュリティを向上させるすることが目的です。説明を読むよりも、Googleが提供するサンプルを実行してみコードを分析してみるほうが良いようです。

参考

codechachaCopyright ©2019 codechacha