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

Android(Kotlin):使用FileProvider共享外部存储MP3文件崩溃问题求助

解决MP3文件分享时的UninitializedPropertyAccessException问题

这个崩溃的根源非常清晰:你在MySongAdapter里声明了lateinit var mainAudio: File,但从未将它赋值为当前点击的歌曲对应的MP3文件,所以点击分享按钮时,代码尝试访问一个未初始化的变量,直接触发了异常。

修复步骤:

  1. 确保SongInfo包含歌曲文件的路径
    首先,你的SongInfo类需要存储每个MP3文件的完整路径,这样才能在点击时获取到对应的文件对象。如果SongInfo还没有这个字段,先补充:

    data class SongInfo(
        val Title: String,
        val Author: String,
        val filePath: String // 新增:存储MP3文件的绝对路径
    )
    
  2. 修改分享按钮的点击逻辑
    在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()
        }
    }
    
  3. 清理无用变量
    现在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 21:12:42