いつもお世話になっています。
高橋と申します。
現在、ContentResolverの挙動について、問題が発生しているため
ご助言をいただきたく投稿させていただきました。
当方の行いたい処理は以下の①~④です。
①音楽ファイルを作成(ファイル名はユーザーが任意で入力)
②作成されたファイルをメディアスキャン
③ContentResolverへの登録が終わるまで待機
④登録完了確認後にリストとして表示
発生している問題は以下の2点です。ユーザーによっては発生しません。
問題1:①~④の処理は無事完了するが、④で作成したファイルが表示されない。
問題2:①~③は完了するが、④で応答がない。(ContentResolverがビジー?)
伺いたい内容としては
問題1の場合、メディアスキャンが失敗することはあるのでしょうか?
問題2の場合、メディアスキャンなどのContentResolverに複数の命令が生じた場合、ビジー状態になるのか?
また、これらの解決方法についてご意見をいただければ幸いです。
よろしくお願いします。
(以下、ソースコード)
②
Uri contentUri = Uri.fromFile(fNew);
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, contentUri);
sendBroadcast(mediaScanIntent);
③
resolver = this.getContentResolver();
Cursor mcursor = null;
int i=0;
do{
try {
Thread.sleep(100*(i+2));
String where = MediaColumns.DATA + " like ?";
String[] aaa=new String[] {item_path};
mcursor = resolver.query(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI ,
new String[]{
BaseColumns._ID,
MediaColumns.DATA,
AudioColumns.ALBUM ,
AudioColumns.ARTIST ,
MediaColumns.TITLE ,
AudioColumns.ALBUM_ID ,
AudioColumns.ARTIST_ID
} ,
where ,
aaa ,
BaseColumns._ID+" DESC"
);
} catch (Exception e) {
}
if(mcursor!=null){
if(mcursor.getCount()>0){
i=8;
mcursor.moveToFirst();
}else{
Uri contentUri = Uri.fromFile(fNew);
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, contentUri);
sendBroadcast(mediaScanIntent);
i++;
mcursor.close();
mcursor=null;
}
}else{
Uri contentUri = Uri.fromFile(fNew);
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, contentUri);
sendBroadcast(mediaScanIntent);
i++;
}
}while(i<7);
④ ③終了後、AsyncTaskで実行
c = resolver.query(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI , //データの種類
new String[]{
BaseColumns._ID,//0
MediaColumns.DATA,//1
AudioColumns.ALBUM ,//2
AudioColumns.ARTIST ,//3
MediaColumns.TITLE ,//4
AudioColumns.YEAR //5
} ,//取得する
null , //フィルター条件 nullはフィルタリング無し
null , //フィルター用のパラメータ
BaseColumns._ID+" DESC limit 50"
);
result0 = new ArrayList<HashMap<String, Object>>();
HashMap<String, Object> map1 = new HashMap<String, Object>();
map1=null;
int i_target=0;
if(c.getCount()>0){
do{
if(c.getString(0)==null){
}else{
if(c.getString(1)!=null&&c.getString(1).indexOf("/") >= 0){
File file = new File(c.getString(1));
boolean isExists = file.exists();
if(isExists){
map1 = new HashMap<String, Object>();
map1.put("id", c.getString(0));
map1.put("uri", uri_c);
map1.put("src", src_c);
map1.put("album", album_c);
map1.put("artist", artist_c);
result0.add(map1);
}
map1=null;
}
}
}while(c.moveToNext());
}
c.close();