2016-09-05 2 views
0

나는이 문제를 디버깅하는 데 정말로 지쳤다. 저장 장치에 쓰는 응용 프로그램이 있습니다. 내가 안드로이드 개발로부터의 휴식을 가졌기 때문에 업데이트가 생길 때까지 애플리케이션이 잘 동작했다. (안드로이드 개발로 인해 업데이트가 발생했는지 모르겠다.) 안드로이드 버전은 6.0.1이다.Android 저장 용량 쓰기 전용?

어쨌든 외부 저장소에 쓰려고합니다. 나는 안드로이드에 대한 새 권한 시스템을 읽기 준비 권한을 가지고, 나는 내 코드에 체크를하고있는 중이 야있어 : 제가 확인했습니다 디버깅함으로써

checkSelfPermission("android.permission.READ_EXTERNAL_STORAGE") 
checkSelfPermission("android.permission.WRITE_EXTERNAL_STORAGE") 

(나는 또한 확인하고 허가를 묻는 코드를 얻을 필요하다,하지만 난 정말 있는지 확인되고 싶어, 나는 그들이 와 동일한 값 0, 그래서

을 PackageManager.PERMISSION_GRANTED 반환 관찰 한)), 권한을 확실히 부여됩니다. 저장소에 App 디렉터리를 만들어서 pdf 파일을 작성하고 sqlite DB를 저장하려고합니다.

String state = Environment.getExternalStorageState(); 

    if (Environment.MEDIA_MOUNTED.equals(state)) { 
     // We can read and write the media 
     File dir = Environment.getExternalStorageDirectory(); 
     String sNewDir = Constants.ApplicationDataDir; 

     if (sSubDir == null) { 
      sSubDir = ""; 
     } else { 
      sSubDir = sSubDir.trim(); 
     } 
     if (sSubDir.length() > 0) { 
      sNewDir += File.separator + sSubDir; 
     } 
     File dirName = new File(dir, sNewDir); 
     if (!dirName.exists()) { 
      if (!dirName.mkdirs()) { 
       LogDump.e("getAppDirectory err", " (sSubDir=<" + sSubDir + "> cannot create dir: " + dirName.getAbsolutePath()); 
      } 
     } 
     return dirName; 
    } else { 
     // Something else is wrong 
     LogDump.e("getAppDirectory err", " (sSubDir=<" + sSubDir + "> not mounted state: " + state); 
     return null; 
    } 

DIRNAME의 값은/저장/에뮬레이션/0/MY_APP_CONST_VALUE/sSubDir (. sSubdir이 하위 디렉토리 예에 대한 매개 변수 인 "환경 설정") 김 : 여기

내가 디렉토리를 생성하는 방법이다 , 코드 (디버거로 검사)는 디렉토리가 존재하지 않는지 검사하고 mkdirs()는 false 결과를 반환합니다. 실제로 디렉토리가 존재하지 않고 생성 될 수 없다는 것을 의미합니다. 이것은 그것은을 만들 수 없기 때문에 매우 논리적 인 것 같다

... SQLLite 코드 그리고 다른 파일 작업에 대한 FileNotFound 예외에서

W/FileUtils: Failed to chmod(/storage/emulated/0/MY_APP_CONST_VALUE/DB/pcdrdata.sqlite3): android.system.ErrnoException: chmod failed: EPERM (Operation not permitted) 

: 내 응용 프로그램 작업 중

내 로그가 가득 얻을 디렉토리? 이제 가장 혼란스러운 부분이 있습니다 :

저는 총 사령관을 사용하고 있으며, 실제로 디렉토리가 생성되고 sqlite 데이터베이스가 복사되고 FileNotFoundException을 수행하는 모든 파일이 있다는 것을 알 수 있습니다. 테스트를하고 삭제하고 앱을 다시 실행하면 위치에 다시 복사됩니다. 그러나 파일에 대한 읽기 조작은 불가능합니다.

그래서 어떻게 든 디렉토리를 만들고 (심지어 mkdirs()라고 쓰여 있더라도) 쓰기를 허용하지만 읽을 수는 없습니다.

나는 정말로 혼란스럽고 피곤하다. SD 카드 없이도 똑같은 결과를 얻었습니다. .....

내 응용 프로그램은 PDF 파일을 만듭니다. 성공적으로 작성되었지만 토탈 커맨더가 열 수 없다고 말합니다 ...

내 휴대 전화는 Xperia Z3입니다.

+0

IDE에서 새 버전을 실행하는 것뿐만 아니라 앱을 완전히 제거하고 다시 설치해보십시오. . – CommonsWare

+0

FWIW, 여러분의 코드를'targetSdkVersion'이 22이고'WRITE_EXTERNAL_STORAGE'가 매니페스트에 포함 된 코드를 스크랩 애플리케이션에 넣었습니다. 안드로이드 6.0.1을 실행하는 Nexus 5X에서 잘 작동했습니다. – CommonsWare

답변

0

KitKat에서는 더 이상 외부 저장소의 루트에서 읽을 수 없습니다. 특수 공개 디렉토리 또는 sdcard의 개인 디렉토리에서만 읽을 수 있습니다. 생성했지만 수정할 수 없다는 것을 안다면 안드로이드는 거기에 쓸 수 있지만 거기서는 읽을 수 없다고 결정했습니다.

+0

또한 getExternalStoragePublicDirectory (Environment.DIRECTORY_DOWNLOADS)를 시도했으며 그 결과는 동일했습니다. 앱 데이터를 어디에 저장해야하나요? KitKat에서 제대로 작동했는지 100 % 확신합니다. – maslan

+0

[외부 저장소] (https://commonsware.com/blog/2014/04/08/storage-situation-external-storage.html)는 [이동식 저장소]가 아닙니다 (https : //commonsware.com/blog/2014/04/09/storage-situation-removable-storage.html). 'READ_EXTERNAL_STORAGE' (장치와'targetSdkVersion'에 따라 런타임 권한 포함)를 가지고 있다면 외부 저장소 ('Environment.getExternalStorageDirectory()'의 루트에서 아무런 문제없이 읽을 수 있습니다. – CommonsWare

+0

@CommonsWare 그럼 왜 읽을 수 없습니까? 권한을 보유하고 getExternalStorageDirectory를 사용하면 작동하지 않습니다. 이상한 Android 장치 모니터로/storage/emulated/0을 열 수 없습니다. – maslan

관련 문제