Storage Access Framework の OPEN_DOCUMENT_TREE から basepath Uri を正常に取得できます。
Android 5.0 (Lollipop) 向けに提供された新しい SD カード アクセス API の使用方法
private static final int READ_REQUEST_CODE = 42;
public void performFileSearch() {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent, READ_REQUEST_CODE);
}
@Override
public void onActivityResult(int requestCode, int resultCode,
Intent resultData) {
// The ACTION_OPEN_DOCUMENT intent was sent with the request code
// READ_REQUEST_CODE. If the request code seen here doesn't match, it's the
// response to some other intent, and the code below shouldn't run at all.
if (requestCode == READ_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
// The document selected by the user won't be returned in the intent.
// Instead, a URI to that document will be contained in the return intent
// provided to this method as a parameter.
// Pull that URI using resultData.getData().
Uri uri = null;
if (resultData != null) {
uri = resultData.getData();
}
}
}
しかし、この投稿で参照されているように、Android 5.0 には再帰を壊すバグ/機能があります。
Lollipop で Android Storage Access フレームワークを使用してファイルを一覧表示する際のバグ
Uri treeUri = resultData.getData();
DocumentFile pickedDir = DocumentFile.fromTreeUri(this, treeUri);
Uri f1 = pickedDir.findFile("MyFolder").getUri();
Log.d(TAG, "f1 = " + f1.toString());
File.listFiles() を使用すると、Null 配列が返されます。
ターゲット フォルダー/ファイルへのフル パスは既にわかっています。onActivityResult で返されるルート Uri の権限を持つ有効な DocumentFile Uri を作成したいと思います。
ルート URI パスに追加するか、ルート URI と同じアクセス許可を持つ新しい URI を作成して、ターゲット フォルダー/ファイルにアクセスしたいと考えています。