【问题标题】:Android Cursor can't find mp3 file after I rename it重命名后,Android Cursor 找不到 mp3 文件
【发布时间】:2021-06-03 09:33:51
【问题描述】:

我正在开发 Mp3 播放器。我正在为此使用 curosr 。我的问题是重命名 pm3 文件后,光标无法找到该 mp3 文件。我查看了放置 mp3 文件的文件夹并对其进行了重命名。你有什么主意吗?我正在用光标获取音乐:

@RequiresApi(Build.VERSION_CODES.Q)
private fun getAllAudio(): ArrayList<Music> {
    val tempAudioList = ArrayList<Music>()
    val selection = MediaStore.Audio.Media.IS_MUSIC + " != 0"
    val uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
    Log.d("SONGS", uri.path!!)
    val projection = arrayOf(
        MediaStore.Audio.Media.DATA,
        MediaStore.Audio.Media.DISPLAY_NAME,
        MediaStore.Audio.Media.ARTIST,
        MediaStore.Audio.Media.ALBUM,
        MediaStore.Audio.Media.DURATION,
        MediaStore.Audio.Media.SIZE,
        MediaStore.Audio.Media._ID
    )
    val cursor = this.contentResolver.query(
        uri,
        projection,
        selection,
        null,
        null
    )
    if (cursor != null) {
        while (cursor.moveToNext()) {
            val path = cursor.getString(0)
            val title = cursor.getString(1)
            val artist = cursor.getString(2)
            val album = cursor.getString(3)
            val duration = cursor.getString(4)
            val size = cursor.getString(5)
            val id = cursor.getString(6)
            val art = getAlbumArt(path)

            val file = File(path)
            Log.d("ALLSONGS", path)

            if (file.exists()) {

                val musicFiles = Music(path, title, artist, album, duration, size, id, art)
                tempAudioList.add(musicFiles)
            }
        }
        cursor.close()
    }
    return tempAudioList
}

我正在请求权限:

 private fun askStoragePermissions() {
    Dexter.withActivity(this)
        .withPermissions(
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
        )
        .withListener(object : MultiplePermissionsListener {
            @RequiresApi(Build.VERSION_CODES.Q)
            override fun onPermissionsChecked(report: MultiplePermissionsReport?) {
                if (report!!.areAllPermissionsGranted()) {
                    Log.d("MAIN_ACTIVITY", "Permission granted")
                    musicList = getAllAudio()
                }

                if (report.isAnyPermissionPermanentlyDenied) {

                }
            }

            override fun onPermissionRationaleShouldBeShown(
                permissions: MutableList<PermissionRequest>?,
                token: PermissionToken?
            ) {
                token!!.continuePermissionRequest()
            }
        })
        .onSameThread()
        .check()
}

清单:

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />

重命名文件:

val newName = mView.edit_txt_new_title.text.toString()
        val path = ArrayList(music.path.split('/'))
        path[path.size - 1] = newName
        var newPath = ""
        for (i in 0 until path.size - 1) {
            newPath += "${path[i]}/"
        }

        newPath += "$newName.mp3"

        val file = File(music.path)
        if (file.renameTo(File(newPath)))
            if (File(newPath).renameTo(File(newPath)))
            Toast.makeText(context, "DONE", Toast.LENGTH_LONG).show()
        Log.d("RENAME", "$newPath -- ${music.path}")

【问题讨论】:

  • 如果您按照上面所说的将其重命名为 pm3,则可能会这样做。 :) 话虽如此,细节缺失。您打开文件并开始播放,然后重命名它却找不到?或者确切的情况是什么?我很难确定事件的顺序。

标签: android kotlin rename mp3 audio-player


【解决方案1】:

重命名文件后,您必须更新 MediaStore 才能在文件重命名成功时使用以下方法:

  private fun updateMediaStore(music_Id: String, newPath: String, newName: String) {
        val values = ContentValues()
        values.put(MediaStore.Audio.Media.DATA, newPath)
        values.put(MediaStore.Audio.Media.DISPLAY_NAME, newName)
        val uri = ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, music_Id.toLong())
        contentResolver.update(uri, values, null, null)
    }

在上面的方法中我更新了路径和显示名称,你可以在这里使用:

/*
rest of your code
*/

 val file = File(music.path)
 if (file.renameTo(File(newPath)))
     if (File(newPath).renameTo(File(newPath))) {
         Log.d("RENAME", "$newPath -- ${music.path}")
         Toast.makeText(context, "DONE", Toast.LENGTH_LONG).show()
         updateMediaStore(music.id,newPath,newName)
    }

【讨论】:

  • 天啊!我很感激。我永远不会自己弄清楚。 :D
  • 如果您在代码中注意到它会显示整个列表,但在将其添加到列表之前,您会检查文件是否存在,因此在不更新媒体存储的情况下,您总是检查旧版本
  • 一件事当你创建一个新文件时记得添加文件扩展名并不总是“mp3”你可以用 MediaStore.Audio.Media.MIME_TYPE 做到这一点
  • 是的,我试图删除文件,但没有正确删除:stackoverflow.com/questions/66229075/…
  • 但多亏了你,我知道删除文件后我需要更新 MediaStore。
猜你喜欢
  • 1970-01-01
  • 2011-12-29
  • 1970-01-01
  • 2017-01-04
  • 1970-01-01
  • 2014-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多