我想在我的应用程序中执行以下操作。首先我需要登录。然后,登录后我退出了我的应用程序。但它在后台运行。登录记录仍然保留。然后我需要从文件浏览器中选择一个文件。选择文件后,我按共享选项。然后我选择我的应用程序对文件进行一些操作。在对文件进行操作后,我将其记录到缓存中。然后我想在其他一些合适的应用程序上打开这个文件。我可以执行所有这些操作,但是在调用 getUriForFile 方法时出现问题。

String mimeType = getMimeType(fileUri);//returns mime type

File imagePath = new File(context.getCacheDir(), "/");
String fileUriStr = fileUri.getLastPathSegment();
File newFile = new File(imagePath, fileUriStr);
try {
     newFile.createNewFile();
} catch (IOException e) {
            e.printStackTrace();
}
uri = FileProvider.getUriForFile(context, context.getPackageName(), newFile);

在 Manifest 中,我添加了一个 fileProvider。
<activity
    android:name=".MainActivity"
    android:label="@string/app_name">

    <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="${applicationId}.share"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths" />
    </provider>

    <!--Normal way opener -->
    <intent-filter android:label="appName">
        <action android:name="android.intent.action.MAIN" />
    </intent-filter>

    <!--From share options opener -->
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <action android:name="android.intent.action.SEND_MULTIPLE" />

        <category android:name="android.intent.category.DEFAULT" />

        <data android:mimeType="*/*" />
    </intent-filter>
</activity>

在 file_paths.xml 我有以下代码:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <cache-path name="cache_docs" path="data/data/com.app.firm.app/cache" />

</paths>

我打开了 FileProvider.java 文件。我从以下位置收到错误:
final ProviderInfo info = context.getPackageManager()
                .resolveContentProvider(authority, PackageManager.GET_META_DATA);
        final XmlResourceParser in = info.loadXmlMetaData(
                context.getPackageManager(), META_DATA_FILE_PROVIDER_PATHS);
        if (in == null) {
            throw new IllegalArgumentException(
                    "Missing " + META_DATA_FILE_PROVIDER_PATHS + " meta-data");
        }

info 参数为空。所以当程序调用 info.loadXmlMetaData 时,它会得到空指针异常。所以 context.getPackageManager 返回 null。请记住,当时我有两个应用程序同时运行。遵循自然流程之一(即 -> 登录和主要 Activity )。另一个只是从 MainActivity 打开。 context.getPackageManager 从第二个正在运行的应用程序调用。请帮我

最佳答案

我知道如何解决这个问题,我想我可以帮助你。

也许你有两个 <provider> ,一个在 Lib 中,一个在你的项目中

您可以自定义类扩展 FileProvider ,并将 <provide> 名称标签更改为您的自定义 FileProvider :

<provider
    android:name="XXXX.YourCustomFileProvider"
    android:authorities="${applicationId}.share"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths" />
</provider>

而问题将得到解决。

谢谢!

关于Android resolveContentProvider 返回 null,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39200483/

10-13 04:29