Android 6.0写sd卡权限问题

ljx2010hxj 发布于 2016/11/03 17:16
阅读 2K+
收藏 0

  我在做一个应用,此应用target SDK为20, compiler SDK为22,即采用的android 5.1.1的编译环境,使用eclipse开发。在Android 6.0系统的手机里面使用,需要拷贝文件到外置sd卡里面,但是发现拷贝失败。不能写sd卡。错误信息如下:

  

11-01 18:14:02.370: D/ljx(5253): dest=/storage/44EF-6209/test1.mp4
11-01 18:14:02.370: D/ljx(5253): fromFile=/storage/emulated/0/456/test1.mp4 toFile=/storage/44EF-6209/test1.mp4
11-01 18:14:02.371: W/System.err(5253): java.io.FileNotFoundException: /storage/44EF-6209/test1.mp4: open failed: EACCES (Permission denied)
11-01 18:14:02.371: W/System.err(5253): 	at libcore.io.IoBridge.open(IoBridge.java:487)
11-01 18:14:02.371: W/System.err(5253): 	at java.io.FileOutputStream.<init>(FileOutputStream.java:87)
11-01 18:14:02.371: W/System.err(5253): 	at java.io.FileOutputStream.<init>(FileOutputStream.java:127)
11-01 18:14:02.371: W/System.err(5253): 	at java.io.FileOutputStream.<init>(FileOutputStream.java:116)
11-01 18:14:02.371: W/System.err(5253): 	at com.ljx2010hxj.permissiondemo.MainActivity.copyFile(MainActivity.java:121)
11-01 18:14:02.371: W/System.err(5253): 	at com.ljx2010hxj.permissiondemo.MainActivity.copy(MainActivity.java:109)
11-01 18:14:02.371: W/System.err(5253): 	at com.ljx2010hxj.permissiondemo.MainActivity$1.onClick(MainActivity.java:54)
11-01 18:14:02.371: W/System.err(5253): 	at android.view.View.performClick(View.java:5265)
11-01 18:14:02.371: W/System.err(5253): 	at android.view.View$PerformClick.run(View.java:21527)
11-01 18:14:02.371: W/System.err(5253): 	at android.os.Handler.handleCallback(Handler.java:815)
11-01 18:14:02.371: W/System.err(5253): 	at android.os.Handler.dispatchMessage(Handler.java:104)
11-01 18:14:02.371: W/System.err(5253): 	at android.os.Looper.loop(Looper.java:207)
11-01 18:14:02.371: W/System.err(5253): 	at android.app.ActivityThread.main(ActivityThread.java:5692)
11-01 18:14:02.372: W/System.err(5253): 	at java.lang.reflect.Method.invoke(Native Method)
11-01 18:14:02.372: W/System.err(5253): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:888)
11-01 18:14:02.372: W/System.err(5253): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:749)
11-01 18:14:02.372: W/System.err(5253): Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied)
11-01 18:14:02.372: W/System.err(5253): 	at libcore.io.Posix.open(Native Method)
11-01 18:14:02.372: W/System.err(5253): 	at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
11-01 18:14:02.372: W/System.err(5253): 	at libcore.io.IoBridge.open(IoBridge.java:473)
11-01 18:14:02.372: W/System.err(5253): 	... 15 more


   不知道哪位大神遇到过这样的问题,怎么解决的呢?百度的方法如下:

   http://blog.csdn.net/zzw941124/article/details/51262650

   然而此方法并不起作用,判断是否有WRITE_EXTERNAL_STORAGE权限的时候,一直返回的是0,也即时有此权限,但是实际是没有的。

   有没有哪位大神有解决方案的,请不吝赐教。




加载中
0
554330833a
554330833a
6.0不给直接操作SD卡么?
l
ljx2010hxj
6.0不能直接操作sd卡,据说需要动态申请权限,但是不知道怎么弄
0
Mwww
Mwww
最简单的,目标SDK改成19
0
loyal
loyal
不能乱写的.高版本的android为了避免软件卸载后留残在SD卡中的数据无法自动删除,管理.所以高版本的android有限制,只能在自己的目录中操作.
0
z
zjupure

Android 4.4以后WRITE_EXTERNAL_STORAGE权限就只对内置卡有效了,外置卡的目录不能随便写了,应用只能写特定的目录/Android/data/{package_name}/,这个目录不再需要申请权限;

Android 6.0新增了动态权限机制,需要动态申请WRITE_EXTERNAL_STORAGE权限,用户同意了才能写外部存储,这时拿到的权限还是内置卡的权限。外置卡的目录还是不能直接操作。

Android 4.4之后不能写外置卡的问题,被很多开发者和用户诟病,google迫于压力在Android 5.0上提供了另一种方式去访问外置卡,采用Android的存储访问框架,也需要用户选择和授权,通过DocumentProvider去操作外置卡,可以看看ES文件浏览器的操作方式。

参考链接:

https://code.google.com/p/android/issues/detail?id=67570#c4444

https://developer.android.com/guide/topics/providers/document-provider.html

http://stackoverflow.com/questions/26744842/how-to-use-the-new-sd-card-access-api-presented-for-android-5-0-lollipop

0
luaaa
luaaa
6.0要在代码中动态申请权限
返回顶部
顶部