Nougatの新しい外部ストレージアクセスを試してみた。techiumスマートフォン用の表示で見るtechiumこのブログは何かに追われないと頑張れない人たちが週一更新をノルマに技術情報を発信するブログです。いただけますと気が向いたら調査するかもしれません。この広告は、90日以上更新していないブログに表示しています。Nougatの新しい外部ストレージアクセスを試してみた。Nougatでは新しい外部ストレージへのアクセス方法が提供されました。developer.android.comdeveloper.android.comこれまでAndroidで外部ストレージにアクセスするには、ManifestファイルにPermissionを定義し、さらに6.0からはパーミッションリクエストも必要です。WRITE_EXTERNAL_STORAGEはアプリとして必要でないディレクトへの読み書きも許可してしまいます。新しい外部ストレージアクセスのAPIを利用することで、利用したいストレージへのアクセスを簡単に行うことができます。ユーザにアクセス許可を得る今回は外部ストレージのDCIMディレクトリ配下にファイルの読み書きをしてみることにします。先のリンクのサンプルにもありますが、DCIMディレクトリにアクセスするには以下のようにします。}ポイントは4行目以降です。StorageManager#getPrimaryStorageVolume()はAndroid端末のプライマリストレージボリュームの情報(StorageVolumeクラスのインスタンス)を取得します。getExternalFilesDir(String)メソッドと同じです。プライマリストレージはあらかじめシステムに決められており、必ずしもSDカードになるわけではないことに注意です。別のストレージにアクセスしたいような場合には、StorageManager#getStorageVolume()メソッドを使用します。StorageVolumeクラスにはストレージの情報が入っており、端末にマウントされているかどうかといった情報も持っています。6行目ではcreateAccessIntent()メソッドを利用し、ディレクトリへのアクセス許可をユーザに確認するダイアログを表示するためのIntentを取得します。引数にアクセスしたいディレクトリを指定することで、そのディレクトへのアクセスのみを許可します。7行目でIntentを実行すると、以下のようなダイアログが表示されます。ユーザがこのダイアログで許可、あるいは拒否を選ぶと、onActivityResultが呼ばれます。ファイルを書き込むonActivityResultの内容は以下のような感じにしてみました。}まずポイントは7行目です。getContentResolver().takePersistableUriPermission()を呼び出して、FLAG_GRANT_WRITE_URI_PERMISSION(ついでにFLAG_GRANT_READ_URI_PERMISSIONも)を保存します。することで、一度ユーザがアクセスを許可すると2回目以降、ユーザに対して同じダイアログは表示しません。使い勝手を考えると、アクセスのたびにダイアログで使用許可を求められるのは面倒でしょう。6行目、dataオブジェクトの中にDCIMへのURI(content://...DCIM)が入っているのでそれを取り出し、8行目以降でDCIMディレクトリにテキストファイルを出力しています。ちなみに、ここで無理やりURIの中身を変えるなどしてDCIM以外のディレクトリに書き込みしようとすると、12行目でnullが返ってきたり、takePersistableUriPermission()メソッドでSecurityExceptionが発生したりします。Readボタンを押して読み込む(23行目以降)と、以下のように書き込んだ内容がテキストで表示されます。Androidマニフェストへのパーミッション定義やパーミッションリクエストをユーザに求める処理も必要ありません。楽ちんになった気がします。今日はこんなところです。Nougatの新しい外部ストレージアクセスを試してみた。Firebase2017-11-23BottomNavigationViewのテストAndroidはてなブログをはじめよう!kobashin__Gさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。