相关疑难解决方法(0)

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

文档说“调用者可以通过设置文档 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)

android

9
推荐指数
1
解决办法
4541
查看次数

当用户第一次使用我的应用程序时,如何设置 ACTION_OPEN_DOCUMENT_TREE 启动路径?

我见过很多关于设置开始的问题UriIntent.ACTION_OPEN_DOCUMENT_TREE但所有这些都需要一个Uri来自之前使用过该文件夹选择器的问题。

我想要做的是Download在选择文件夹时将我的用户直接发送到该文件夹​​,但我不知道如何转换/storage/emulated/0/DownloadUri可以使用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

8
推荐指数
1
解决办法
2606
查看次数

Android 12 - 存储访问框架/范围存储不再工作

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

6
推荐指数
1
解决办法
5120
查看次数

为 ACTION_OPEN_DOCUMENT 提供默认路径

在我的应用程序中,我想为用户提供一种从 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);\n
Run Code Online (Sandbox Code Playgroud)\n\n

logcat 显示我设置的 URI 是file:///sdcard/Android/data/my.app/files,但文件选择器 UI 默认为共享存储根 ( /sdcard)。

\n\n

以下代码有效(根据文档需要 API 26+,意图可从 API 中获取DocumentsContract.EXTRA_INITIAL_URI):

\n\n
// 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)

android storage-access-framework

5
推荐指数
1
解决办法
4053
查看次数