下記のメソッドを利用して内部ストレージにあるファイルをSDカードへ
コピーしようとしているのですが、うまくいきません。
普通に実行するとSDカードにファイルは作成されるのですが、中身がコピーされません。
メソッドの先頭にブレークをはってステップ実行していくとなぜかうまく中身も
コピーされます。
まったくもって原因がわかりません。
コードに何か問題あるでしょうか?
追記
検索していたらFileOutputStreamのflushについて下記のような説明を発見しました。
このストリームの目的の転送先が、基本となるオペレーティングシステムによって提供される抽象化オブジェクト (ファイルなど) である場合、ストリームをフラッシュすることで、それまでにストリームに書き込まれたバイトがオペレーティングシステムに渡されて書き込まれることは保証されますが、ディスクドライブなどの物理デバイスに実際に書き込まれることは保証されません。
物理デバイスに書き込まれることは保証されないとあります。
もしかしてこれが原因?
だとしてどのように変更すればよいのでしょうか?
保証されるメソッドがある?
java
1 private boolean copy2ExternalStorage(String sdpath, String filename) { 2 // 現在ストレージが書き込みできるかチェック 3 String state = Environment.getExternalStorageState(); 4 5 if (state.equals(Environment.MEDIA_MOUNTED)) { 6 try (FileInputStream fileInputStream = openFileInput(filename)) { 7 String path = sdpath + "/" + filename; 8 File file = new File(path); 9 try (FileOutputStream fileOutputStream = new FileOutputStream(file, false)) { //追加書き込みしない 10 byte[] buf = new byte[256]; 11 int len; 12 while((len = fileInputStream.read(buf)) != -1){ 13 fileOutputStream.write(buf, 0, len); 14 } 15 fileOutputStream.flush(); 16 fileOutputStream.close(); 17 } catch (Exception e) { 18 e.printStackTrace(); 19 return false; 20 } 21 fileInputStream.close(); 22 } catch (IOException e) { 23 e.printStackTrace(); 24 return false; 25 } 26 Toast.makeText(this, "コピー完了", Toast.LENGTH_LONG).show(); 27 } 28 else if(state.equals(Environment.MEDIA_MOUNTED_READ_ONLY)){ 29 Toast.makeText(this, "このSDカードは読取専用です。", Toast.LENGTH_LONG).show(); 30 return false; 31 } 32 else if(state.equals(Environment.MEDIA_REMOVED)){ 33 Toast.makeText(this, "SDカードが挿入されていません。", Toast.LENGTH_LONG).show(); 34 return false; 35 } 36 else if(state.equals(Environment.MEDIA_UNMOUNTED)){ 37 Toast.makeText(this, "SDカードがマウントされていません。", Toast.LENGTH_LONG).show(); 38 return false; 39 } 40 else{ 41 Toast.makeText(this, "SDカードを確認してください。", Toast.LENGTH_LONG).show(); 42 return false; 43 } 44 return true; 45 }
copy2ExternalStorageを呼び出すメソッド。
テスト端末ではBuild.VERSION.SDK_INTが23未満なのでcheckPermissionは実行
しない
java
1 public void onClickSd(View view) { 2 new AlertDialog.Builder(this) 3 .setTitle("データ保存") 4 .setMessage("外部SDカードに保存しますか?\n※同名のファイルがある場合上書きされます") 5 .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 6 @Override 7 public void onClick(DialogInterface dialog, int which) { 8 // TODO 自動生成されたメソッド・スタブ 9 // Android 6, API 23以上でパーミッシンの確認 10 if (Build.VERSION.SDK_INT >= 23) { 11 checkPermission(); 12 } else { 13 List<String> path = getSdCardFilesDirPathListForLollipop(getApplicationContext()); 14 if(path.size() >= 1) { //外部ストレージが見つかった 15 for(int i = 0; i < listItems.size(); i++) { 16 if (copy2ExternalStorage(path.get(path.size() - 1), listItems.get(i).getName())){ 17 } 18 } 19 } 20 else { 21 Toast.makeText(getApplicationContext(), "コピーできませんでした", Toast.LENGTH_LONG).show(); 22 } 23 } 24 } 25 }) 26 .setNegativeButton("No", new DialogInterface.OnClickListener() { 27 28 @Override 29 public void onClick(DialogInterface dialog, int which) { 30 // TODO 自動生成されたメソッド・スタブ 31 } 32 }) 33 .show(); 34 } 35
あなたの回答
tips
プレビュー