ContentResolverの挙動について

140 views
Skip to first unread message

高橋士郎

unread,
Oct 13, 2016, 10:30:03 AM10/13/16
to 日本Androidの会
いつもお世話になっています。
高橋と申します。

現在、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();

Reply all
Reply to author
Forward
0 new messages