2017-02-19 15 views
1

SDカードに写真を書き込もうとしています。SDカードにファイルを書き込めません

リムーバブルストレージに書き込む権限があり、sdカードがマウントされています。

また、SDカードへのパスが存在することを確認したところ、肯定的な結果が得られました。

ここでは、mkdir()機能を使用すると失敗します。 falseを返し、ファイルは作成されません。

私はサムスンA6(マシュマロ)とサムスンTAB4(ロリポップ)

これは私がSDカードへのパスを取得するために使用しているコードのスニペットの両方でテストされています。私はパスがサムスンA6は/ストレージです/ 6DD9-1D15から、この関数で返さstackoverflowの答えから

を取っ
標準的な手順は、サムスンのデバイスで動作しませんでしたので、私はこのコードのスニペットを使用しています。

public String[] getStorageDirectories() { 
    String[] storageDirectories; 
    String rawSecondaryStoragesStr = System.getenv("SECONDARY_STORAGE"); 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
     List<String> results = new ArrayList<String>(); 
     File[] externalDirs = getApplicationContext().getExternalFilesDirs(null); 
     for (File file : externalDirs) { 
      String path = file.getPath().split("/Android")[0]; 
      if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && Environment.isExternalStorageRemovable(file)) 
        || rawSecondaryStoragesStr != null && rawSecondaryStoragesStr.contains(path)) { 
       results.add(path); 
      } 
     } 
     storageDirectories = results.toArray(new String[0]); 
    } else { 
     final Set<String> rv = new HashSet<String>(); 

     if (!TextUtils.isEmpty(rawSecondaryStoragesStr)) { 
      final String[] rawSecondaryStorages = rawSecondaryStoragesStr.split(File.pathSeparator); 
      Collections.addAll(rv, rawSecondaryStorages); 
     } 
     storageDirectories = rv.toArray(new String[rv.size()]); 
    } 
    return storageDirectories; 
} 

これは、代わりに、私はSDカードの下DCMIディレクトリ内のフォルダを書き込むために使用しているコード(私は写真を置くている)APIレベルで

public void mkFolder(String folderPath) { // make a folder under Environment.DIRECTORY_DCIM 

    File folder = new File(folderPath); 

    try { 
     // MKDIRS returns false 
     if (folder.mkdirs()) { 
      Log.d(TAG, "folder created:" + folder.toString()); 
     } else { 
      Log.d(TAG, "create folder fails:" + folder.toString()); 
     } 
    } catch (Exception ecp) { 
     ecp.printStackTrace(); 
    } 
} 
+0

ありがとう、私はコードを使用しています –

+0

パスを取得するために使用するコードまたは作成したコードを意味しますか? –

答えて

2

です18以下の場合、getStorageDirectories()elseブロックを通過します。そのブロックは想定しています

SECONDARY_STORAGE環境変数が存在する
  • こと... SECONDARY_STORAGE
  • ことは必要とされないディレクトリの区切りリスト...が含まれていることを
  • 必要とされていないディレクトリのリスト必要とされていないリムーバブル記憶域オプションを...一致したAPIレベル1で

を必要とされていないあなたはこれらのディレクトリで作業することができ

  • ... 9+以上であれば、 getStorageDirectories()コードは ifブロックを通過します。そこでは、まずは getExternalFilesDirs()に電話してください。そのメソッドが2以上のアイテムを返す場合、2番目以降のアイテムはリムーバブルストレージを指し、特に読み書きできるリムーバブルストレージ上の場所を指します。次に、あなたのコードは、前提としています

    • ディレクトリが/Androidパスセグメント... /Androidの前に、ディレクトリ・パスの部分は、あなたがファイルやディレクトリを作成することが可能な場所を表していること
    • を必要とされていない持っていること... 真なることはありません

    あなたは特定で除いて、リムーバブルストレージにファイルシステムレベルのアクセス、を持っていませんgetExternalFilesDirs()のようなメソッドによって返されるディレクトリしたがって

    、次のいずれか

    • スティックgetExternalFilesDirs()によって返さ特定場所、又はthe Storage Access Frameworkを使用する

    • スイッチに、コンテンツを格納する場所をユーザーが選択することを可能にする(これもよい、またはリムーバブルストレージではない可能性があります)

    +0

    ありがとう、それはgetExternalFilesDir()を使用して働いた。 –

    +0

    しましたu slve @MarcoMenardi – nzala

    関連する問題