2016-10-17 8 views
5

안드로이드에 카메라에서 이미지를 저장해야합니다. 난 매니페스트 기록 외부 저장 권한을 사용하고 난 대신 mkdirs의 나도 MKDIR 시도안드로이드 mkdirs가 작동하지 않습니다

File dir = new File(Environment.getExternalStorageDirectory(), "Test"); 
if (!dir.exists() || !dir.isDirectory()) 
    dir.mkdirs(); 

String path = dir.getAbsolutePath(); 
Log.d(TAG, path);      //log show the path 
File file = new File(dir.getAbsolutePath() + "/Pic.jpg"); 
Log.d(TAG, file.getAbsolutePath()); //again path is shown here 

outStream = new FileOutputStream(file); 
outStream.write(bytes); 
outStream.close(); 
Log.d(TAG, "onPictureTaken - wrote bytes: " + bytes.length); //fail here 
} catch (FileNotFoundException e) { 
Log.d(TAG, "not done");      //error is here (this exception is thrown) 
} catch (IOException e) { 
Log.d(TAG, "not"); 
} finally { } 

코드()와 동일한 결과를 이용하고있다.

코드에서 무엇이 잘못 되었습니까?

덕분에

+3

아마도 [런타임 권한이 구현되지 않았습니다.] (https://stackoverflow.com/questions/32635704/android-permission- 나에게 선언 했더라도). 그 이상, ** 그것을 로깅하지 않고 ** 예외를 잡을 수 없어. Log.d() 호출에 세 번째 매개 변수로'e'를 추가 한 다음 LogCat을 사용하여 충돌과 관련된 Java 스택 추적을 검사하십시오. – CommonsWare

+0

스택 트레이스를 보여 주시겠습니까? – ToYonos

+1

'if (! dir.exists() ||! dir.isDirectory()) dir.mkdirs();'. 나쁜 코드의 좋은 예. 먼저 디렉토리가 아니라면 mkdirs는 해당 파일을 디렉토리로 변환하지 않습니다. 두 번째로 mkdirs의 반환 값이 실패 할 수 있으므로이를 확인해야합니다. 그것은 그 길로 어느 것이 었습니다. – greenapps

답변

17

나 같은 경험이없는 사람들에게. 나는이 문제와 싸우면서 머리를 잃어 버렸다. 나는 API 21을 목표로 삼고 호환성을 위해 롤리팝을 사용했지만 marshmallow에서는 디렉토리를 만들지 않습니다. 매니페스트에 "사용"권한이 있지만 작동하지 않습니다. 분명히 Marshmallow에 Android Studio를 설치할 때 권한을 부여해야하는지 여부를 묻지 않습니다. 거부 한 것처럼 조용히 실패합니다. 설정, 앱으로 이동하여 애플리케이션을 선택하고 권한 스위치를 켜야합니다.

+2

시도해보십시오. 작동하지 않을 수 있습니다. stackoverflow.com/a/41221852/5488468 –

+0

@RobbyPatel 감사합니다. 이. 그것은 매력처럼 일했습니다. 하지만 나는 2 권한이 필요하면 질문이 (스토리지 및 카메라를 말할 수 있습니다). 이 코드를 사용하여 권한을 확인하고 첫 번째 항목을 확인하지만 다른 항목은 확인하지 않습니다. 그것을 할 수있는 방법이 있습니까? – lallous34

+0

배열에 권한을 넣을 수 있습니까? –

0

당신은 파일이 아니라 디렉토리를 만들었습니다. 다음 코드로 새 파일 만들기

File file = new File(dir.getAbsolutePath() + "/Pic.jpg"); 
file.createNewFile() 
+0

답장을위한 thx/내가 코드 대신 파일을 찾지 못했습니다. IOException 대신 파일을 찾았습니다. – lallous34

+0

즉, 파일에 쓰는 동안 오류가 있음을 의미합니다. –

+0

추신 : 안드로이드에서 내 파일을 검색 할 때 디렉토리가 생성되지 않습니다. (이 문제의 일부분인지는 알 수 없습니다) – lallous34

0

시도해보십시오. marshmallow에 대한 런타임 권한을 제공합니다. 응용 프로그램 코드에서 완벽하게 작동합니다.

private String getFilename(String strFileName) { 
     String filepath = Environment.getExternalStorageDirectory().getPath(); 
     File fileBase = new File(filepath, "Test"); 
     if (!fileBase.exists()) { 
      fileBase.mkdirs(); 
     } 
     return (file.getAbsolutePath() + "/" + strFileName + file_exts[currentFormat]); 
    } 

new File(getFilename(edt.getText().toString().trim())) 
2

IDIOT ME! 내가 Manifest 권한을 사용했지만 전화에 응용 프로그램을 설치했을 때 저장 권한을 부여하지 못했습니다! ... 나는이 질문에 대해 부정적인 점을 이해하지만 ... 다른 사람이 똑같이 직면하면 .. 전화 허가를 확인하십시오. 불편을 끼쳐 드려 죄송합니다.

1

android M에서 테스트하는 경우 설정> 앱> 권한을 확인하여 저장소에 대한 액세스 권한이 부여되었는지 확인해야합니다. 이것은 나를 구했다.

1

당신이 당신의 AndroidManifest를에

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

을 넣어나요? android M을 사용하는 경우 sd에 대한 쓰기 권한을 요청해야합니다. example