#現象
メディアスキャン実行時、引数のpaths
に複数のファイルを入れて実行すると、2個目のファイルでメディアスキャンに失敗してしまいす。
メディアスキャンのコールバックを下記の通り無くしても、やはり2個目のファイルで失敗します。
MediaScannerConnection.scanFile(getApplicationContext(), paths, mimeTypes, null);
とりあえずファイル毎にスキャンを行ってみたところ、メディアスキャンが出来る様になりました。
#知りたいこと
https://qiita.com/wasnot/items/ae1e6282d2c33626b604
>また、複数ファイルも登録できるので便利です。
引数がpaths
で調べても複数ファイルも出来ると書いてありますが、
実際に複数ファイルに対してメディアスキャンを行う時は、
ファイル別にメディアスキャンを実行する必要があるのでしょうか?
##メディアスキャンに失敗するソースコード(全体)
Java
1public class MainActivity extends AppCompatActivity { 2 3 private static final int REQUEST_EXTERNAL_STORAGE = 1; 4 private static String[] PERMISSIONS_STORAGE = { 5 Manifest.permission.READ_EXTERNAL_STORAGE, 6 Manifest.permission.WRITE_EXTERNAL_STORAGE 7 }; 8 9 public static void verifyStoragePermissions(Activity activity) { 10 int writePermission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE); 11 int readPermission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.READ_EXTERNAL_STORAGE); 12 13 if (writePermission != PackageManager.PERMISSION_GRANTED || readPermission != PackageManager.PERMISSION_GRANTED) { 14 ActivityCompat.requestPermissions( 15 activity, 16 PERMISSIONS_STORAGE, 17 REQUEST_EXTERNAL_STORAGE 18 ); 19 } 20 } 21 22 private TextView textView; 23 public static final String TAG = "MainActivity"; 24 private String fileName1 = "test1.txt"; 25 private String fileName2 = "test2.txt"; 26 private String strFileName1 = Environment.getExternalStorageDirectory().getPath() + "/" + fileName1; // 内部ストレージ直下 27 private String strFileName2 = Environment.getExternalStorageDirectory().getPath() + "/" + fileName2; // 内部ストレージ直下 28 29 private int intRaw = 0; 30 31 @Override 32 protected void onCreate(Bundle savedInstanceState) { 33 super.onCreate(savedInstanceState); 34 setContentView(R.layout.activity_main); 35 verifyStoragePermissions(this); 36 37 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); // 画面スリープさせない 38 39 textView = findViewById(R.id.text_view); 40 41 // 保存ボタン 42 Button buttonSave = findViewById(R.id.button_save); 43 buttonSave.setOnClickListener(new View.OnClickListener() { 44 @Override 45 public void onClick(View v) { 46 strFileName1 = Environment.getExternalStorageDirectory().getPath() + "/" + fileName1; // 内部ストレージ直下 47 strFileName2 = Environment.getExternalStorageDirectory().getPath() + "/" + fileName2; // 内部ストレージ直下 48 String text = "test" + intRaw + ","; // 保存する内容 49 50 StringBuilder sb = new StringBuilder(); 51 if(intRaw % 2 == 0) 52 { 53 saveFile(strFileName1, text); 54 sb.append("Saved:").append(intRaw).append("偶数"); 55 }else 56 { 57 saveFile(strFileName2, text); 58 sb.append("Saved:").append(intRaw).append("奇数"); 59 } 60 textView.setText(sb.toString()); 61 62 intRaw++; 63 } 64 }); 65 66 // メディアスキャンボタン 67 Button buttonScan = findViewById(R.id.button_MediaScan); 68 buttonScan.setOnClickListener(new View.OnClickListener(){ 69 @Override 70 public void onClick(View v){ 71 String[] paths = {strFileName1, strFileName2}; 72// String[] paths = {strFileName1}; 73 String[] mimeTypes = {"text/csv"}; 74 MediaScannerConnection.scanFile(getApplicationContext(), paths, mimeTypes, mScanCompletedListner); // メディアスキャン 75 76// paths = new String[] {strFileName2}; 77// MediaScannerConnection.scanFile(getApplicationContext(), paths, mimeTypes, mScanCompletedListner); // メディアスキャン 78 } 79 }); 80 } 81 82 // ファイルを保存 83 private synchronized void saveFile(final String file, final String str) { 84 new Thread(new Runnable() { 85 @Override 86 public void run() { 87 try { 88 FileOutputStream fos = new FileOutputStream(file,true); // 追記 89 OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8"); 90 BufferedWriter bw = new BufferedWriter(osw); 91 bw.write(str); 92 bw.write("\r\n"); // 改行(Windows用) 93 bw.flush(); 94 bw.close(); 95 Log.i(TAG,"Saved:" + str); 96 97 98 } catch (FileNotFoundException e) { 99 Log.d(TAG, "Error:" + e.toString()); 100 } catch (IOException e) { 101 Log.d(TAG, "Error:" + e.toString()); 102 } 103 } 104 }).start(); 105 } 106 107 // メディアスキャンの結果を通知(確認用) 108 private final MediaScannerConnection.OnScanCompletedListener mScanCompletedListner = new MediaScannerConnection.OnScanCompletedListener() 109 { 110 @Override 111 public void onScanCompleted(String path, Uri uri) 112 { 113 Log.i(TAG,"MediaScan:" + path); 114 } 115 }; 116}
##メディアスキャンに成功するソースコード(メディアスキャン部のみ)
Java
1 // メディアスキャンボタン 2 Button buttonScan = findViewById(R.id.button_MediaScan); 3 buttonScan.setOnClickListener(new View.OnClickListener(){ 4 @Override 5 public void onClick(View v){ 6// String[] paths = {strFileName1, strFileName2}; 7 String[] paths = {strFileName1}; 8 String[] mimeTypes = {"text/csv"}; 9 MediaScannerConnection.scanFile(getApplicationContext(), paths, mimeTypes, mScanCompletedListner); // メディアスキャン 10 11 paths = new String[] {strFileName2}; 12 MediaScannerConnection.scanFile(getApplicationContext(), paths, mimeTypes, mScanCompletedListner); // メディアスキャン 13 } 14 }); 15
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。