繁体   English   中英

使用API​​ 24+上的Uri通过Intent打开文件

[英]Opening File via Intent using Uri on API 24+

我有一个应该在设备上打开图像文件的按钮。 它在API 24以下可以正常工作,但在API 24及以上版本上会崩溃。 我遵循了API 24+的教程,但是仍然崩溃,我也不知道为什么。

Intent intent = new Intent(Intent.ACTION_VIEW);
if(android.os.Build.VERSION.SDK_INT >=24) {
    fileURI = FileProvider.getUriForFile(context,
        "com.example.android.provider",
        localFile);
    intent.setDataAndType(fileURI, "image/jpeg");
} else {
    intent.setDataAndType(Uri.fromFile(localFile), "image/jpeg");
}
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_GRANT_READ_URI_PERMISSION);
context.startActivity(intent);

清单文件:

<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="com.example.android.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths2"/>
</provider>

file_paths2.xml:

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="external_files" path="."/>
</paths>

我没头绪

日志:

11-10 19:59:08.052 21800-21800/com.yannick.mychatapp E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.yannick.mychatapp, PID: 21800
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
    at android.support.v4.content.FileProvider.parsePathStrategy(FileProvider.java:605)
    at android.support.v4.content.FileProvider.getPathStrategy(FileProvider.java:579)
    at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:417)
    at com.yannick.mychatapp.ChatRoom$17$1.onClick(ChatRoom.java:936)
    at android.support.design.widget.Snackbar$1.onClick(Snackbar.java:317)
    at android.view.View.performClick(View.java:6597)
    at android.view.View.performClickInternal(View.java:6574)
    at android.view.View.access$3100(View.java:778)
    at android.view.View$PerformClick.run(View.java:25885)
    at android.os.Handler.handleCallback(Handler.java:873)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6669)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
fileURI = FileProvider.getUriForFile(context,
    "com.example.android.provider",
    localFile);

在这里,您使用com.example.android.provider

<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="com.example.android.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths2"/>
</provider>

在这里,您使用com.example.android.fileprovider

这些不一样。 它们必须相同。 而且,它们需要针对您的应用特定。 根据您自己的应用程序的包名称使用某些内容,并在两个位置使用相同的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM