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