2016-11-12 8 views
1

모바일의 내부 storge에서 파일을 micro sd 카드로 복사하려고하는데 Eacces 오류가 발생했습니다. 나는 많은 부분을 검색했지만 지금은 어디서나 명확한 해결책을 찾았다. 뿌리가 없거나 루틴이 아닌 Kitkat 장치에서 복사가 가능하거나 불가능합니다.EACCES 권한이 SD 카드에 쓰는 동안 Kitkat에서 거부되었습니다.

java.io.FileNotFoundException: /storage/MicroSD/Android/A.mp4: open failed: EACCES (Permission denied) 
W/System.err:  at libcore.io.IoBridge.open(IoBridge.java:409) 
W/System.err:  at java.io.FileOutputStream.<init>(FileOutputStream.java:88) 
W/System.err:  at java.io.FileOutputStream.<init>(FileOutputStream.java:73) 
W/System.err:  at jss.kitkatfile.MainActivity.write(MainActivity.java:69) 
W/System.err:  at jss.kitkatfile.MainActivity$1.onClick(MainActivity.java:27) 
W/System.err:  at android.view.View.performClick(View.java:4478) 
W/System.err:  at android.view.View$PerformClick.run(View.java:18698) 
W/System.err:  at android.os.Handler.handleCallback(Handler.java:733) 
W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:95) 
W/System.err:  at android.os.Looper.loop(Looper.java:149) 
W/System.err:  at android.app.ActivityThread.main(ActivityThread.java:5257) 
W/System.err:  at java.lang.reflect.Method.invokeNative(Native Method) 
W/System.err:  at java.lang.reflect.Method.invoke(Method.java:515) 
W/System.err:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
W/System.err:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609) 
W/System.err:  at dalvik.system.NativeStart.main(Native Method) 
W/System.err: Caused by: libcore.io.ErrnoException: open failed: EACCES (Permission denied) 
W/System.err:  at libcore.io.Posix.open(Native Method) 
W/System.err:  at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110) 
W/System.err:  at libcore.io.IoBridge.open(IoBridge.java:393) 
W/System.err: ... 15 more 

답변

0

당신이 안드로이드 매니페스트 파일에

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

를 추가 않았다 아래로

package jss.kitkatfile; 

import android.os.Bundle; 
import android.os.Environment; 
import android.support.v7.app.AppCompatActivity; 
import android.view.View; 
import android.widget.Button; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Button copy; 
     copy = (Button) findViewById(R.id.Copy); 
     copy.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       try { 
        write(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 

    public void write() 
      throws IOException { 
     String dirpath = Environment.getExternalStorageDirectory() + "/WhatsApp/Media"; 
     String filename = "A.mp4"; 


     File file = new File(dirpath,filename); 
     System.out.println(file); 


      FileInputStream fileInputStream = new FileInputStream(file); 
      byte[] filelength = new byte[fileInputStream.available()]; 
      fileInputStream.read(filelength); 

      //String dest = Environment.getExternalStorageDirectory() + "/Music"; 
      String dest = "/storage/MicroSD/Android"; 
      File outfile = new File(dest, filename); 
      FileOutputStream fileOutputStream = new FileOutputStream(outfile); 

      fileOutputStream.write(filelength); 

    } 
} 

오류 : 여기

내 코드?

또한 /storage/MicroSD/Android/A.mp4 파일과 유사합니다.
경로가 정확하고 A.mp4 파일이 존재합니까?

+0

예, 읽기 및 쓰기 권한이 추가되었습니다./storage/MicroSD/Android는 MicroSD 카드 안드로이드 폴더의 경로이며, 여기서 A.mp4는 복사됩니다. –

1

Android 4.4 이상에서는 removable storage에 대한 임의의 쓰기 권한이 없습니다.

는 당신을 환영합니다 :

  • 사용 getExternalFilesDirs(), getExternalCacheDirs()ContextgetExternalMediaDirs() 방법. 이러한 2 개 이상의 아이템이 반환되면 두 번째 이후의 아이템은 읽고 쓰기가 가능한 앱 고유의 이동식 저장소에있는 위치입니다.

  • ACTION_OPEN_DOCUMENT, ACTION_CREATE_DOCUMENTACTION_OPEN_DOCUMENT_TREE을 사용하십시오. 이것들은 the Storage Access Framework을 나타내며 데스크톱 운영 체제에서 익숙한 "파일 열기", "다른 이름으로 저장"및 "디렉토리 열기"대화 상자와 동일합니다. 그러나 다시 돌아 오는 것은 선택한 위치를 나타내는 Uri이며 그 위치로 작업하려면 ContentResolverDocumentFile을 사용합니다.

  • Android 6.0 이상에서는 StorageVolume API를 사용하여 전체 이동식 저장소 볼륨에 대한 액세스를 요청할 수 있습니다. 그러나 사용자는 여전히 Uri 값으로 작업하므로 ACTION_OPEN_DOCUMENT_TREE을 사용하는 것과 같습니다. 여기서 사용자는 이동식 저장 장치 볼륨의 루트를 선택합니다.

+0

은 SAF에서 작동하며 여기에서 업데이트됩니다. –