365連休

にわかのandroidとかの開発メモ。

Android Studio 3.6 ディレクトリを表すUriオブジェクトがあるか?

ある。

 

 

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);
    }

 

ツリーUriDocumentFileオブジェクトに変換することで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
} }