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

如何使用MediaStore.createDeleteRequest删除MP3音乐文件?

使用MediaStore.createDeleteRequest()删除MP3文件实操示例

前置说明

  • 适用系统版本:Android 11(API Level 30)及以上
  • 需提前申请权限:
    • Android 13及以上:android.permission.READ_MEDIA_AUDIO
    • Android 12及以下:android.permission.READ_EXTERNAL_STORAGE

操作步骤

步骤1:查询获取目标MP3对应的MediaStore Uri

公共媒体库的音频文件需通过ContentResolver查询获取对应Content Uri,不能直接用文件路径调用删除接口,示例代码如下:

import android.content.Context
import android.net.Uri
import android.provider.ContentUris
import android.provider.MediaStore

fun getMp3ContentUri(context: Context, mp3FilePath: String): Uri? {
    val contentResolver = context.contentResolver
    // 仅查询文件ID即可拼接得到Content Uri
    val projection = arrayOf(MediaStore.Audio.Media._ID)
    val selection = "${MediaStore.Audio.Media.DATA} = ?"
    val selectionArgs = arrayOf(mp3FilePath)

    contentResolver.query(
        MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
        projection,
        selection,
        selectionArgs,
        null
    )?.use { cursor ->
        if (cursor.moveToFirst()) {
            val audioId = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID))
            return ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, audioId)
        }
    }
    return null
}

步骤2:构建删除请求并触发用户确认

MediaStore.createDeleteRequest()会返回系统删除弹窗的PendingIntent,调用后需等待用户确认,系统会执行实际的删除操作,推荐使用Activity Result API实现回调处理,示例代码如下:

import android.app.Activity
import android.content.Context
import android.content.IntentSender
import android.os.Bundle
import android.widget.Toast
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.IntentSenderRequest

class YourActivity : AppCompatActivity() {
    // 注册删除结果回调
    private lateinit var deleteMp3Launcher: ActivityResultLauncher<IntentSenderRequest>

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // 初始化回调
        deleteMp3Launcher = registerForActivityResult(ActivityResultContracts.StartIntentSenderForResult()) { result ->
            if (result.resultCode == Activity.RESULT_OK) {
                Toast.makeText(this, "MP3文件删除成功", Toast.LENGTH_SHORT).show()
            } else {
                Toast.makeText(this, "已取消删除操作", Toast.LENGTH_SHORT).show()
            }
        }
    }

    // 调用删除方法,支持单文件/批量文件删除
    fun deleteMp3Files(targetAudioUris: List<Uri>) {
        val deletePendingIntent = MediaStore.createDeleteRequest(contentResolver, targetAudioUris)
        val intentSenderRequest = IntentSenderRequest.Builder(deletePendingIntent.intentSender).build()
        deleteMp3Launcher.launch(intentSenderRequest)
    }
}

注意事项

  • 单次调用可传入多个音频Uri实现批量删除,只需将所有目标文件的Content Uri放入传入的List即可
  • 无需申请MANAGE_EXTERNAL_STORAGE特殊权限,仅需基础的音频读取权限即可完成流程
  • 若目标MP3文件存放在你的应用私有目录(/sdcard/Android/data/[你的包名]/下),可直接通过File.delete()删除,无需调用该接口
  • Android 10(API Level 29)不支持该接口,可在Manifest的application节点添加android:requestLegacyExternalStorage="true"启用旧版存储权限兼容,使用File API删除
  • 其他应用生成的公共目录MP3文件,删除必须经过用户弹窗确认,无法实现静默删除,属于分区存储的固有安全限制

内容的提问来源于stack exchange,提问作者namanop

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 10:39:02