联想K3 Note相机文件分享失败:找不到配置根目录异常
解决联想K3 Note上无法分享相机文件夹文件的问题
兄弟,你这个问题我之前也碰到过,核心就是FileProvider的路径配置没覆盖到相机照片所在的目录。从报错的路径/storage/9016-4EF8/DCIM/Camera/IMG_20180317_111252.jpg能看出来,照片存在外部存储(大概率是SD卡)的DCIM/Camera目录里,但你现在的file_paths.xml不仅没配置这个路径,甚至代码都没写完(<external-path nam这里断了),难怪FileProvider找不到对应的根目录映射。
第一步:修复你的file_paths.xml配置
直接把配置改成下面这样,覆盖相机相关的外部存储路径:
<?xml version="1.0" encoding="utf-8"?> <paths> <!-- 应用内部存储的Camera目录 --> <files-path name="Camera" path="/Camera/" /> <!-- 应用内部存储根目录 --> <files-path name="Files" path="." /> <!-- 外部存储的Download目录 --> <external-path name="Downloads" path="/Download/" /> <!-- 适配外部存储的DCIM/Camera公共目录 --> <external-path name="External_Camera" path="/DCIM/Camera/" /> <!-- 兼容SD卡这类可移除存储的相机目录 --> <external-files-path name="SD_Camera" path="/DCIM/Camera/" /> </paths>
这里加了两个关键配置:
<external-path>对应设备的公共外部存储(比如/storage/emulated/0/DCIM/Camera/)<external-files-path>对应应用在可移除存储上的私有目录,刚好适配联想K3 Note的SD卡路径
第二步:正确生成分享用的Uri
分享时一定要用FileProvider生成合法的Uri,不能直接用文件路径,示例代码如下:
// 替换成你的相机文件路径,或者用API动态获取更稳妥 File cameraPhoto = new File("/storage/9016-4EF8/DCIM/Camera/IMG_20180317_111252.jpg"); // 注意替换成你在Manifest里注册的FileProvider authorities Uri shareUri = FileProvider.getUriForFile(this, "com.your.package.fileprovider", cameraPhoto); // 构建分享Intent Intent shareIntent = new Intent(Intent.ACTION_SEND); shareIntent.setType("image/jpeg"); shareIntent.putExtra(Intent.EXTRA_STREAM, shareUri); // 必须加上这句,授予接收方临时读取权限 shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // 启动分享选择器 startActivity(Intent.createChooser(shareIntent, "分享照片"));
额外提醒
- 确保你已经在
AndroidManifest.xml里正确注册了FileProvider,示例注册代码:
<provider android:name="androidx.core.content.FileProvider" android:authorities="com.your.package.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider>
- 如果你是Android 6.0及以上系统,别忘了申请
READ_EXTERNAL_STORAGE权限,动态申请或者在Manifest里声明都可以。 - 动态获取相机路径更稳妥,比如用
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) + "/Camera/",避免硬编码路径适配问题。
内容的提问来源于stack exchange,提问作者Gunaseelan
相关产品推荐
相关产品推荐

