安卓 - 如何获取系统音频的位置

3

目前,我正在避免在查询ContentResolver时通过在SQLite NOT LIKE ...语句中硬编码它们来加载设备和模拟器的系统音频,但是,我发现不同的安卓设备中存储系统音频(如闹钟铃声和所有出厂载入的音频)的位置并没有统一的标准。

因此,为了避免加载所有系统音频,我需要找到获取这些音频所在目录的方法。到目前为止,我已经收集了这些系统音频可能存在的位置数据:

"/system%",
"/storage/emulated/legacy/Ringtones/%",
"/storage/emulated/0/Ringtones%",
"/product/media/audio%"  

但是,由于这些可能不足够,是否有一种方法可以获取Android系统中音频文件所在的目录路径?

3个回答

3
使用 MediaStore 查询音频文件,然后使用 AudioColumns 进行过滤,对于闹钟声音,可以更具体地使用 IS_ALARM
正如您所说:

我发现在所有 Android 设备中,系统音频存储的位置没有标准位置。

MediaStore 是一个数据库,它保存文件的引用,并且是查询不同系统存储位置中的文件的解决方案。

你好,谢谢你的回答,它给了我一些想法,但如果可以的话,你能否发布一小段代码来说明如何实现吗? - juztcode

2
您可以使用类似如下的方式:

您可以像这样使用:

String[] mProjection =
                {
                        MediaStore.Audio.Media._ID,
                        MediaStore.Audio.Media.DATA,       # path
                        MediaStore.Audio.Media.IS_ALARM,   
                        MediaStore.Audio.Media.DURATION,   
                        MediaStore.Audio.Media.SIZE
                };
Cursor mCursor = getContentResolver().query(MediaStore.Audio.Media.INTERNAL_CONTENT_URI,
                mProjection,
                null,
                null);

注意:对于外部存储使用:MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
int index_data = mCursor.getColumnIndex(MediaStore.Audio.Media.DATA);

if (mCursor != null) {
    while (mCursor.moveToNext()) {

        // Gets the value from the column.
        newData = mCursor.getString(index_data);

        // Insert code here to process the retrieved data.

        // end of while loop
    }
} else {

    // Insert code here to report an error if the cursor is null or the provider threw an exception.
}

References:

https://developer.android.com/guide/topics/providers/content-provider-basics#java

https://dev59.com/HL3pa4cB1Zd3GeqPmNbY#64539937


内部存储位置似乎与系统音频的存储位置不同。 - juztcode

1

在片段中列出所有警报的代码:

override fun onAttach(context: Context) {
        super.onAttach(context)
        val projection = arrayOf(
            MediaStore.Audio.Media.IS_ALARM,
            MediaStore.Audio.Media.DISPLAY_NAME,
            MediaStore.Audio.Media.DATE_ADDED
        )

        val audio: Uri = MediaStore.Audio.Media.INTERNAL_CONTENT_URI

        val cur = context.contentResolver.query(
            audio,
            projection,  // Which columns to return
            "${MediaStore.Audio.Media.IS_ALARM}>0",  // Which rows to return (all rows)
            null,  // Selection arguments (none)
            null // Ordering
        ) ?: return

        if (cur.moveToFirst()) {

            val displayNameColumn: Int = cur.getColumnIndex(
                MediaStore.Audio.Media.DISPLAY_NAME
            )
            val dateColumn: Int = cur.getColumnIndex(
                MediaStore.Audio.Media.DATE_ADDED
            )
            do {
                val displayName = cur.getString(displayNameColumn)
                val date = cur.getString(dateColumn)

                Log.i(
                    "Listing Alarms",
                    " displayName=$displayName , date=$date"
                )
            } while (cur.moveToNext())
        }

您需要添加<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 来获取读取外部存储的权限。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接