2017-02-19 4 views
1

SD 카드에 사진을 쓰려고합니다.SD 카드에 파일을 쓸 수 없습니다.

이동식 저장소에 쓰기 권한이 있으며 sd 카드가 마운트되었습니다.

또한 SD 카드의 경로가 존재하는지 확인하고 긍정적 인 결과를 얻었습니다.

여기서 나는 mkdir() 기능을 사용할 때 오류가 발생합니다. false를 반환하고 파일이 생성되지 않습니다.

내가 삼성 A6 (멜로)와 삼성 Tab4 (롤리팝)

이 내가 SD 카드의 경로를 검색하는 데 사용하고 코드의 조각 모두에서 테스트했습니다.
표준 절차는 삼성 기기에서 작동하지 않았기 때문에, 나는 내가 경로는 삼성 A6에서이 기능 반환 된 유래 응답

에서했다이 코드 조각을 사용하고있어/저장/6DD9-1D15입니다 .

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; 
} 

이 대신, 내가 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

(나는 사진을 넣어 것입니다있는)을 SD 카드에서 더블린 코어 디렉토리에 폴더를 작성하는 사용하고 코드입니다 18 이하의 경우 getStorageDirectories()else 블록을 통과합니다. 그 블록은 가정

SECONDARY_STORAGE 환경 변수가 존재
  • 것을 ... SECONDARY_STORAGE
  • 이 필요하지 않은 디렉토리의 구분 된 목록 ...을 포함
  • 필요하지 않은 디렉토리 목록 필요하지 않은 이동식 저장 옵션을 ... 일치 API 레벨 1에

필요하지 않습니다 당신이 그 디렉토리로 작업 할 수 있습니다

  • ... 9+ 이상인 경우 getStorageDirectories() 코드는 if 블록을 통과합니다. 거기에서, 당신은 getExternalFilesDirs()에 전화하고, 벌금부터 시작한다. 이 메소드가 2 개 이상의 아이템을 반환하면 두 번째 이후의 아이템은 이동식 스토리지를 가리키며, 특히 읽고 쓰기가 가능한 이동식 저장소의 장소를 가리 킵니다. 그런 다음 코드는 가정 디렉토리 /Android 이전 디렉토리 경로의 일부가 파일과 디렉토리를 만들 수있는 위치를 나타내는
  • 필요하지 않은 /Android 경로 세그먼트를 가지고 있습니다 ...

    • 것을 ... 사실 결코

    당신은 특정에서 제외하고는 이동식 저장 장치에 파일 시스템 수준의 액세스, 이없는 getExternalFilesDirs()과 같은 메소드에 의해 반환 된 디렉토리.

    그래서, 다음 중 하나를

    • getExternalFilesDirs()에 의해 반환 특정 위치 또는 사용자를 the Storage Access Framework를 사용하여 허용하는

    • 스위치에 스틱 (이 수도 있고 컨텐츠를 저장할 위치를 선택합니다 이동식 저장 장치가 아닐 수 있음)

  • +0

    고마워, 그것은 getExternalFilesDir()을 사용하여 효과가 있었다. –

    +0

    u slve @MarcoMenardi – nzala