【问题标题】:Issue with adding my FileProvider添加我的 FileProvider 的问题
【发布时间】:2018-06-11 09:23:54
【问题描述】:

如果我尝试像这样添加我的 FileProvider:

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

我遇到了以下问题:

Caused by: java.lang.RuntimeException: Manifest merger failed with multiple errors, see logs
    at com.android.builder.core.AndroidBuilder.mergeManifestsForApplication(AndroidBuilder.java:524)
    at com.android.build.gradle.tasks.MergeManifests.doFullTaskAction(MergeManifests.java:143)
    at com.android.build.gradle.internal.tasks.IncrementalTask.taskAction(IncrementalTask.java:106)
    at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
    at org.gradle.api.internal.project.taskfactory.IncrementalTaskAction.doExecute(IncrementalTaskAction.java:50)
    at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:39)
    at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:26)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.run(ExecuteActionsTaskExecuter.java:131)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:317)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:309)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:185)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:97)
    at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:120)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:99)

如果我删除“authorities”行,我会得到:

 Manifest merger failed : Attribute meta-data#android.support.FILE_PROVIDER_PATHS@resource value=(@xml/provider_paths) from AndroidManifest.xml:374:17-55
is also present at [io.smooch:ui:5.12.5] AndroidManifest.xml:50:17-51 value=(@xml/file_paths).
Suggestion: add 'tools:replace="android:resource"' to <meta-data> element at AndroidManifest.xml:372:13-374:58 to override.

我还添加了'tools:replace="android:resource"',但它又回到了旧错误。我该怎么做才能正确合并它们?

编辑:

这是我的 providers_path.xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path
        name="external_files"
        path="." />
</paths>

这是我需要获取的文件:Environment.getExternalStorageDirectory() + "/Passenger/passenger_log.txt";

我需要在我的提供程序路径中添加什么?试图理解外部路径的逻辑。

此刻我明白了:

06-11 11:30:51.483: E/AndroidRuntime(16656): java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)' on a null object reference
06-11 11:30:51.483: E/AndroidRuntime(16656):    at android.support.v4.content.FileProvider.parsePathStrategy(FileProvider.java:604)
06-11 11:30:51.483: E/AndroidRuntime(16656):    at android.support.v4.content.FileProvider.getPathStrategy(FileProvider.java:578)
06-11 11:30:51.483: E/AndroidRuntime(16656):    at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:416)
06-11 11:30:51.483: E/AndroidRuntime(16656):    at nl.hgrams.passenger.fragments.PSSettingsFragment$3$1$1.onResponse(PSSettingsFragment.java:311)
06-11 11:30:51.483: E/AndroidRuntime(16656):    at nl.hgrams.passenger.utils.Utils$12.onAnimationEnd(Utils.java:552)
06-11 11:30:51.483: E/AndroidRuntime(16656):    at android.view.animation.Animation$3.run(Animation.java:382)
06-11 11:30:51.483: E/AndroidRuntime(16656):    at android.os.Handler.handleCallback(Handler.java:808)
06-11 11:30:51.483: E/AndroidRuntime(16656):    at android.os.Handler.dispatchMessage(Handler.java:101)
06-11 11:30:51.483: E/AndroidRuntime(16656):    at android.os.Looper.loop(Looper.java:166)
06-11 11:30:51.483: E/AndroidRuntime(16656):    at android.app.ActivityThread.main(ActivityThread.java:7425)
06-11 11:30:51.483: E/AndroidRuntime(16656):    at java.lang.reflect.Method.invoke(Native Method)
06-11 11:30:51.483: E/AndroidRuntime(16656):    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
06-11 11:30:51.483: E/AndroidRuntime(16656):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)

此代码导致崩溃,位于 FileProvider 行:

  File file = new File(Environment.getExternalStorageDirectory() + "/Passenger/log.zip");
                            Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
                            emailIntent.setType("plain/text");
                            emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[]{"support@psngr.co"});
                            emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Psngr Android Logs");
                            emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, "Thanks for helping us improve Psngr!\n Please describe the issue you found");
                            emailIntent.putExtra(Intent.EXTRA_STREAM, FileProvider.getUriForFile(getActivity(), Constants.PROVIDER_AUTHORITY, file));
                            startActivity(Intent.createChooser(emailIntent, "Send Feedback..."));
                            PSApplicationClass.getInstance().showSavingPopup = getString(R.string.email_sent);

【问题讨论】:

  • @pskink 感谢学习 总是回答,我确实设法克服了这一点。现在我在获取文件时遇到问题

标签: android merge android-manifest android-fileprovider smooch


【解决方案1】:

在您的代码中 这一行

 android:authorities="${applicationId}.myfileprovider" 

应该替换为

 android:authorities="${applicationId}.provider"

你的xml文件

    <?xml version="1.0" encoding="utf-8"?>
    <paths xmlns:android="http://schemas.android.com/apk/res/android">
        <external-path
            name="external_files"
            path="." />
<root-path
        name="external_files"
        path="/storage/"/>
    </paths>

【讨论】:

  • 它现在可以构建,但我还有另一个问题。我需要在我的提供程序文件中准确放置什么路径?如果这是我的文件路径:files[0] = Environment.getExternalStorageDirectory() + "/Passenger/passenger_log.txt";
  • 还是同样的问题。现在尝试调试。还添加了崩溃的代码
  • 你的路径应该是 Environment.getExternalStorageDirectory().toString() + "/Passenger/passenger_log.txt. 获取外部存储后添加 tostring.. 并尝试在干净构建后运行
  • 我修复了它,并将您的答案标记为正确答案。非常感谢。这真的很有帮助
  • 它救了我的命!一直纠结于如何在xml文件中定义路径,官方文档不清楚。但是设置路径=“。”总是运作良好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-11
  • 1970-01-01
  • 2017-05-19
  • 1970-01-01
  • 2022-11-22
  • 1970-01-01
  • 2016-02-01
相关资源
最近更新 更多