お久しぶりです。メモです。
インターナルなファイルなら、以前に書きました以下の記事でファイルもいけます。
Intentのアクション周りが違うだけで共有もそこを変えればOK。
■ApkファイルのIntentの投げ方変わったぽい(Nです)
だけどAndroid7からはSDカード内のファイルの場合だと上記ではダメです。
エラーでます。
SDカードとか触る場合はStorage Access Frameworkの仕様にのっとりましょう。
■ストレージ アクセス フレームワーク
DocumentFileでgetUriしたものを利用してください。
なお、Fileクラス使ってDocumentFile.fromFileで作られるものは使えません。
あれ中身ただFileクラスをラッピングしてるだけなので作られるのはUri.fromFileと同じです。
あとセキュリティがクリアしていないDocumentFileはエラーではじかれます。
という事なので
ACTION_OPEN_DOCUMENT で ACTION_CREATE_DOCUMENT でピックアップした奴や。ACTION_OPEN_DOCUMENT_TREEで登録したDocumentFile(TreeDocumentFile)配下のDocumentFile。
しか使えないという事。
ここら辺の判別をFileクラスやパスからしたい場合は、
1.Nougat(Android7)以降か判定。
2.Environment.isExternalStorageRemovable(File file)で外部ストレージか判定
でどちらもtrueなら上の方法が必要だよって感じで分けれるかと。
*共有については、Android6までならSDカードでも今までの方法が使えます。
ちなみにサンプルとかでisExternalStorageRemovableをそのまま使ってるの多いですがこいつは例外でるので気をつけましょう。
docを見ると書いてありますが有効なストレージでないとダメよってことらしいです。
例えば/storageとかに使うと出たはず。
あとDocumentFileについては最新かどうかわからないけどここら辺のソースを見るとDocumentFileのfrom系がそれぞれ違うものを返していてまったく別物なのだったり等分かります。
面倒ですね。
いまさらながらStorage Access Framework触ったけど色々使いづらいのが分かりました。
*ディレクトリまたいでcreateFileとかしたい場合はfindFileで階層まで移動してからじゃないとダメとか。。。
余談ですが
登録してないURIをDocumentFile.fromTreeUriすると例外でたよ。
ACTION_OPEN_DOCUMENT_TREEでリザルトされたタイミング以外に登録しようとしたら例外でたよ。
当たり前ですかね(・ω・)