Android(Kotlin):使用FileProvider共享外部存储MP3文件崩溃问题求助
解决MP3文件分享时的
UninitializedPropertyAccessException问题 这个崩溃的根源非常清晰:你在MySongAdapter里声明了lateinit var mainAudio: File,但从未将它赋值为当前点击的歌曲对应的MP3文件,所以点击分享按钮时,代码尝试访问一个未初始化的变量,直接触发了异常。
修复步骤:
确保
SongInfo包含歌曲文件的路径
首先,你的SongInfo类需要存储每个MP3文件的完整路径,这样才能在点击时获取到对应的文件对象。如果SongInfo还没有这个字段,先补充:data class SongInfo( val Title: String, val Author: String, val filePath: String // 新增:存储MP3文件的绝对路径 )修改分享按钮的点击逻辑
在getView方法中,点击分享按钮时,直接通过当前SongInfo对象获取文件路径,创建对应的File实例,替代原来未初始化的mainAudio:myview.share_button.setOnClickListener { // 根据当前歌曲的路径创建File对象 val songFile = File(song.filePath) // 先检查文件是否存在,避免后续抛出FileNotFoundException if (songFile.exists()) { val path = FileProvider.getUriForFile(this@MainActivity, authorities, songFile) val shareIntent = Intent() shareIntent.action = Intent.ACTION_SEND shareIntent.putExtra(Intent.EXTRA_STREAM, path) // 给目标应用授予临时读取权限 shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 使用更精确的MIME类型,比audio/*更利于目标应用识别 shareIntent.type = "audio/mpeg" startActivity(Intent.createChooser(shareIntent, "Share...")) } else { // 文件不存在时给用户提示 Toast.makeText(this@MainActivity, "该音频文件不存在,无法分享", Toast.LENGTH_SHORT).show() } }清理无用变量
现在mainAudio已经没用了,可以直接从Adapter里删除这个未初始化的变量,避免后续混淆。
额外注意事项:
- FileProvider配置检查:确保你已经在
AndroidManifest.xml中正确注册了FileProvider,并且res/xml/file_paths.xml包含了外部存储的访问路径:<!-- AndroidManifest.xml中的FileProvider注册 --> <provider android:name="androidx.core.content.FileProvider" android:authorities="com.example.loadmedia_sdcard_demo.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"> <!-- 允许访问外部存储的所有文件 --> <external-path name="external_files" path="." /> </paths> - Scoped Storage权限:如果你的应用目标SDK是Android 10(API 29)及以上,确保已经申请了
READ_EXTERNAL_STORAGE权限(动态申请+Manifest声明),或者改用MediaStoreAPI来获取音频文件,避免Scoped Storage的限制。
内容的提问来源于stack exchange,提问作者Atenea
相关产品推荐
相关产品推荐

