2017-02-10 1 views
0

삼성 SM-T350에서 Marshmellow 6.0.1을 실행 중이고 외부 sd 카드 (/ mnt/media_rw/38E5- 07B6).Android 6.0.1 외부 SD 카드 읽기/쓰기

의 AndroidManifest.xml

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

내가 런타임에 허가를 요청하고 사용자가 그들에게 부여합니다. 나는 이것을 시스템 환경 설정에서 다시 확인할 수있다. 코드에서 계속하기 전에 사용자에게 권한이 부여되었는지 확인합니다. 나는이 같은 외부 SD 카드에 기록 할 때

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], int[] grantResults) { 
    check against PackageManager.PERMISSION_GRANTED 
} 

:

java.io.IOException: open failed: EACCES (Permission denied) 
    at java.io.File.createNewFile(File.java:939) 
    at com.myapp.util.FileUtils.copyFile(FileUtils.java:42) 
    at com.myapp.service.ExportService$1.onClick(ExportService.java:47) 
    at android.view.View.performClick(View.java:5714) 
    at android.widget.TextView.performClick(TextView.java:10926) 
    at android.view.View$PerformClick.run(View.java:22589) 
    at android.os.Handler.handleCallback(Handler.java:739) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:7325) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied) 
    at libcore.io.Posix.open(Native Method) 
    at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186) 
    at java.io.File.createNewFile(File.java:932) 
    at com.myapp.util.FileUtils.copyFile(FileUtils.java:42)  
    at com.myapp.service.ExportService$1.onClick(ExportService.java:47)  
    at android.view.View.performClick(View.java:5714)  
    at android.widget.TextView.performClick(TextView.java:10926)  
    at android.view.View$PerformClick.run(View.java:22589)  
    at android.os.Handler.handleCallback(Handler.java:739)  
    at android.os.Handler.dispatchMessage(Handler.java:95)  
    at android.os.Looper.loop(Looper.java:148)  
    at android.app.ActivityThread.main(ActivityThread.java:7325)  
    at java.lang.reflect.Method.invoke(Native Method)  
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)  
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

내가 ADB 쉘 장치를 장착 할 때 내가 PID를 잡아 :

File exportFile = new File("/mnt/media_rw/38E5-07B6/junk.txt"); 
exportFile.createNewFile(); 

나는이를 얻을 수/proc/{pid}/status를 덤프하면 내 사용자에게 SD 카드에 쓰기 위해 필요한 AID_SDCARD_RW (1015) 권한이 없다는 것을 알 수 있습니다.

Groups: 3003 9997 50143 

가 나는 또한 /system/etc/permissions/permissions.xml

<permission name="android.permission.WRITE_MEDIA_STORAGE" > 
    <group gid="media_rw" /> 
    <group gid="sdcard_rw" /> 
</permission> 

이를 찾을 수 없습니다 android.permission.WRITE_EXTERNAL_STORAGE이 없지만, 권한이있다 : android.permission.WRITE_MEDIA_STORAGE

그럼에도 불구하고 내 질문은 다음과 같습니다. 허가가 매니페스트에있는 곳에이 문제가 발생하여 의 새로운 권한 모델에 대한 변경을했는데 여전히 th에 쓸 수 없습니다. SD 카드? 어떻게해야할까요? (뿌리 뽑기가 필요 없기 때문에) 이것이 작동하도록하려면 어떻게해야합니까?

답변

1

먼저 WRITE_EXTERNAL_STORAGE 권한이 있습니다. 둘째, 외부 저장소가/mnt/media_rw/38E5-07B6이라고 가정합니다. 여기에는 외부 저장 장치에 대한 하드 코딩 된 경로가 없습니다. 대신 디렉토리를 요청해야합니다. 셋째, 권한을 추가하더라도 디스크의 모든 곳에 대한 쓰기 권한이 없습니다. 일반 디렉토리와 앱 디렉토리로 제한됩니다. 넷째, 최신 버전의 Android에서는 런타임 권한을 요청해야합니다.

해결해야 할 문제가 많습니다.

+0

첫 번째 : 는 이미 질문에 있습니다 – whatthemess

+0

셋째 : 이것은 사실이 아닙니다. ES 파일 탐색기 (https://play.google.com/store/apps/details?id=com.estrongs.android.pop&hl=en)는 SD 카드의 어느 위치 에나 쓸 수 있으며 타사 앱입니다 넷째 : 나는 허가를 요청했다. 그리고 권한을 두 번 확인했습니다. > 런타임에 권한을 요청하고 사용자가 권한을 부여합니다. 나는 이것을 시스템 환경 설정에서 다시 확인할 수있다. 코드에서 계속하기 전에 사용자에게 권한이 부여되었는지 확인합니다. 다시 질문에 대답 – whatthemess

+0

둘째 : 나는 adb로 연결하고 마운트 명령을 실행하고 카드 ID를 볼 수 있기 때문에 마운트 포인트가 옳다는 것을 알고있다 – whatthemess

관련 문제