0

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 を作成して、ターゲット フォルダー/ファイルにアクセスしたいと考えています。

4

1 に答える 1

0

基本的には、URI のパス セグメントを細分化する必要があります。また、findFile の呼び出しも避けたいと考えています。パフォーマンスは、フォルダーのサイズに応じてマイナスにスケーリングされます。数百のファイルは数秒を意味する可能性があり、上昇し続けます。

私の解決策は、適切に機能する getParent で DocumentFile をラップすることでした。まだ完全には終わっていません (つまり、このコードは完全には機能していません) が、URI を目標に合わせて操作する方法を示している可能性があります。

/**
 *  Uri-based DocumentFile do not support parent at all
 *  Try to garner the logical parent through the uri itself
 * @return
 */
protected UsefulDocumentFile getParentDocument()
{
    Uri uri = mDocument.getUri();
    String documentId = DocumentsContract.getDocumentId(uri);

    String[] parts = getPathSegments(documentId);

    if (parts == null)
        return null;

    Uri parentUri;
    if (parts.length == 1)
    {
        String parentId = DocumentsContract.getTreeDocumentId(uri);
        parentUri = DocumentsContract.buildTreeDocumentUri(uri.getAuthority(), parentId);
    }
    else
    {
        String[] parentParts = Arrays.copyOfRange(parts, 0, parts.length - 2);
        String parentId = TextUtils.join(URL_SLASH, parentParts);
        parentUri = DocumentsContract.buildTreeDocumentUri(uri.getAuthority(), parentId);
    }

    return UsefulDocumentFile.fromUri(mContext, parentUri);
}

繰り返しますが、これはまだ完全には機能していませんが、正しい方向に向けられるかもしれません。すべてのねじれを解決したら、更新します。

于 2016-01-27T11:41:03.093 に答える