Android 6.0.1读/写外部SD卡



我正在三星SM-T350上运行Marshmelow 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}/状态,我可以看到我的用户没有写入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_EEXTERNAL_STORAGE,但有权限:android.p权限.WRITE_MEDIA_STORAGE

因此,在所有这些之后,我的问题是:是否有人遇到过权限在清单中的问题,,并且他们已经对新的权限模型进行了更改,但仍然无法写入SD卡?我怎么能(不支持,因为不需要它)让它发挥作用?

首先,存在WRITE_EEXTERNAL_STORAGE权限。其次,假设外部存储是/mnt/media_rw/38E5-07B6。外部存储器没有可靠的硬编码路径。您应该改为请求目录。第三,即使你添加了权限,你也不会对磁盘上的任何地方都有写权限——你只能访问常用目录和应用程序的目录。第四,在较新版本的Android中,您还必须请求运行时权限。

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

最新更新