【发布时间】:2017-02-10 02:01:23
【问题描述】:
我在三星 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) 权限。
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,但是有permission:android.permission.WRITE_MEDIA_STORAGE
毕竟,我的问题是:有没有人遇到过权限在清单中的问题,他们已经对新的权限模型进行了更改,他们仍然无法写入 SD 卡?我怎样才能(不生根,因为不应该需要它)让它工作?
【问题讨论】:
标签: android android-permissions android-sdcard