我正试图在Android 11+上的另一个应用程序中打开存储在外部存储根目录中的文件.

FileProvider个文档之后,我编写了以下代码:

AndroidManifest.xml:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application
    android:label="@string/app_name"
    android:requestLegacyExternalStorage="true">

    <activity
        android:name=".MainActivity"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <provider
        android:name="androidx.core.content.FileProvider"
        android:authorities="com.hmdm.fileprovidertest.provider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths"/>
    </provider>

</application>

Res/xml/Provider_paths.xml:

<?xml version="1.0" encoding="utf-8"?>
<paths><external-path name="external_files" path="."/></paths>

MainActivity.java:

private static final String FILE_PATH = "/storage/emulated/0/sample.jpg";
private static final int PERMISSIONS_REQUEST = 1000;
private static final String LOG_TAG = "FileProviderTest";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button button = findViewById(R.id.action);
    button.setOnClickListener(view -> openFile());
}

@Override
protected void onResume() {
    super.onResume();

    if (ContextCompat.checkSelfPermission(
            this, Manifest.permission.READ_EXTERNAL_STORAGE) !=
            PackageManager.PERMISSION_GRANTED) {
        requestPermissions(new String[]{
                Manifest.permission.READ_EXTERNAL_STORAGE
        }, PERMISSIONS_REQUEST);
    }
}

private void openFile() {
    Intent i = new Intent(Intent.ACTION_VIEW);

    Uri uri;
    File file = new File(FILE_PATH);
    try {
        uri = FileProvider.getUriForFile(this, getPackageName() + ".provider", file);
    } catch (/*IllegalArgument*/Exception e) {
        Toast.makeText(this, "Can't get URI for file: " + file.getPath(), Toast.LENGTH_LONG).show();
        return;
    }
    i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

    Log.d(LOG_TAG, "Opening Content Provider URI: " + uri.toString());
    i.setData(uri);
    i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);

    try {
        startActivity(i);
    } catch (ActivityNotFoundException e) {
        Toast.makeText(this, "Failed to find activity for VIEW intent!", Toast.LENGTH_LONG).show();
    } catch (Exception e) {
        Toast.makeText(this, "Exception: " + e.getMessage(), Toast.LENGTH_LONG).show();
    }
}

该项目的完整代码可在此处找到:https://github.com/h-mdm/FileProviderTest

问题是,当我try 为现有图像文件调用OpenFile()方法时,收到来自系统图像查看器的"Media Not Found"消息.

日志(log)cat 将显示以下消息:

Failed to find provider info for com.hmdm.fileprovidertest.provider

该应用程序能够访问该文件(如果您运行该应用程序并创建/storage/emulated/0/sample.jpg文件,则该文件将由该应用程序本身显示).

同样的代码在安卓10及更低版本上运行良好.

我做错了什么?有没有在Android 11+上使用FileProvider的实际例子?

推荐答案

I.setFlages(Inent.Flag_Activity_Clear_TASK)

该语句将覆盖addFlgs()语句,从而覆盖您所授予的读取权限.

互换这些报表.As addFlages()应该是最后一个.

Android相关问答推荐

如何将Hilt添加到Android Studio中的Kotlin项目中?

以编程方式更改Android应用程序上的文件许可

KMM项目生成错误-';在项目';中找不到测试类:共享';

如何在Android Studio中将我的Java-库&库设置为Kotlin库

这款应用与最新版本的Android不兼容.在Android 14中

为什么可以';我不能直接在RecyclerView.ViewHolder中访问视图ID吗?

布局可组合项如何具有可测量和约束参数?

如何使用react native下载android中/data/data/[应用程序包名称文件夹]/files中的文件

在 kotlin 中动态添加 GridView

CoroutineScope 与挂起函数

如何用jetpack compose实现垂直李克特量表

当包含可绘制对象的整数变量传递给 painterResource 函数时,为什么图像不在 Android Studio 中呈现?

我不能在 jetpack Compose 中使用 TextField()(material 3)

java.lang.IllegalArgumentException:与请求匹配的导航目的地 NavDeepLinkRequest

这是 let 函数的正确用法吗?

Android Jetpack Compose - 找不到 R.drawable?

如何在 Jetpack Compose 中擦除画布时变得透明,现在我得到白色?

如何根据加载图像的 colored颜色 绘制边框?

ObjectBox,如何在冲突中放弃一切迁移?

Android TTS 在屏幕关闭一段时间后停止朗读