如何使用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
- Android 13及以上:
操作步骤
步骤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
相关产品推荐
相关产品推荐

