繁体   English   中英

无法从外部存储中获取音频文件 - Android Studio

[英]Can't get audio files from external storage - Android Studio

我正在按照本指南创建音频播放器: https ://www.sitepoint.com/a-step-by-step-guide-to-building-an-android-audio-player-app/。 当我尝试查找音频文件时出现问题。 创建游标后,它不为空,但使用 cursor.getCount() 结果为 0,因此未找到音频。 在手机和模拟器上都找不到音频文件。 当我在寻找解决方案时,我遇到了其他一些 contentResolver.query,但这似乎不是问题。 我在清单中使用了这个:

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

这就是查找音频文件的方法:

private void loadAudio() {
        ContentResolver contentResolver = getContentResolver();

        Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
        String selection = MediaStore.Audio.Media.IS_MUSIC + "!= 0";
        String sortOrder = MediaStore.Audio.Media.TITLE + " ASC";
        Cursor cursor = contentResolver.query(uri, null, selection, null, sortOrder);
        boolean cursorB = cursor == null;
        Log.d("aaaaaa", "uri" + uri.toString());
        Log.d("aaaaaa", "cursor.getCount() " + cursor.getCount() + " " + cursorB);
        if (cursor != null && cursor.getCount() > 0) {
            audioList = new ArrayList<>();
            while (cursor.moveToNext()) {
                @SuppressLint("Range") String data = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));
                @SuppressLint("Range") String title = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
                @SuppressLint("Range") String album = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM));
                @SuppressLint("Range") String artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));

                Log.d("aaaaaa", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
                // Save to audioList
                audioList.add(new Audio(data, title, album, artist));
            }
        }
        Log.d("Song", "Song:" + audioList.get(0).getTitle());
        cursor.close();
    }

这是可以使用的东西

@SuppressLint("Range")可以放在方法的顶部,无需在代码行中重复cursor.getCount()如果cursor == null将崩溃

private final String track_id = MediaStore.Audio.Media._ID;
private final String bucket_displayname = MediaStore.Audio.Media.BUCKET_DISPLAY_NAME;
private final String track_no = MediaStore.Audio.Media.TRACK;
private final String track_name = MediaStore.Audio.Media.TITLE;
private final String artist = MediaStore.Audio.Media.ARTIST;
private final String artist_id = MediaStore.Audio.Media.ARTIST_ID;
private final String duration = MediaStore.Audio.Media.DURATION;
private final String album = MediaStore.Audio.Media.ALBUM;
private final String composer = MediaStore.Audio.Media.COMPOSER;
private final String year = MediaStore.Audio.Media.YEAR;
private  String path = MediaStore.Audio.Media.DATA;
private final String date_added = MediaStore.Audio.Media.DATE_ADDED;
private final String genre = MediaStore.Audio.Media.GENRE;
private final String genre_id = MediaStore.Audio.Media.GENRE_ID;

public Cursor getAllTracks(Context context) {
    // gets all tracks
    if (context != null) {
        ContentResolver cr = context.getContentResolver();
        String[] columns =null;
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.Q ) {
            columns = new String[]{track_id, track_no, artist, track_name,
                    album, duration, path, year, composer, genre, genre_id};
        }else{
            columns = new String[]{track_id, track_no, artist, track_name,
                    album, duration, path, year, composer};
        }
        Uri uri = uris.get_audio_media_uri();
        Cursor crs=cr.query(uri, columns, null, null, null);
        enumerateAndrodCursor(context, crs);
        return crs;
    } else {
        return null;
    }
}

public Uri get_audio_media_uri(){
    Uri uri_to_use = null;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        uri_to_use = MediaStore.Audio.Media.getContentUri(MediaStore.VOLUME_EXTERNAL);
    } else {
        uri_to_use = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    }
    return uri_to_use;
}

public void enumerateAndrodCursor(Context context, @NonNull Cursor c) {
    try {
        if (c != null && c.moveToFirst()) {
            for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
                // String id = c.getString(c.getColumnIndex(pampfolder_playlist_entries_id));
                String strartist = c.getString(c.getColumnIndex(MediaStore.Audio.Media.ARTIST));
                String stralbum = c.getString(c.getColumnIndex(MediaStore.Audio.Media.ALBUM));
                String strtitle = c.getString(c.getColumnIndex(MediaStore.Audio.Media.TRACK));
                String strdisplay_name = c.getString(c.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME));
                String strplaylistentry = c.getString(c.getColumnIndex(MediaStore.Audio.Media._ID));

                Log.i("ABC", "trackid = " + strplaylistentry+ " Artist = " + strartist + " Album = " + stralbum + " Title = " + strtitle+ " display_name ="+ strdisplay_name);

            }

        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM