Flutter使用share_plus分享网络图片遇PlatformException问题求助
问题
我想通过share_plus插件的shareFiles方法分享一张来自URL的图片,代码如下:
final url = Uri.parse(url); final response = await http.get(url); final bytes = response.bodyBytes; final directory = await getTemporaryDirectory(); final file = File('${directory.path}/tempp.png'); await file.writeAsBytes(bytes); print(file.path); await Share.shareFiles([file.path]);
运行时抛出异常:
PlatformException (PlatformException(error, Failed to find configured root that contains /storage/emulated/0/Android/data/mrblab.news_app/cache/share/tempp.png, null, java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/0/Android/data/mrblab.news_app/cache/share/tempp.png at androidx.core.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:825) at androidx.core.content.FileProvider.getUriForFile(FileProvider.java:450) at io.flutter.plugins.share.Share.getUrisForPaths(Share.java:128) at io.flutter.plugins.share.Share.shareFiles(Share.java:69) at io.flutter.plugins.share.MethodCallHandler.onMethodCall(MethodCallHandler.java:42) at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:258) at io.flutter.embedding.engine.dart.DartMessenger.invokeHandler(DartMessenger.java:295) at io.flutter.embedding.engine.dart.DartMessenger.lambda$dispatchMessageToQueue$0$io-flutter-embedding-engine-dart-DartMessenger(DartMessenger.java:322) at io.flutter.embedding.engine.dart.DartMessenger$$ExternalSyntheticLambda0.run(Unknown Source:12) at android.os.Handler.handleCallback(Handler.java:984) at android.os.Handler.dispatchMessage(Handler.java:104) at android.os.Looper.loopOnce(Looper.java:238) at android.os.Looper.loop(Looper.java:357) at android.app.ActivityThread.main(ActivityThread.java:8149) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:957) ))
已在AndroidManifest.xml中配置了READ和WRITE权限,并且创建了provider_paths.xml:
<?xml version="1.0" encoding="utf-8"?> <paths> <cache-path name="share" path="." /> </paths>
请问该如何解决这个问题?
解决方案
这个问题核心是FileProvider的路径配置与实际文件路径不匹配,按以下步骤修复:
修正provider_paths.xml的路径配置
异常显示文件实际路径是/storage/emulated/0/Android/data/mrblab.news_app/cache/share/tempp.png,说明文件存放在缓存目录下的share子文件夹,但当前cache-path的path="."仅指向缓存根目录。修改配置:<?xml version="1.0" encoding="utf-8"?> <paths> <cache-path name="share" path="share/" /> </paths>若代码中并未主动创建
share子目录,可能是插件内部自动添加了该路径,此时也可以调整代码里的文件保存路径,直接存到缓存根目录:final file = File('${directory.path}/tempp.png');确认AndroidManifest.xml的FileProvider配置正确
确保provider的android:authorities为应用包名加.fileprovider,且关联了正确的provider_paths.xml:<application> ... <provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths" /> </provider> </application>清理并重建项目
修改配置后执行flutter clean,再重新运行项目,避免旧配置缓存导致问题。
另外,Android 10及以上版本启用了Scoped Storage,WRITE_EXTERNAL_STORAGE权限已不再需要,可移除该权限以简化配置。
内容的提问来源于stack exchange,提问作者Saya
相关产品推荐
相关产品推荐

