2

メソッドEnvironment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC)を使用して、Android デバイスが音楽を保存するデフォルトのディレクトリを取得しています。

このメソッドによって返されるディレクトリ (sdcard/music など) は存在しますが、音楽ファイルはありません。SDカードを確認したところ、すべての音楽ファイルが、アプリケーションの1つによって名前が付けられた別のディレクトリ(sdcard/qqmusic/song)に保存されていることがわかりましたが、このgetExternalStoragePublicDirectory方法では見つけることができません。

このような場合(デバイスごとに異なる場所に音楽が保存されている場合)、デバイスの違いに関係なくパスを取得する良い方法はありますか?

4

1 に答える 1

0

コメントで説明したように、Android Music アプリケーションがすべての音楽ファイルを見つける方法を紹介します。

Android Music アプリケーションは、MediaProvider にクエリを実行するだけで、外部ストレージ (SD カードなど) にあるすべての音楽を取得できます。

そして、データベースはMediaScannerServiceによって埋められます。MediaScannerService は、 MediaScanner.scanDirectoriesを呼び出して、それらのディレクトリの下にあるすべてのファイルを検索します。オーディオ ファイルの場合はメタデータを取得し、データベース (MediaProvider) に配置します。

if (MediaProvider.INTERNAL_VOLUME.equals(volume)) {
    // scan internal media storage
    directories = new String[] {
        Environment.getRootDirectory() + "/media",
    };
}else if (MediaProvider.EXTERNAL_VOLUME.equals(volume)) {
    // scan external storage volumes
    directories = mExternalStoragePaths;
}

if (directories != null) {
    scan(directories, volume);
}

私の答えは、MediaProvider には既に外部ストレージ上の音楽ファイルが含まれているため、プロバイダーに直接クエリを実行してすべての音楽ファイルを取得できるということです。

最初にMediaStoreを確認してください。

次のコードを使用して、すべての音楽ファイルを取得できます。

//Some audio may be explicitly marked as not being music
String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0";

String[] projection = {
        MediaStore.Audio.Media._ID,
        MediaStore.Audio.Media.ARTIST,
        MediaStore.Audio.Media.TITLE,
        MediaStore.Audio.Media.DATA,
        MediaStore.Audio.Media.DISPLAY_NAME,
        MediaStore.Audio.Media.DURATION
};

cursor = this.managedQuery(
        MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
        projection,
        selection,
        null,
        null);

private List<String> songs = new ArrayList<String>();
    while(cursor.moveToNext()){
        songs.add(cursor.getString(0) + "||" + cursor.getString(1) + "||" +   cursor.getString(2) + "||" +   cursor.getString(3) + "||" +  cursor.getString(4) + "||" +  cursor.getString(5));
}

MediaStore.Audio.Media.DATA列には、その音楽ファイルへのフル パスが含まれています。

于 2013-03-19T02:59:47.903 に答える