无法使用存储访问框架 (SAF) 设置文档导航器的初始位置

问题描述 投票:0回答:3

文档说“调用者可以通过

EXTRA_INITIAL_URI
设置文档URI来指示文档导航器的初始位置。”

但是这里不会解决

EXTRA_INITIAL_URI
。我尝试设置为此给出的常量,如评论中所示(
EXTRA_INITIAL_URI = "android.provider.extra.INITIAL_URI"
),但这不起作用。我该如何解决?

package com.ship.saftwo;
import android.content.Intent;
import android.net.Uri;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import java.io.File;

public class MainActivity extends AppCompatActivity{
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = (Button) findViewById(R.id.button1);
        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {navigateToAppDirectory();}});}

    private static final int READ_REQUEST_CODE = 42;
    // adding this does not help: public static final String EXTRA_INITIAL_URI = "android.provider.extra.INITIAL_URI";

    public void navigateToAppDirectory() {
        Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
        Uri uri = Uri.parse(Environment.getExternalStorageDirectory().getPath() + File.separator + getResources().getString(R.string.app_name) + File.separator);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.setType("*/*");
        intent.putExtra(Intent.EXTRA_INITIAL_URI, uri);
        //error message: Cannot resolve symbol 'EXTRA_INITIAL_URI'
        startActivityForResult(intent, READ_REQUEST_CODE);
    }
}
android
3个回答
21
投票

来自 DocumentsContract.EXTRA_INITIAL_URI

位置应指定文档 URI 或带有文档 ID 的树 URI。如果此 URI 标识非目录,文档导航器将尝试使用文档的父级作为初始位置。

据我所知

  • 您不能使用任意 URI 指定起始位置,例如
    Uri.fromFile
    ,它需要源自 DocumentsProvider
  • 您无法在 API 25 及以下版本上指定起始位置

假设

uri
是从 Intent.ACTION_OPEN_DOCUMENT_TREE 中检索的:

DocumentFile file = DocumentFile.fromTreeUri(context, uri);
intent.putExtra(EXTRA_INITIAL_URI, file.getUri());

1
投票

我可以这样设置:

    private fun requestUri() {
    val intent = Intent(Intent.ACTION_CREATE_DOCUMENT)
    intent.addCategory(Intent.CATEGORY_OPENABLE)
        .setType("application/text")
        .putExtra(Intent.EXTRA_TITLE, "DEST_FILE_NAME")
        .putExtra(DocumentsContract.EXTRA_INITIAL_URI, Environment.DIRECTORY_DOCUMENTS)
    requestUri.launch(intent) // my start activity for result logic 
}

private var requestUri = registerForActivityResult(StartActivityForResult()) { result ->
    if (result != null && result.resultCode == Activity.RESULT_OK) {
        result.data?.let { intent ->
            intent.data?.let { fileUri ->
               // u have a valid uri now 
            } ?: run {
               // show some error Ui
            }
        }
    }
}

在我的应用程序中,我可以将 DocumentsContract.EXTRA_INITIAL_URI 设置为类似:

  • 环境.DIRECTORY_DOCUMENTS
  • 环境.DIRECTORY_DOWNLOADS

这可能对某人有帮助:)


0
投票

我可以使用像这样的默认文件夹(我使用

registerForActivityResult
,这并不重要):

private val launcher = registerForActivityResult(ActivityResultContracts.OpenDocumentTree()) { uri -> ... }

val documentUri = DocumentsContract.buildDocumentUri("com.android.externalstorage.documents", "primary:Documents")
launcher.launch(documentUri)

这等于

putExtra(DocumentsContract.EXTRA_INITIAL_URI, documentUri)

或者您可以:

// documentUri actually is: 
Uri.parse("content://com.android.externalstorage.documents/document/primary%3ADocuments")
// content://com.android.externalstorage.documents/document/primary%3ADownload

事实上,根据文档树访问限制,用户无法选择下载文件夹。

希望它能帮助别人。

© www.soinside.com 2019 - 2024. All rights reserved.