0

외부 저장소에 데이터를 저장하려고합니다. 하지만 FileNotFoundException이 발생합니다.외부 저장소에 데이터 저장. FileNotFoundException

나는 온라인으로 고개를 매니페스트에 필요한 권한을 포함 'mkdirs()'나는 에뮬레이터에서 테스트하고하여 폴더를 생성 - 넥서스 6 내가 그 일을하고 어디 (23)

당신이 제안 할 수 API 잘못된.

@Override 
    public void saveExternalPublic(String data) { 
     File folder = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); 
     File myFile = new File(folder, "myData4.txt"); 
     folder.mkdirs(); 
     writeData(myFile, data); 
    } 

@Override 
    public void writeData(File myFile, String data) { 
     FileOutputStream fileOutputStream = null; 
     try { 
      fileOutputStream = new FileOutputStream(myFile); 
      fileOutputStream.write(data.getBytes()); 
      cacheSaveView.showMessage(data + " was written successfully "+ myFile.getAbsolutePath()); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     finally { 
      if(null != fileOutputStream) { 
       try { 
        fileOutputStream.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 

먼저 디렉토리를 생성 한 후 파일해야

11-30 00:51:43.178 23490-23490/com.example.rao.cachingsample W/System.err: java.io.FileNotFoundException: /storage/emulated/0/Download/myData4.txt: open failed: EACCES (Permission denied) 
11-30 00:51:43.180 23490-23490/com.example.rao.cachingsample W/System.err:  at libcore.io.IoBridge.open(IoBridge.java:452) 
11-30 00:51:43.180 23490-23490/com.example.rao.cachingsample W/System.err:  at java.io.FileOutputStream.<init>(FileOutputStream.java:87) 
11-30 00:51:43.180 23490-23490/com.example.rao.cachingsample W/System.err:  at java.io.FileOutputStream.<init>(FileOutputStream.java:72) 
11-30 00:51:43.181 23490-23490/com.example.rao.cachingsample W/System.err:  at com.example.rao.cachingsample.Caching.Presenter.CacheSavePresenterImpl.writeData(CacheSavePresenterImpl.java:60) 
11-30 00:51:43.181 23490-23490/com.example.rao.cachingsample W/System.err:  at com.example.rao.cachingsample.Caching.Presenter.CacheSavePresenterImpl.saveExternalPublic(CacheSavePresenterImpl.java:53) 
11-30 00:51:43.181 23490-23490/com.example.rao.cachingsample W/System.err:  at com.example.rao.cachingsample.Caching.View.FCacheSave.saveExternalPublic(FCacheSave.java:82) 
11-30 00:51:43.181 23490-23490/com.example.rao.cachingsample W/System.err:  at com.example.rao.cachingsample.Caching.View.FCacheSave_ViewBinding$4.doClick(FCacheSave_ViewBinding.java:63) 
11-30 00:51:43.182 23490-23490/com.example.rao.cachingsample W/System.err:  at butterknife.internal.DebouncingOnClickListener.onClick(DebouncingOnClickListener.java:22) 
11-30 00:51:43.182 23490-23490/com.example.rao.cachingsample W/System.err:  at android.view.View.performClick(View.java:5198) 
11-30 00:51:43.183 23490-23490/com.example.rao.cachingsample W/System.err:  at android.view.View$PerformClick.run(View.java:21147) 
11-30 00:51:43.184 23490-23490/com.example.rao.cachingsample W/System.err:  at android.os.Handler.handleCallback(Handler.java:739) 
11-30 00:51:43.185 23490-23490/com.example.rao.cachingsample W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:95) 
11-30 00:51:43.185 23490-23490/com.example.rao.cachingsample W/System.err:  at android.os.Looper.loop(Looper.java:148) 
11-30 00:51:43.185 23490-23490/com.example.rao.cachingsample W/System.err:  at android.app.ActivityThread.main(ActivityThread.java:5417) 
11-30 00:51:43.192 23490-23490/com.example.rao.cachingsample W/System.err:  at java.lang.reflect.Method.invoke(Native Method) 
11-30 00:51:43.193 23490-23490/com.example.rao.cachingsample W/System.err:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
11-30 00:51:43.198 23490-23490/com.example.rao.cachingsample W/System.err:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
11-30 00:51:43.199 23490-23490/com.example.rao.cachingsample W/System.err: Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied) 
11-30 00:51:43.211 23490-23490/com.example.rao.cachingsample W/System.err:  at libcore.io.Posix.open(Native Method) 
11-30 00:51:43.215 23490-23490/com.example.rao.cachingsample W/System.err:  at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186) 
11-30 00:51:43.216 23490-23490/com.example.rao.cachingsample W/System.err:  at libcore.io.IoBridge.open(IoBridge.java:438) 
+1

더 많은 (https://developer.android.com/training/permissions/requesting.html)를 * * – Prem

+0

당신이 매니페스트에서 귀하의 허가를 선언 한 곳은 어디입니까? – Umair

+1

[런타임에 권한 부여를 확인하는 방법]의 가능한 복제본 (https://stackoverflow.com/questions/30549561/how-to-check-grants-permissions-at-run-time) – Prem

답변

0

권한

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

오류 로그.

File folder = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); 
    folder.mkdirs(); 
    File myFile = new File(folder, "myData4.txt"); 
    writeData(myFile, data); 
+0

시퀀스가 ​​중요하지 않았습니다. 그리고 당신의 코드는 mkdir의 반환 값을 체크하지 않고 원래와 같이 나쁘다. – greenapps

0

Android 6에서 런타임에 권한을 요청해야합니다. 더보기 : here.

테스트를 위해 직접 사용할 수 있습니다. 설정 -> 응용 프로그램 -> 응용 프로그램 선택 -> 권한 섹션 선택 -> 모든 권한 사용

런타임에 요청해야하는 권한을 알아야합니다. 너는 my answer을 봐야한다.

1

당신은 안드로이드 API에 런타임에 권한을 요청해야 23+ 이미 매니페스트

public static void StoragePermissions(Activity activity) { 
// Check if we have write permission 
int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE); 

if (permission != PackageManager.PERMISSION_GRANTED) { 
    // We don't have permission so prompt the user 
    ActivityCompat.requestPermissions(activity,PERMISSIONS_STORAGE,REQUEST_EXTERNAL_STORAGE 
    ); 
    } 
} 

에서 그들을 선언 또한 응용 프로그램 태그에 당신이 매니페스트 권한 선언이 있는지 확인 한 경우에도 또는 아니. 다음 링크에서 정보의 자세한 내용을 확인하십시오 Exception 'open failed: EACCES (Permission denied)' on Android 당신이 ** [실행 권한]을 요청해야 Android Docs

관련 문제