ICSでも同じ問題に気づきました(GalaxySIIとGalaxyTabIIの両方でICS4.0.3を実行しています)。これはmp3にのみ影響するようです。
ウィリアムが提案した解決策の1つは外部ライブラリを使用することだと思いますが、外部ライブラリではなくandroidが提供するものを使用することも好みます。
気になるのは、これ以外に同じ問題を報告している他の投稿が見つからないことです。しかし、私はそれを間違っているとは思いません:
私は2つの解決策を試しました:
MediaMetadataRetriever mmdr = new MediaMetadataRetriever();
mmdr.setDataSource(path);
String title = mmdr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE);
と
File file = new File(path);
FileInputStream inputStream;
inputStream = new FileInputStream(file);
mmdr = new MediaMetadataRetriever();
mmdr.setDataSource(inputStream.getFD());
inputStream.close();
String title = mmdr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE);
MediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE)は常にnullを返します。
パスは正しく、mp3ファイルにはタイトルとすべてが記載されたID3タグが含まれています。
外部ライブラリを使用する以外に私が考えた解決策は、ファイルのパスでMediaStoreにクエリを実行することです。
Cursor c = mContext.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, new String[] {MediaStore.MediaColumns.TITLE},
MediaStore.MediaColumns.DATA + "=?",
new String[] { path }, null);
String title;
if(c!=null && c.moveToFirst())
title = c.getString(c.getColumnIndex(MediaStore.MediaColumns.TITLE))
}
MediaScannerがスキャンした場合(あるはずです)、情報がそこにあるはずです。これは、10より前のAPIレベルでも機能するはずです。
基本的に、私のプロジェクトで行うことは次のとおりです。SDKバージョンが10未満、またはファイルの拡張子がmp3でSDKバージョンが15の場合、MediaStoreにクエリを実行します。それ以外の場合は、MediaMetaDataRetrieverを使用します。