文档说“调用者可以通过
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);
}
}
来自 DocumentsContract.EXTRA_INITIAL_URI:
位置应指定文档 URI 或带有文档 ID 的树 URI。如果此 URI 标识非目录,文档导航器将尝试使用文档的父级作为初始位置。
据我所知
Uri.fromFile
,它需要源自 DocumentsProvider假设
uri
是从 Intent.ACTION_OPEN_DOCUMENT_TREE 中检索的:
DocumentFile file = DocumentFile.fromTreeUri(context, uri);
intent.putExtra(EXTRA_INITIAL_URI, file.getUri());
我可以这样设置:
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 设置为类似:
这可能对某人有帮助:)
我可以使用像这样的默认文件夹(我使用
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
事实上,根据文档树访问限制,用户无法选择下载文件夹。
希望它能帮助别人。