首页 > 其他分享 >RK3588解决无法音乐/相册等无法同步问题

RK3588解决无法音乐/相册等无法同步问题

时间:2023-11-14 20:24:34浏览次数:46  
标签:相册 RK3588 Media sdcard cursor Music 无法 Audio MediaStore

RK3588解决无法音乐/相册等无法同步问题

 

背景

 

最近在做一个项目的时候发现音乐APP无法自动识别设备中的音频,这个APP是芯片厂商写的,可能由于年代久远,有这种奇怪的bug。复现步骤如下:1、使用adb push音频文件到/sdcard/Music/文件夹下或使用文件管理器从外部设备(如U盘)将音频文件复制到/sdcard/Music/文件夹中。2、打开音乐APP,发现找不到任何音频文件。

 

神奇的是,它可以识别到U盘内的音频文件,如果复制到/sdcard/Music/文件夹后重启,重启后又可以查找到/sdcard/Music/中的音频文件了。我一开始以为是APP初始化时会去扫描,因此将该APP进程kill掉,再启动发现依旧查找不到任何音频文件,这就说明是重启时有我不知道的地方帮我做了同步的功能。因此写了一个简易的demo来进行测试。

 

排查过程

 

先看一下是如何查询系统中的音乐文件的。下面是我写的一个方法,与源码方法基本一样,其中Music是一个data class

 

查询音乐代码

 

fun initMusicList(context: Context): List<Music> {
        val musicList = ArrayList<Music>()
        val cols = arrayOf(
            MediaStore.Audio.Media.DISPLAY_NAME,
            MediaStore.Audio.Media.ALBUM,
            MediaStore.Audio.Media.DURATION
        )
        val uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI

        val cursor = context.contentResolver.query(
            uri,
            cols,
            null,
            null,
            MediaStore.Audio.Media.DEFAULT_SORT_ORDER
        )

        if (cursor != null && cursor.moveToFirst()) {
            do {
                val music = Music(
                    cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME)),
                    cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM)),
                    cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION))
                )
                musicList.add(music)
            } while (cursor.moveToNext())
            cursor.close()
        }

        return musicList
    }

 

我用了一个简易的RecyclerView用于展示读取到的信息,/sdcard/Music/中的文件内容与RecyclerView所得到的内容如下

 

 

现在一切正常,是吧。那让我们添加一个音乐到/sdcard/Music/文件夹下看看会怎么样:

 

可以看到我已经把我们的app给kill掉了

神奇的事情来了:重新打开APP后,它依旧只有三首歌,这说明我们新添加的3.wma这首歌没有被识别到MediaStore.Audio.Media.EXTERNAL_CONTENT_URI路径中。

 

这时候我们只需要执行以下命令就可以了:

adb shell am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_FILE -d file:///sdcard/Music/

不难理解,这就是一个让设备在我们所指定的文件夹/sdcard/Music/下查找媒体文件的命令,这里的/sdcard/Music/可以根据实际需要进行改变。这样我们就能把刚添加的音频文件“刷新” 到媒体库了。那么如何在代码中使用呢?可以参考下面的方法:

Java版本

private void syncMusic(Context context) {
    String path = Environment.getExternalStorageDirectory().getPath() +
            File.separator + "Music";
    context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
            Uri.fromFile(new File(path))));
}

Kotlin版本

private fun syncMusic(context: Context) {
        val path = Environment.getExternalStorageDirectory().path + File.separator + "Music"
        context.sendBroadcast(Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(File(path))))
    }

 

在你的Activity、Fragment等有context的地方调用,但是需要注意的是,这是一个耗时方法,因此我们最好是开一个工作线程去执行它。

标签:相册,RK3588,Media,sdcard,cursor,Music,无法,Audio,MediaStore
From: https://www.cnblogs.com/ZJHqs/p/17832429.html

相关文章

  • ES6的箭头函数,箭头函数不会创造块作用域,无法生成一个独立的环境,this指向上层的this
    varcolor='green';vartest4399={color:'blue',getColor:function(){varcolor="red";alert(this.color);}}vargetColor=test4399.getColor;getColor();test4399.getColor();以上JavaScrip......
  • 迅为iTOPRK3588开发板系统定制(无法联网)
    在上一个小节中讲解了ubuntu和debian文件系统的定制,但那是在可以运行脚本正常构建系统的前提下,而本小节则是针对部分特殊用户无法联网的情况。在source目录下存放了已经构建完成的压缩包,如下图所示:然后使用以下命令将该压缩包解压到build目录下,解压完成如下图所示:tar-......
  • 视频直播点播平台EasyDSS无法删除分组,如何解决?
    EasyDSS视频推拉流平台可支持用户自行上传视频文件,也可将上传的点播文件作为虚拟直播进行播放。平台能支持多屏播放,可兼容Windows、Android、iOS、Mac等操作系统,还能支持CDN转推,具备较强的可拓展性与灵活性。有用户反馈,在EasyDSS上可以创建分组但删除分组时会提示无权操作,求助我们......
  • 亚马逊云服务器aws ssh无法登录的解决问题记录
    一、涉及命令1、备份原sshd配置文件cp/etc/ssh/sshd_config/etc/ssh/sshd_config.backup2、修改sshd配置文件:/etc/ssh/sshd_config3、查看当前活跃的用户列表:w4、查看用户:cat/etc/passwd#对于cat/etc/passwd的替换,可以更精简cat/etc/passwd|grep-vnologi......
  • SDL2 无法解析的外部符号 main,函数 "int __cdecl invoke_main(void)" (?invoke_main@@
    一、概述在使用VisualStudio+CMake集成SDL2的过程中。运行一个Demo示例出现了以下错误提示无法解析的外部符号main,函数"int__cdeclinvoke_main(void)"(?invoke_main@@YAHXZ) 二、解决办法上面问题的主要原因是程序找不到入口函数因为SDL中自己也定义了......
  • tmdb 无法连接 修改host可解决 (2023/11/14)
    tinyMediaManager的刮削服务总是失败,根本原因在于tmdb网站的DNS地址无法解析。解决方法:手动修改DNS。作者:PH34Rhttps://www.bilibili.com/read/cv18215732/?spm_id_from=333.999.collection.opus.click出处:bilibili通过 https://dnschecker.org/ 查询上述三个地址,选择在......
  • Mac Os VS Code 无法升级Cannot update while running on a read-only volume.
    macOSVSCode无法升级,提示“Cannotupdatewhilerunningonaread-onlyvolume“错误提示错误如下:Cannotupdatewhilerunningonaread-onlyvolume.Theapplicationisonaread-onlyvolume.Pleasemovetheapplicationandtryagain.Ifyou’reonmacOSSierr......
  • 无法访问 Maven 3.8.1 http 仓库。
    无法访问Maven3.8.1http仓库。idea显示可能的解决方案:检查Mavensettings.xml是否不包含http仓库检查Mavenpom文件是否不包含http仓库 http://maven.aliyun.com/nexus/content/groups/public/在Mavensettings.xml中为 http://maven.aliyun.com/nexus/con......
  • v-model添加number修饰符,如果这个值无法被parseFloat()解析,则会返回原始的值。
    在默认情况下,v-model在每次input事件触发后将输入框的值与数据进行同步。你可以添加lazy修饰符,从而转为在change事件_之后_进行同步:如果想自动将用户的输入值转为数值类型,可以给v-model添加number修饰符:如果这个值无法被parseFloat()解析,则会返回原始的值。......
  • 电脑开机无法正常进入桌面,或者莫名纯色卡死
    控制面板\系统和安全\安全和维护\可靠性监视程序  查看最近更新了哪些:      卸载更新后貌似会自动安装上,所以最好清理以下已经下载好的更新文件:   ......