【问题标题】:Getting audio files from storage从存储中获取音频文件
【发布时间】:2016-06-12 04:48:34
【问题描述】:

我正在尝试从设备的内部和外部存储中获取所有音频文件。所以我正在使用媒体存储和光标。但我无法获得任何适当的歌曲检索示例。

我使用了这个代码:

public class MainActivity extends ListActivity {
Cursor cursor;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    String[] columns = { MediaStore.Audio.Media._ID };
    int[] displayViews = new int[] {android.R.id.text1};
    ContentResolver cr = this.getContentResolver();
    cursor = cr.query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,columns, null, null, null);
    setListAdapter(new SimpleCursorAdapter(this,android.R.layout.simple_list_item_1,cursor,columns,displayViews,1));
}

public static ArrayList<SongDto> getMusicInfos(Context context) {

    ArrayList<SongDto> musicInfos = new ArrayList<SongDto>();

    Cursor cursor = context.getContentResolver().query(
            MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null,
            MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
    if (cursor == null) {
        return null;
    }


    for (int i = 0; i < cursor.getCount(); i++) {
        cursor.moveToNext();


        int isMusic = cursor.getInt(cursor
                .getColumnIndex(MediaStore.Audio.Media.IS_MUSIC));

        if (isMusic != 0) {
            SongDto music = new SongDto();


            music.path = cursor.getString(cursor
                    .getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));

            if (!new File(music.path).exists()) {
                continue;
            }


            music.songId = cursor.getLong(cursor
                    .getColumnIndexOrThrow(MediaStore.Audio.Media._ID));

            music.songTitle = cursor.getString(cursor
                    .getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));


            music.songTitle = cursor.getString(cursor
                    .getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME));


            music.album = cursor.getString(cursor
                    .getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM));


            music.songArtist = cursor.getString(cursor
                    .getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));

            music.duration = cursor
                    .getLong(cursor
                            .getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));

            MediaMetadataRetriever mmr = new MediaMetadataRetriever();
            mmr.setDataSource(music.path);
            mmr.release();

            musicInfos.add(music);
        }
    }

    return musicInfos;
}
}

public class SongDto {

public long songId;
public String songTitle;
public String songArtist;
public String path;
public short genre;
public long duration;
public String album;
public Bitmap albumArt;

public String toString() {
    return String.format("songId: %d, Title: %s, Artist: %s, Path: %s, Genere: %d, Duration %s",
            songId, songTitle, songArtist, path, genre, duration);
}
}

我得到一个运行时错误我修复了 SimpleCursorAdapter,因为它已被弃用,如何获取歌曲以及我在设置适配器时做错了什么,任何示例或提示都会有所帮助。

【问题讨论】:

  • 您可能会发现this 很有帮助。
  • 我可以从固定文件夹中获取歌曲,但我想获取所有可以通过 mediastore 获取的歌曲,只有其他方式才能复杂

标签: android cursor mp3 android-mediaplayer mediastore


【解决方案1】:

如果你愿意,你可以实现一个文件浏览器。您可以在以下示例中找到文件浏览器和文件夹浏览器的实现。 Link

【讨论】:

  • 我正在使用媒体播放器。如果我浏览每个文件,则需要更多时间才能在设备中获取音频文件,因此我需要通过媒体存储和光标方式进入这样我就可以获得专辑封面、艺术家等所有媒体详细信息。
【解决方案2】:

你可以这样做(kotlin):

    //fetch the audio files from storage
    val contentResolver = this.contentResolver
    val uri: Uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
    val cursor: Cursor? = contentResolver?.query(uri, null, null, null, null)

    //looping through all rows and adding to list
    if (cursor != null && cursor.moveToFirst()) {
        do {
            val title: String = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE))
            val artist: String = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST))
            val duration: String = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION))
            val url: String = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA))
            val modelAudio = ModelAudio()
            modelAudio.setaudioTitle(title)
            modelAudio.setaudioArtist(artist)
            modelAudio.setaudioUri(url)
            modelAudio.setaudioDuration(duration)
            audioArrayList.add(modelAudio)
        } while (cursor.moveToNext())
    }

在清单中:

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

检查权限(dexter):

   private fun checkPermissions() {
   Dexter.withActivity(this).withPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
            .withListener(object : PermissionListener {
                override fun onPermissionGranted(permissionGrantedResponse: PermissionGrantedResponse) {
                }
                override fun onPermissionDenied(permissionDeniedResponse: PermissionDeniedResponse) {}
                override fun onPermissionRationaleShouldBeShown(
                        permissionRequest: PermissionRequest,
                        permissionToken: PermissionToken
                ) {
                    // asking for permission
                    permissionToken.continuePermissionRequest()
                }
            }).check()
}

依赖:)

  implementation 'com.karumi:dexter:6.2.2'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多