SD カードから音楽をロードしようとすると、タブレットと AVD エミュレート デバイスの間で一貫性のない結果が得られます。タブレットで機能する方法が仮想デバイスでは機能せず、その逆も同様です。
これが私のタブレットで動作するコードです。これは優れたアプローチであり、アーティスト、アルバム、アルバム アートなど、ファイルのすべての詳細にアクセスできます (私のタブレットはジェリー ビーンを実行しています)。
Uri uri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
Cursor cur = mContentResolver.query(uri, null,
MediaStore.Audio.Media.IS_MUSIC + " = 1", null, null);
cur.moveToFirst();
{
do {
HashMap<String, Object> song = new HashMap<String, Object>();
song.put("songTitle", cur.getString(titleColumn));
Uri path = ContentUris.withAppendedId(uri,cur.getLong(idColumn));
String songPath = path.toString();
song.put("songPath", songPath);
song.put("artistName",cur.getString(artistColumn));
song.put("albumName",cur.getString(albumColumn));
song.put("albumId", cur.getInt(albumIdColumn));
song.put("songId", cur.getInt(idColumn));
songsList.add(song);
} while (cur.moveToNext());
}
しかし、エミュレートされたデバイスではカーソルが空なので、リストに曲は追加されません。エミュレータの SD カードに曲をプッシュしましたが、うまくいきません。次のコードは、仮想デバイス上の曲を検索しますが、曲名とファイル パスのみを提供し、アーティストやアルバムの情報は提供しません。(仮想端末は Android 4.2、API レベル 17)
final String MEDIA_PATH = new String("/sdcard/");
File home = new File(MEDIA_PATH);
if (home.listFiles(new FileExtensionFilter()).length > 0) {
for (File file : home.listFiles(new FileExtensionFilter())) {
HashMap<String, Object> song = new HashMap<String, Object>();
song.put("songTitle", file.getName().substring(0,
(file.getName().length() - 4)));
song.put("songPath", file.getPath());
songsList.add(song);
}
}
ただし、このコードをタブレットで実行するとファイル (ホーム) が空になり、データが返されません。この時点での私の解決策は、曲のリストを作成するために両方の方法を実行することです。ただし、2 番目の方法を使用する必要があるデバイスの場合、アーティストやアルバムの情報はありません。仮想デバイスに関連する異常である可能性がありますか、それとも非常に多くの異なるデバイスを扱うことに不満を感じているだけですか?
どうもありがとう