Android 6.0.1读/写外部SD卡

时间:2017-02-10 02:01:23

标签: android android-permissions android-sdcard

我在三星SM-T350上运行Marshmellow 6.0.1,我正在尝试在外部SD卡上创建一个文件(/ mnt / media_rw / 38E5-07B6)。

的AndroidManifest.xml

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

我在运行时请求权限,用户授予它们。我可以从系统首选项中仔细检查这一点。在代码中,我检查以确保用户在继续之前授予了权限。

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

当我尝试像这样写入外部SD卡时:

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

我明白了:

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 shell挂载设备时,我抓住pid,然后转储/ proc / {pid} / status,我可以看到我的用户没有写入SD卡所需的AID_SDCARD_RW(1015)权限。 / p>

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

毕竟,我的问题是:有没有人遇到过这个问题,其中权限在清单中,并且他们已经为新权限模型进行了更改,他们仍然不能写入SD卡?我怎么能(没有生根,因为它不应该需要)让这个工作?

1 个答案:

答案 0 :(得分:1)

首先,有一个WRITE_EXTERNAL_STORAGE权限。其次,您假设外部存储是/ mnt / media_rw / 38E5-07B6。这是外部存储的无法保证的硬编码路径。您应该请求目录。第三,即使您添加了权限,您也不会获得磁盘上任何位置的写入权限 - 您只限于公共目录和应用程序的目录。第四,在较新版本的Android中,您还必须请求运行时权限。

所以你有很多问题要解决。