2014-03-12 3 views
14

내 개발 전화는 Nexus 5이며 Android 4.4.2입니다.android의 외부 저장소에 폴더를 만들 수 없습니다.

내 응용 프로그램에서 내 응용 프로그램에 대한 디버그 정보를 저장할 외부 저장소에 폴더를 만들려고합니다. 기본적으로 응용 프로그램에서 실행되는 모든 명령이 포함되어 있으므로 사용자가 문제가 발생하면 디버그 폴더에서 정보를 보내 분석 할 수 있습니다.

폴더에 파일을 쓰려고했지만 파일을 만들 때 오류가 있음을 발견했습니다. 처음에 나는 mkdir()을 사용하고 있었고, 나는 또한 작동하지 않는 mkdirs() 위로 옮겼습니다.

내 매니페스트에 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />이 있습니다.

다음
File folder = new File(Environment.getExternalStorageDirectory() + "/DebugData"); 

    String path = folder.getPath(); 

    if(!folder.mkdirs() || !folder.exists()){   
      Log.e(LOG_TAG, path + " failed"); 
     } else { 
      Log.d(LOG_TAG, path + " succeeded"); 
     } 

가 나는 또한 시도 것입니다 : 여기

폴더를 생성하는 코드입니다

//Check SD card state 
    String state = Environment.getExternalStorageState(); 
    if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state) || !Environment.MEDIA_MOUNTED.equals(state)) { 
     Log.e(LOG_TAG, "Error: external storage is read only or unavailable"); 
    } else { 
     Log.d(LOG_TAG, "External storage is not read only or unavailable"); 
    } 

이 외부 저장 하지 읽기 전용 또는 사용할 수 없음을 반환합니다.

는 또한 정말 혼란 된 곳입니다 같은 File folder = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "Folder1");

등 다양한 경로를 시도했다.

다른 휴대 전화에서 개발을 시도했습니다. 첫째, Galaxy S4 GT-i9505을 실행하여 Android 4.2.2을 실행하면 효과가있었습니다. 폴더를 만들어서 쓸 수있었습니다. 이것은 코드가 작동하고 있음을 보여주었습니다. S4 및 Nexus 5에서 코드를 실행하여 반환 된 경로도 동일합니다.

그런 다음 나는 그것이 특정 안드로이드 버전일지도 모른다라고 생각했다. 그래서 나는 을 Android 4.4.2으로 붙잡아 코드가 잘 작동했습니다. 폴더를 만들었고 그 폴더에 쓸 수있었습니다.

휴대 전화는 뿌리가 없으며 모든 주식 표준입니다. 특별한 애플리케이션이나 Nexus 5의 설정과 관련하여 권한 문제를 일으킬 수있는 사항은 없습니다. 연결이 미디어 장치 (MTP)로 설정됩니다.

편집 :

나는 또한 작동하지 않았다 추적 시도 것을 추가해야합니다 :

  • 을 파일 만들기 외부 저장
  • 의 루트 디렉토리에 파일을 작성을 외부 저장소 루트 디렉터리에 저장하고 쓰기.
  • 경로에 폴더 만들기 및 파일 쓰기
  • 윤곽선에 파일을 작성하고 작성하십시오.

무엇이 문제의 원인인지 혼란 스럽습니다. 문제를 해결하기 위해 테스트하거나 변경할 수있는 것이 있습니까?

편집 2 :

, 나는 생각한다, 문제가 때문 색인을 끈다.

내가 테스트 한 다른 모든 장치는 기본적으로 USB 연결을 다시 연결하고 만들어진 파일과 폴더를 볼 수있었습니다.

내 Nexus 5는 폴더/파일이 존재하더라도 색인을 생성하지 않습니다.

다른 타사 파일 탐색기 응용 프로그램을 다운로드했으며 모든 폴더와 파일이 있음을 확인했습니다.

USB 디버깅을 통해 이러한 폴더와 파일을 보려면 다시 색인화하기 위해 전화기를 다시 시작해야합니다.이 파일은 매우 성가신 것처럼 보이지만 작동하지 않는 것보다 낫습니다.

감사합니다.

+1

'File' 객체를 만들기 위해 연결을 사용하지 마십시오. 'new File (Environment.getExternalStorageDirectory(), "SmartspeedPTdata")'와 같은 적절한'File' 생성자를 사용하십시오. 그것은 당신의 어려움의 원천이 아니지만 도움이 될 수 있습니다. – CommonsWare

+0

루트 디렉터리에 액세스 할 수 없습니다. 외부 저장 장치의 루트에 액세스 할 수없는 장치가 있습니다. 특히 작성하려는 경우 매니페스트 파일에 적절한 권한이 있어야합니다. –

답변

7

, 이것은 나를 위해 일한 :

MediaScannerConnection.scanFile(this, new String[] { file.toString() }, null, 
     new MediaScannerConnection.OnScanCompletedListener() { 
      public void onScanCompleted(String path, Uri uri) { 
       Log.i("ExternalStorage", "Scanned " + path + ":"); 
       Log.i("ExternalStorage", "-> uri=" + uri); 
      } 
}); 

당신은 바로 작성하고 파일을 저장 한 후 호출해야합니다. 스캐너를 사용하여 단순히에 장치를 다시 연결해에 의해 새로 생성 된 파일 및 디렉토리를 볼 수 있었다

docs에 따르면. 응용 프로그램이 새로 생성을 전달하거나 할 수있는 방법이

MediaScannerConnection 제공 다운로드 한 미디어 파일을 미디어 스캐너 서비스에 다운로드합니다. 미디어 검색 서비스는 파일에서 메타 데이터를 읽고 파일을 미디어 콘텐츠 제공 업체에 추가합니다.

희망이 있으면 다른 사람에게 도움이됩니다.

+0

이것은 실제 답변입니다. 감사합니다 @ 리암. – Zorfling

+0

답장을 보내 주셔서 감사합니다. @Liam. 좀 혼란 스럽네요. 새로운 의미입니다. 즉, 장치를 PC에 연결할 때 앱이 만드는 파일을 볼 수있게하려면이 코드가 필요합니다. '디렉토리 생성'또는 '파일 생성'코드? – username

2

먼저 File()은 파일 연결을위한 개체를 만듭니다.
파일을 사용하고 싶거나 파일이 존재하거나 createNewFile()입니다.
이 파일을 사용하여 디렉토리를 만들려면 파일이 존재 함을 확인하십시오. isDirectory() 다음에 mkDir()을 입력하십시오.
둘째, Environment.getExternalStorageDirectory이 가변 경로인지 확인하십시오.
DDMS 또는 ADB을 사용할 수 있습니다.
추가 정보, 뭔가 오류가 외부 저장소를 읽을 수있는 권한을 추가하는 것 같아요.

0

일반적으로, 나는이 수행 또한

/** 
* Return a dedicated directory named "MyApp" at the top of external storage 
*/ 
public static file getDataDir() { 
    File sdcard = Environment.getExternalStorageDirectory(); 
    if(sdcard == null || !sdcard.isDirectory()) { 
     // TODO: warning popup 
     Log.w(TAG, "Storage card not found " + sdcard); 
     return null; 
    } 
    File dataDir = new File(sdcard, "MyApp"); 
    if(!confirmDir(dataDir)) { 
     // TODO: warning popup 
     Log.e(TAG, "Unable to create " + dataDir); 
     return null; 
    } 
    return dataDir; 
} 

private static boolean confirmDir(File dir) { 
    if (dir.isDirectory()) return true; // already exists 
    if (dir.exists()) return false;  // already exists, but is not a directory 
    return dir.mkdirs();     // create it 
}  

을 매니페스트에이 권한을 추가

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

당신이 (앱 (일반적으로/데이터/아래) 개인 저장을하지합니다)의 sdcard에, 다음

있다 등 getDir(), getFilesDir(), fileList(), openFileInput(), openFileOutput() 조사 도우미 API 8 이상에 대한 sdcard 내 전용 디렉토리를 가져 오는 도우미 함수 : 등 등

+0

에드워드, 당신은 베 날란 스미스가 준 설명을 정확히 읽지 않았습니다! 그는 그의 버전이 4.4.x라고 썼다 !! 4.4.x의 변경 사항에 대해 알고 계셨습니까? 당신의 묘사는 당신이 아니라고 말했습니다. – AnNik

+0

나는 4.4에서 새로운 것을 알지 못했다는 것을 인정해야한다. 어떤 새로운 API를 생각 하시나요? –

+0

** Environment.getExternalStorageDirectory **가 최신 기기에서 작동하지 않습니다. –

4

색인 생성 때문에 문제가 발생했습니다.

내가 테스트 한 다른 모든 장치는 기본적으로 USB 연결을 다시 연결하고 만들어진 파일과 폴더를 볼 수있었습니다.

내 Nexus 5는 폴더/파일이 존재하더라도 색인을 생성하지 않습니다.

다른 타사 파일 탐색기 응용 프로그램을 다운로드했으며 모든 폴더와 파일이 있음을 확인했습니다.

USB 디버깅을 통해 이러한 폴더와 파일을 보려면 다시 색인화하기 위해 전화기를 다시 시작해야합니다.이 파일은 매우 성가신 것처럼 보이지만 작동하지 않는 것보다 낫습니다.이 넥서스와 인덱싱 문제가되는 점에서

+0

이 문제는 엄청나게 성가신 일입니다. Nexus 5에도 있습니다. –

3

같은 문제가있었습니다. 나는 안드로이드 6에서 테스트를하고 런타임 WRITE_EXTERNAL_STORAGE 권한을 확인하지 않았다.

+2

여기에 더 자세한 설명이 포함되어 있으면 좋을 것입니다. – SharkAlley

1

사용자가 외부 저장소에 대한 허가를 받았는지 확인해야합니다.

private void createFolder() { 
    if (isStoragePermissionGranted()) { 
     File folder = new File(Environment.getExternalStorageDirectory()+ File.separator + "DebugData"); 

     if(!folder.exists()){ 
      folder.mkdir(); 
     } 
    } 

public boolean isStoragePermissionGranted() { 
    if (Build.VERSION.SDK_INT >= 23) { 
     if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) 
       == PackageManager.PERMISSION_GRANTED) { 
      return true; 
     } else { 
      ActivityCompat.requestPermissions(this, 
        new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); 
      return false; 
     } 
    } 
    else { //permission is automatically granted on sdk<23 upon installation 
     return true; 
    } 
} 

위 코드는 저에게 효과적이었습니다.

+0

외부 리소스에 대한 링크가 권장됩니다.하지만 링크 주위에 컨텍스트를 추가하여 동료 사용자가 그것이 무엇이며 왜 존재하는지 알 수 있도록하십시오. 대상 사이트에 도달 할 수 없거나 영구적으로 오프라인 상태가되는 경우 중요한 링크의 가장 중요한 부분을 항상 인용하십시오. – pableiros

+0

정확히 내가 무엇을 찾고 있었습니까. 감사! –

+0

환영합니다. 도움이 되었기 때문에 기쁩니다. – Bookan

관련 문제