赞
踩
我在将网路图片读取到本地时:logcat报java.io.IOException: open failed: EACCES (Permission denied)问题
当时查看了网上的一些资源大部分是说 manifest中配置的权限问题 我的配置文件如下
- <uses-permission android:name="android.permission.INTERNET"/>
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
- <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
后来发现是应为4.0以后的版本的sd卡有了内外之分,当然如果你的配置没问题且代码无误,再4.0之前的版本是不会出现这个问题的
在2.x的版本中,在manifest中配置的权限android.permission.WRITE_EXTERNAL_STORAGE确实是用来使得sd卡获得写的权限。而在4.0开发的源码当中,由于有了内外置sd卡的区分,android.permission.WRITE_EXTERNAL_STORAGE的权限用来设置了内置sd卡的写权限,如果在manifest中只是配置了这个权限,那个应用只能在内置sd卡中进行写操作,还是无法在外置sd卡中进行写操作。需要写外置sd卡的话,需要配置另一个权限android.permission.WRITE_MEDIA_STORAGE,这样就可以在外置sd卡中进行写入操作了。
这两个权限都被定义在android源码目录\frameworks\base\data\etc\platform.xml中:
- <permission name="android.permission.WRITE_EXTERNAL_STORAGE" >
- <group gid="sdcard_rw" />
- </permission>
- <permission name="android.permission.WRITE_MEDIA_STORAGE" >
- <group gid="media_rw" />
- </permission>
从android 4.0以后就不允许这样操作了,因为如果在主线程进行数据操作,如果网络不好那么整个程序就卡死在那里了。所以android4.0以后对要联网的代码必须在新开一个线程来做
于是我在我的主文件里面添加了这样一段代码:
- <span style="white-space:pre"> </span>@SuppressLint("NewApi")
- public static void closeStrictMode() {
- StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
- .detectAll().penaltyLog().build());
- }
如下:
于是乎问题就解决了!4.0以后的版本他认为主线程进行数据操作这样的写法不安全 读取和写入文件一般大多是由于这个原因引起的!大家一定要注意!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。