Android 4.4 的权限问题,导致App 裁剪图片不能保存(已解决)

先说说权限问题:
 【android】getCacheDir()、getFilesDir()、getExternalFilesDir()、getExternalCacheDir()的作用

getCacheDir()方法用于获取/data/data/<application package>/cache目录
getFilesDir()方法用于获取/data/data/<application package>/files目录

 通过Context.getExternalFilesDir()方法可以获取到 SDCard/Android/data/你的应用的包名/files/ 目录,一般放一些长时间保存的数据
 通过Context.getExternalCacheDir()方法可以获取到 SDCard/Android/data/你的应用包名/cache/目录,一般存放临时缓存数据


 可见这两个是一样的,不过一个在内存储中,一个在外存储中(以上目录都是完全可读可写的)

但是有时候我们需要保存下载文件就会存储到其它目录
 使用Environment.getExternalStorageDirectory() 获取扩展卡目录并自行处理。
 但是在Android4.4的时候,把这个权限加了限制,不能再写了。幸好 5.0 的时候,又回来了,又可以使用扩展卡了
--------------------------------------------------------------------------------------------
那么看看我的问题:
 设置自定义背景,选中一张图片,裁剪,保存,保存路径是扩展卡的自定义路径,在4.4以下没有问题,4.4以上不可以。

 后来,我加了判断

[java]  view plain copy
  1. if (FileUtil.isExternalStorageWritable()) {  
  2.             backgroundFilePath = Environment.getExternalStorageDirectory().getPath() + "/weiwo/";  
  3.         } else {  
  4.             backgroundFilePath = context.getFilesDir().getParent() + "/weiwo/";  
  5.         }  

但是还是不行。

 经过今天晚上的调试,及对整个应用权限的思考,发现问题并不出在上面的代码。

 先看看裁剪代码


  1.     /** 
  2.      * 调用android系统自带的图片裁剪,把用户选择的图片 裁剪成适合用户手机的大小 
  3.  
  4.      * @param imagePath 
  5.      */  
  6.     public void startPhotoZoom(int resultCode, Intent data) {  
  7.         View v = listMyBackground.get(0);  
  8.         if (resultCode == Activity.RESULT_OK) {  
  9.             // 获得裁剪图片的uri  
  10.             Uri uri = data.getData();  
  11.             // 调用intent跳转的裁间页面  
  12. Intent intent = new Intent("com.android.camera.action.CROP");  
  13.             // 传入裁剪图片的路径uri和需要裁剪的格式  
  14. intent.setDataAndType(uri, "image/*");  
  15.             // 可裁剪状态  
  16. intent.putExtra("crop"true);  
  17.             intent.putExtra("scale"true);  
  18.             /** 此保存会导致小图放大(但是不是图片放大,是画面放大,图片在中间,没有放大) **/  
  19.             // intent.putExtra("outputX", v.getWidth());  
  20.             // intent.putExtra("outputY", v.getHeight());  
  21.             intent.putExtra("aspectX", v.getWidth());  
  22.             intent.putExtra("aspectY", v.getHeight());  
  23.             intent.putExtra("return-data"false);  
  24.             intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());  
  25.             intent.putExtra("noFaceDetection"true);  
  26.             /** 不用file,直接使用路径,不行 **/  
  27. File file = new File(getBackgroundFilename());  
  28.             Uri uri1 = Uri.fromFile(file);  
  29.             intent.putExtra(MediaStore.EXTRA_OUTPUT, uri1);  
  30.             startActivityForResult(intent, 5);  
  31.         }  
  32.     }  

这里有两个参数是需要注意的 
intent.putExtra("return-data", false);
 return-data=false 即裁剪后不返回图片。如果为true则返回,返回后可通过 Bitmap bitmap = data.getParcelableExtra("data"); 获取返回值

intent.putExtra(MediaStore.EXTRA_OUTPUT, uri1);
 MediaStore.EXTRA_OUTPUT 参数为一个Uri,此参数会让裁剪的应用(调用系统裁剪应用或者第三方)自行保存裁剪后的图片到uri路径。

 那么问题就在这里。


Android4.4不能使用扩展卡,所以判断以后 使用了应用自己的目录,而不是扩展卡目录。这样就是让第三方的裁剪应用把图片保存到自己的APP目录下,这显然是不可能的,可以通过一些文件管理应用查看权限,这个目录只有应用本身才可以读写的,其它应用没有读写权限。所以保存失败了。
 这样一来,扩展卡不能保存,第三方又不能跨APP保存,所以失败了。

 修改方法:
 使用返回数据,而不是让裁剪应用保存裁剪后的图片,即:
intent.putExtra("return-data", true);
 startActivityForResult(intent, 5);

在返回处理中使用
Bitmap bitmap = data.getParcelableExtra("data"); 
获取返回的裁剪图片,然后再自己保存到自己的应用目录(比如:getFilesDir())下就可以。

 这样就没有问题了。

 好纠结,做为一个后端开发工程师,闲暇时光自己开发Android应用,没有太多时间去处理这些事情,拖了这么久,终于解决了,可以安心睡觉了~


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值