You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 13:53:18