Android分享APK时文件名显示为“untitled”的问题求助(附代码)
解决APK分享时文件名变为“untitled”的问题
嘿,我来帮你搞定这个分享APK时文件名变“untitled”的问题!
为啥会出现这个问题?
你直接用app.publicSourceDir生成的file://类型Uri去分享,接收方的应用没法从这个Uri里正确解析出原APK的文件名,所以就默认显示成“untitled”了。而且在Android 7.0及以上版本,直接分享file:// Uri还会触发FileUriExposedException的安全问题,所以得用FileProvider来做正确的文件分享,同时明确指定文件名。
一步步解决:
先在AndroidManifest里注册FileProvider
打开你的AndroidManifest.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/file_paths" /> </provider>要是你用的是旧的support库,就把
androidx.core.content.FileProvider换成android.support.v4.content.FileProvider就行。创建file_paths.xml配置文件
在res/xml目录下新建一个file_paths.xml文件(没有xml目录就自己建一个),把下面的内容放进去,用来指定我们要分享的APK文件路径:<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <!-- Android 10及以上推荐用这个,对应应用的安装目录 --> <application-path name="app_apk" path="." /> <!-- 低版本可以用这个替代 --> <!-- <files-path name="apk_files" path="." /> --> </paths>修改分享按钮的代码逻辑
把你原来的点击事件代码换成下面这段,用FileProvider生成安全的内容Uri,同时明确传递原文件名:btnShare.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ApplicationInfo app = getApplicationContext().getApplicationInfo(); // 把路径转成File对象,方便后续操作 File apkFile = new File(app.publicSourceDir); // 用FileProvider生成符合安全规范的Uri Uri apkUri = FileProvider.getUriForFile( getApplicationContext(), getPackageName() + ".fileprovider", // 这里要和Manifest里的authorities一致 apkFile ); Intent sharingIntent = new Intent(Intent.ACTION_SEND); // 指定APK的MIME类型 sharingIntent.setType("application/vnd.android.package-archive"); // 传递文件Uri sharingIntent.putExtra(Intent.EXTRA_STREAM, apkUri); // 把原文件名传进去,让分享应用能正确显示 sharingIntent.putExtra(Intent.EXTRA_SUBJECT, apkFile.getName()); // 给接收应用临时的读取权限,不然对方拿不到文件 sharingIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // 弹出分享选择器 startActivity(Intent.createChooser(sharingIntent, "分享APK")); } });
几个关键点要注意:
- FileProvider是必须的:这是Android官方推荐的安全文件分享方式,既解决了文件名的问题,也避免了高版本系统的安全异常。
- 文件名的传递:通过
Intent.EXTRA_SUBJECT把原文件名传给接收方,大部分分享应用都会读取这个字段来显示文件名,配合FileProvider的Uri,就能完美保留原文件名了。 - 权限不能忘:一定要加
Intent.FLAG_GRANT_READ_URI_PERMISSION,不然接收应用会没有权限访问这个APK文件,分享就会失败。
这么改完之后,你再分享APK的时候,就能看到原文件名啦,同时也兼容各个Android版本~
内容的提问来源于stack exchange,提问作者ArjunPatidar
相关产品推荐
相关产品推荐

