适配AndroidQ拍照和读取相册图片的实现方法
Google发行Android Q版本也有很长一段时间了,华为应用市场已经要求要适配Android Q版本了,所以,我们也要去对Android Q进行适配。
先讲一下咱们这节用到的新特性
- Android Q文件存储机制修改成了沙盒模式,类似于iOS
- 应用只能访问自己沙盒下的文件和公共媒体文件
如果有想具体了解Android Q新版特效的可以去 官方文档
我们在这个地方记录一下Android Q版本进行拍照保存到相册的功能。
权限问题
Android Q不再需要申请文件读写权限,默认可以读写自己沙盒文件和公共媒体文件。因为相册属于公共媒体文件,所以,Android Q 可以不用 再动态申请权限。但是Android Q以下版本必须要申请权限才可以访问。
拍照
图片正常保存
拍照:Android Q之前版本使用的,将图片保存到指定文件夹,拍照完成后需要通知相册刷新
拍照代码
// 拍照存放路径 File fileDir = new File(Environment.getExternalStorageDirectory(), "Pictures"); if (!fileDir.exists()) { fileDir.mkdir(); } //图片名称 String fileName = "/IMG_" + System.currentTimeMillis() + ".jpg"; //跳转到相机 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); Uri uri; //适配Android N之后版本 if (Build.VERSION.SDK_INT >= 24) { uri = FileProvider.getUriForFile(this, ImagePickerProvider.getFileProviderName(this), new File(mFilePath)); } else { //适配Android N版本之前 uri = Uri.fromFile(new File(mFilePath)); } intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); //跳转,需要在onActivityResult进行处理 startActivityForResult(intent, 1111);
刷新相册代码
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + mFilePath)));
以上就是Android Q之前版本通用的拍照代码,有需要的可以直接复制就行
将图片保存到沙盒内
- 沙盒里面操作文件不再需要申请权限
- 沙盒中新建文件夹只能再系统指定的子文件夹中新建
Android Q版本使用,将图片存放到沙盒文件内,图库无法刷新,无法显示
// 获取图片沙盒文件夹 File PICTURES = getExternalFilesDir(Environment.DIRECTORY_PICTURES); //图片名称 mFileName = "IMG_" + System.currentTimeMillis() + ".jpg"; //图片路径 mFilePath = PICTURES.getAbsolutePath()+"/"+mFileName; //跳转到相机 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); Uri uri; if (Build.VERSION.SDK_INT >= 24) { uri = FileProvider.getUriForFile(this, ImagePickerProvider.getFileProviderName(this), new File(mFilePath)); } else { uri = Uri.fromFile(new File(mFilePath)); } intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); startActivityForResult(intent, 1111);
这个不用调用代码刷新相册库,因为刷新了也不能显示😁
仔细对比一下发现这两种基本上没有什么差别,只有文件存放路径不同,因为在Android Q新版本上对存储做出了改变。
将图片保存到公共文件夹
//------------------------- //拍照存放路径 //为了适配Android Q版本以下 File fileDir = new File(Environment.getExternalStorageDirectory(), "Pictures"); if (!fileDir.exists()) { fileDir.mkdir(); } String fileName = "/IMG_" + System.currentTimeMillis() + ".jpg"; //-------------------------- //-------------------------- //设置参数 Uri uri = null; // 设置保存参数到ContentValues中 ContentValues contentValues = new ContentValues(); //设置文件名 contentValues.put(MediaStore.Images.Media.DISPLAY_NAME, fileName); //兼容Android Q和以下版本 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { //android Q中不再使用DATA字段,而用RELATIVE_PATH代替 //RELATIVE_PATH是相对路径不是绝对路径 //DCIM是系统文件夹,关于系统文件夹可以到系统自带的文件管理器中查看,不可以写没存在的名字 contentValues.put(MediaStore.Images.Media.RELATIVE_PATH, "DCIM/Pictures"); } else { //Android Q以下版本 contentValues.put(MediaStore.Images.Media.DATA, mFilePath); } //设置文件类型 contentValues.put(MediaStore.Images.Media.MIME_TYPE, "image/JPEG"); //执行insert操作,向系统文件夹中添加文件 //EXTERNAL_CONTENT_URI代表外部存储器,该值不变 uri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues); // 若生成了uri,则表示该文件添加成功 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); startActivityForResult(intent, 1111);
使用这段代码也不用刷新相册库,会自动刷新。
存到公共文件的操作,相对来说麻烦点,但是也还好。
栏 目:Android代码
下一篇:Android使用开源框架ANDROID-IMAGE-INDICATOR实现图片轮播部署
本文地址:http://www.codeinn.net/misctech/208773.html