SDCard 上のファイルにインデックスを付けたい MP3 アプリケーションに取り組んでいます。それを行う最良の方法は何ですか?
私のアイデア。アプリケーションの初回起動時にファイルを検索し、SDCard 状態変更インテントのブロードキャスト レシーバーを登録し、インテントがブロードキャストされるたびにファイルを検索します。
ただし、この場合、ブロードキャスト レシーバーが 10 秒以内に返されないと、ANR が表示されます。
より良いフェイルセーフのアイデアを探しています。ありがとう。
SDCard 上のファイルにインデックスを付けたい MP3 アプリケーションに取り組んでいます。それを行う最良の方法は何ですか?
私のアイデア。アプリケーションの初回起動時にファイルを検索し、SDCard 状態変更インテントのブロードキャスト レシーバーを登録し、インテントがブロードキャストされるたびにファイルを検索します。
ただし、この場合、ブロードキャスト レシーバーが 10 秒以内に返されないと、ANR が表示されます。
より良いフェイルセーフのアイデアを探しています。ありがとう。
ANR を回避するには、UI スレッドの外部で検索を行う必要があります。SD カードはサイズが大きくなる可能性があるため、フォアグラウンド アクティビティではなくサービスで実行して、検索の進行中にユーザーがデバイスを他の目的に使用できるようにすることをお勧めします。
ただし、Android はサポートされているメディア ファイルを既に検索してインデックスを作成しているため、組み込みの MediaScanner を活用できるかどうかを確認する必要があります。
Chris に同意します。MediaScanner が音楽を検索し、MediaStore データベースに入力します。音楽エントリを検索するコードは次のとおりです。
final Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
final String[] cursor_cols = {
MediaStore.Audio.Media._ID,
MediaStore.Audio.Media.ARTIST,
MediaStore.Audio.Media.ALBUM,
MediaStore.Audio.Media.TITLE,
};
final String where = MediaStore.Audio.Media.IS_MUSIC + "=1";
final Cursor cursor = getContentResolver().query(uri, cursor_cols, where, null, null);
cursor.moveToNext();
final String artist = cursor.getString(_cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
final String album = cursor.getString(_cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM));
final String track = cursor.getString(_cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
doSomethingInteresting(artist, album, track);
「data」フィールドには、MediaPlayer で使用できるハンドルが含まれています。