ある。
Intent.ACTION_DOCUMENT_OPEN_TREEで返すUri(通称ツリーUri)はディレクトリを表す。
//フォルダを取得するインテント if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { final @NonNull Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); //システムUI起動 //intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true); startActivityForResult(intent, REQUEST_CODE_OPEN_DIRECTORY); }
ツリーUriはDocumentFileオブジェクトに変換することでFileオブジェクトと同じように操作することができる。
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent intent) { if(REQUEST_CODE_OPEN_DIRECTORY==requestCode && resultCode==FragmentActivity.RESULT_OK && intent!=null) { final @Nullable Uri treeUri = intent.getData(); final @Nullable DocumentFile documentFile = (treeUri==null ? null : DocumentFile.fromTreeUri(context, treeUri) ); if(documentFile!=null){ //他にもいろいろ取得できる final @NonNull Uri thisUri = documentFile.getUri(); //ツリーUri final @Nullable String name = documentFile.getName(); final @Nullable String mime = documentFile.getType(); final @Nullable DocumentFile parent = documentFile.getParentFile(); final @NonNull DocumentFile[] listFiles = documentFile.listFiles(); final boolean isDirectory = documentFile.isDirectory(); final boolean isFile = documentFile.isFile(); final boolean canRead = documentFile.canRead(); } } }
FileオブジェクトをDocumentFileオブジェクトへ変換することもできる。
Android 7 NougatのShare Intentのファイルパス制限は突破できないので、使い道はあまりないかも。
Android 7.0 の動作の変更点 | Android デベロッパー | Android Developers
final @NonNull File file = new File("ほげ"); final @NonNull DocumentFile documentFile = DocumentFile.fromFile(file);
UriオブジェクトをDocumentFileオブジェクトへ変換することもできる。
こちらも使い道はない?かも。
final @NonNull Uri uri = getHogeUri(); final @NonNull DocumentFile documentFile = DocumentFile.fromSingleUri(context, uri);
DocumentFileオブジェクトは通常のUriと同様にContentResolverへ突っ込むことができる。DocumentsProviderさんがせっせと働くらしい。
final @NonNull ContentResolver cr = context.getContentResolver();
if(documentFile.isFile() && documentFile.canRead()){ try(@NonNull InputStream is = cr.openInputStream(documentFile.getUri())){ //do something
} }