如何在Ionic 3中使用Social Share Cordova插件及本地文件分享问题
解决分享
file://路径图片时只传URL而非文件的问题 这个问题我之前帮不少开发者和普通用户解决过——本质是系统的分享机制没法直接把file://协议的路径识别成可传输的文件对象,得换个正确的姿势来操作。下面分两种场景给你具体方案:
一、如果你是普通用户手动分享
- 别直接复制那个
file://链接去分享,先打开手机的文件管理器,找到storage/emulated/0/TheFolder这个文件夹,长按thefile.ext这个图片文件,然后选系统自带的「分享」选项,这样系统会直接把文件本身作为分享内容,而不是一串链接。 - 如果是在某个APP里看到这个链接没法直接找文件,你可以在文件管理器的搜索栏输入
thefile.ext,快速定位到文件后再按上面的方式分享。
二、如果你是开发者在代码里实现分享
在Android平台上,从7.0版本开始,系统就禁止APP之间直接传递file://类型的Uri了,会触发安全限制,导致接收方只能拿到文本链接而非文件。正确的做法是用FileProvider生成可授权的Content Uri:
- 先在
AndroidManifest.xml里注册FileProvider:
<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/file_paths" /> </provider>
- 在
res/xml目录下创建file_paths.xml,配置允许分享的文件路径:
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 如果你只分享TheFolder里的文件,用这个配置 --> <external-path name="the_folder" path="TheFolder/" /> <!-- 如果需要分享整个外部存储的文件,用这个 --> <external-path name="external_root" path="." /> </paths>
- 最后在代码里生成Content Uri并发起分享:
// 定位到目标文件 File targetImage = new File(Environment.getExternalStorageDirectory(), "TheFolder/thefile.ext"); // 生成可授权的Content Uri Uri shareUri = FileProvider.getUriForFile(context, context.getPackageName() + ".fileprovider", targetImage); // 创建分享Intent Intent shareIntent = new Intent(Intent.ACTION_SEND); shareIntent.setType("image/*"); // 根据文件类型修改,比如图片是image/*,视频是video/* shareIntent.putExtra(Intent.EXTRA_STREAM, shareUri); // 给接收分享的APP临时授权读取权限 shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // 启动分享选择器 context.startActivity(Intent.createChooser(shareIntent, "选择分享方式"));
额外提醒:如果是Android 10及以上版本,还要注意适配Scoped Storage机制,如果文件不在APP的私有目录里,可能需要通过MediaStore来获取文件的Content Uri,避免权限问题。
内容的提问来源于stack exchange,提问作者EMRADE
相关产品推荐
相关产品推荐

