Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 6.0.1读/写外部SD卡_Android_Android Permissions_Android Sdcard - Fatal编程技术网

Android 6.0.1读/写外部SD卡

Android 6.0.1读/写外部SD卡,android,android-permissions,android-sdcard,Android,Android Permissions,Android Sdcard,我正在三星SM-T350上运行Marshmellow 6.0.1,并试图在外部sd卡上创建一个文件(/mnt/media\u rw/38E5-07B6) AndroidManifest.xml <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 当我尝试像这样写入外部SD卡时: File exportFile = new File("/mnt/media_rw/38E5-07B6/

我正在三星SM-T350上运行Marshmellow 6.0.1,并试图在外部sd卡上创建一个文件(/mnt/media\u rw/38E5-07B6)

AndroidManifest.xml

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
当我尝试像这样写入外部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外壳安装设备时,我获取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_外部存储,但有权限:android.permission.WRITE_媒体存储


所以在所有这些之后,我的问题是:有没有人遇到过这样的问题,权限在清单中,他们已经对新的权限模型进行了更改,但仍然无法写入SD卡?我怎样才能(不需要根,因为不需要根)让它工作呢?

首先,有一个WRITE\u EXTERNAL\u存储权限。其次,假设外部存储是/mnt/media\u rw/38E5-07B6。外部存储器没有可靠的硬编码路径。您应该改为请求目录。第三,即使您添加了权限,您也没有对磁盘上任何地方的写入权限-您仅限于公用目录和应用程序的目录。第四,在较新版本的Android中,您还必须请求运行时权限


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

第一:已经在问题中了第三:这甚至不是真的。ES File explorer()可以写入SD卡上的任何位置,这是一个第三方应用程序。第四:我请求了权限。我仔细检查了权限。>我在运行时请求权限,用户授予它们。我可以从系统首选项中再次检查这一点。在代码中,我检查以确保用户在继续之前授予了权限。问题二:我知道挂载点是正确的,因为我使用adb连接并运行mount命令,可以看到卡id@whatthemess也许这次挂载点是对的。这可能不是你下一次插上电源的时候了。您不能假设Android上的挂载点,因为没有任何资源的硬编码路径。至于写外部存储,你说你没有这个问题。如果你的意思是其他的,你需要更清楚。@能够写整个sd卡有什么意义-不太可能,但这取决于OEM如何设置系统。如果他们决定将SD卡作为外部存储的一个子集,并授予world对其的写访问权限,则可能会。但不要指望它在所有设备上都能像这样工作,KitKat上的情况已经改变了。看看上面有没有好的文字。
<permission name="android.permission.WRITE_MEDIA_STORAGE" >
    <group gid="media_rw" />
    <group gid="sdcard_rw" />
</permission>