Android文件操作 —— 6.0之后文件操作
2017-03-05 02:04
951 查看
解决方案
默认的文件操作
今天做一个需求,需要在SD卡创建公共文件夹,以前也做过,创建SD卡文件夹的代码很简单。但是却出现了问题,在6.0版本之后都不能创建,最后查了文档发现问题所在,就记录一下(很久没有做文件操作相关的功能,现在都7.0了,out太多!)。
1、权限声明
2、代码砸上
但是很遗憾,我这次却创建失败:
默认的文件操作
今天做一个需求,需要在SD卡创建公共文件夹,以前也做过,创建SD卡文件夹的代码很简单。但是却出现了问题,在6.0版本之后都不能创建,最后查了文档发现问题所在,就记录一下(很久没有做文件操作相关的功能,现在都7.0了,out太多!)。
1、权限声明
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
2、代码砸上
if (Environment.getExternalStorageState() .equals(Environment.MEDIA_MOUNTED)){ try { File dir = new File(filePath); if (!dir.exists()) {//判断文件目录是否存在 dir.mkdir(); } file = new File(filePath + File.separator + fileName); if (!file.exists()){ file.createNewFile(); } bos = new BufferedOutputStream(new FileOutputStream(file)); bos.write(bfile); } catch (Exception e) { e.printStackTrace(); } finally { IOUtitl.close(bos); }
但是很遗憾,我这次却创建失败:
ava.io.IOException: open failed: ENOENT (No such file or directory) xxxx xxxx xxxx W/System.err: at java.io.File.createNewFile(File.java:942)
解决方案:
然后我就懵了,差点怀疑自己。然后我就一步一步调试!最后确信代码没问题,就去google了一下,发现问题出在系统版本上。原来在Android 6.0之后,有些权限是需要用户同意才能生效的,否则并没有卵用。如果你的代码运行在6.0之后的系统,那么恭喜你,加上下面的代码就搞定了:// Storage Permissions private static final int REQUEST_EXTERNAL_STORAGE = 1; private static String[] PERMISSIONS_STORAGE = { Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE }; /** * Checks if the app has permission to write to device storage * If the app does not has permission then the user will be prompted to * grant permissions * @param activity */ public static void verifyStoragePermissions(Activity activity) { // Check if we have write permission int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { return ; } if (permission != PackageManager.PERMISSION_GRANTED) { // We don't have permission so prompt the user ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE); } } //用户处理权限反馈,在这里判断用户是否授予相应的权限 @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { boolean writeAccepted = false; switch (requestCode) { case REQUEST_EXTERNAL_STORAGE: if (grantResults.length == 1){ writeAccepted = grantResults[0] == PackageManager.PERMISSION_GRANTED; } break; default: break; } if (writeAccepted){//在6.0以上的系统,用户需要自己确认是否授权,授权过后重新初始化服务器配置文件 MessageCenter.postMsgNotify(MessageConstant.OBSERVER_SERVER_CHANGE,new MessageCenter.Notification<Object>()); } }
默认的文件操作
默认情况下,我们通过context.openOutputFile()得到的是程序的私有文件,存放在/data/data/Package name/下,不在root模式下面我们是无法看到文件的,同时也无法操作/data文件夹,我们得到的权限仅仅是程序所在的packageName文件夹下的读写权限。相关文章推荐
- android.hardware.Camera 5.1之后操作照相机是不是不能用啦,我用小米手机(基本android 6.0)
- Android开发——对sdcard扩展卡文件操作
- 基于sturts2.1.6的项目文件部署到tomcat6.0之后,服务器启动时报错:严重: Error filterStart
- android的文件操作
- Android数据存储操作②文件存储
- 编译android 之后生成的 img 文件介绍
- 安装SQL2K,当创建挂起文件操作之后... 推荐
- Android SDCard操作(文件读写,容量计算)
- Android: JAVA 文件操作
- Android SDCard操作(文件读写,容量计算)
- Android文件操作放到listview中
- 编译android 之后生成的 img 文件介绍
- Android开发——对sdcard扩展卡文件操作
- android的文件操作。(未整理完成)
- 编译android 之后生成的 img 文件介绍
- 基于sturts2.1.6的项目文件部署到tomcat6.0之后,服务器启动时报错:严重: Error filterStart
- Android 文件操作 读/写
- [VB.NET]VB.net下重命名文件的操作问题,为什么在我重命名文件之后,原始文件仍然存在(在有I/O异常时)
- Android对文件的操作(简单的文件读取与写入)
- Android 文件的下载操作