文档说“调用者可以通过设置文档 URIEXTRA_INITIAL_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() { …Run Code Online (Sandbox Code Playgroud) 我见过很多关于设置开始的问题Uri,Intent.ACTION_OPEN_DOCUMENT_TREE但所有这些都需要一个Uri来自之前使用过该文件夹选择器的问题。
我想要做的是Download在选择文件夹时将我的用户直接发送到该文件夹,但我不知道如何转换/storage/emulated/0/Download为Uri可以使用DocumentsContract.EXTRA_INITIAL_URI.
有没有办法将任何文件路径转换为DocumentsContract样式Uri?
编辑:为了清楚起见,我正在谈论uri这里传递的内容:
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)
.setFlags(
Intent.FLAG_GRANT_READ_URI_PERMISSION
or Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
)
.putExtra(DocumentsContract.EXTRA_INITIAL_URI, uri)
Run Code Online (Sandbox Code Playgroud) Android 12最近在一些手机上发布,一些用户开始抱怨存储访问:他们无法再向应用程序授予对特定文件夹的访问权限(例如“下载”文件夹)。
该消息表示:“无法使用此文件夹。为了保护您的隐私,请选择其他文件夹”。
这个问题很容易重现,我花了一些时间寻找解决方案,但找不到一个简单的解决方案。
似乎唯一的解决方法是要求完全存储访问(但这不是我想要做的,这很糟糕)或要求用户创建一个新文件夹,这将是用户体验的绝对痛苦。
我不明白的是:Google 是否在没有任何文档的情况下就在 Android 12 上弃用了 SAF?这是一个错误还是一个功能?我真的很困惑那里。Android 11 的迁移已经很痛苦了,现在恐怕 12 会变得更加痛苦。
这是代码,但没什么特别的:
/*
* Requests Scoped Storage access authorization
*/
@RequiresApi(Build.VERSION_CODES.Q)
@JvmStatic
fun requestScopedStorageAccess(activity: Activity, requestCode: Int) {
val storageManager = activity.getSystemService(Context.STORAGE_SERVICE) as StorageManager
val intent = storageManager.primaryStorageVolume.createOpenDocumentTreeIntent()
activity.startActivityForResult(intent, requestCode)
}
Run Code Online (Sandbox Code Playgroud)
我认为值得注意的是,一切都在 Android 10 和 11 上完美运行,因此问题确实与 Android 12 有关。
storage android storage-access-framework scoped-storage android-12
在我的应用程序中,我想为用户提供一种从 app\xe2\x80\x99s 数据目录中选择文件的方法。这是我的代码:
\n\n// use ACTION_OPEN_DOCUMENT because ACTION_GET_CONTENT will give us\n// gallery and other stuff we don\xe2\x80\x99t need\nIntent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);\nintent.addCategory(Intent.CATEGORY_OPENABLE);\nUri uri = Uri.parse(getExternalFilesDir(null).getAbsolutePath());\nLog.d(TAG, "Browsing " + uri.toString());\nintent.setDataAndType(uri, "*/*");\n// show the entire internal storage tree\nintent.putExtra("android.content.extra.SHOW_ADVANCED", true);\nstartActivityForResult(intent, 42);\nRun Code Online (Sandbox Code Playgroud)\n\nlogcat 显示我设置的 URI 是file:///sdcard/Android/data/my.app/files,但文件选择器 UI 默认为共享存储根 ( /sdcard)。
以下代码有效(根据文档需要 API 26+,意图可从 API 中获取DocumentsContract.EXTRA_INITIAL_URI):
// works only with this intent, at the expense of gallery etc. appearing\nIntent intent = new Intent(Intent.ACTION_GET_CONTENT);\nintent.addCategory(Intent.CATEGORY_OPENABLE);\n\n// apparently we need …Run Code Online (Sandbox Code Playgroud)