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);

使用这段代码也不用刷新相册库,会自动刷新。
存到公共文件的操作,相对来说麻烦点,但是也还好。

到此这篇关于适配AndroidQ拍照和读取相册图片的实现方法的文章就介绍到这了,更多相关AndroidQ拍照和读取相册图片内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

适配AndroidQ拍照和读取相册图片的实现方法的更多相关文章

  1. PHP读取文本文件并逐行输出该行使用最多的字符与对应次数的方法

    这篇文章主要介绍了PHP读取文本文件并逐行输出该行使用最多的字符与对应次数的方法,涉及php针对文件的读取及字符串遍历、统计、排序等相关操作技巧

  2. 教你用十行node.js代码读取docx的文本

    这篇文章主要给大家介绍了用十行node.js代码读取docx文本的相关资料,文中介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。

  3. 详解ionic本地相册、拍照、裁剪、上传(单图完全版)

    本篇文章主要介绍了ionic本地相册、拍照、裁剪、上传(单图完全版),非常具有实用价值,需要的朋友可以参考下

  4. javascript dom代码应用 简单的相册[firefox only]

    最近一直对前端开发很感兴趣,特别是在像jquery这种流行ajax类库的帮助下,即使没有很好的javascript功底也能做出不错的动态效果,确实是方便。

  5. Python实现遍历读取文件或文件夹

    搞机器学习或者深度学习算法很多时候需要遍历某个目录读取文件,特别是经常需要读取某个特定后缀的文件。本文为大家准备了Python遍历读取文件或文件夹的示例代码,需要的可以参考一下

  6. 使用 JavaScript Promise 读取 Github 用户数据

    这篇文章主要介绍了使用JavaScript Promise读取Github用户数据,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下

  7. html中select语句读取mysql表中内容

  8. 解决plt.imshow显示cv2.imread读取的图像有色差发蓝的四种方法问题

    本文主要介绍了解决plt.imshow显示cv2.imread读取的图像有色差发蓝的四种方法问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  9. Python读取CSV文件并进行数据可视化绘图

    这篇文章主要介绍了Python读取CSV文件并进行数据可视化绘图,文章围绕主题基于Python展开CSV文件读取的详细内容介绍,感兴趣的小伙伴可以参考一下

  10. Android实现拍照或者选取本地图片

    这篇文章主要为大家详细介绍了Android实现拍照或者选取本地图片,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

随机推荐

  1. Flutter 网络请求框架封装详解

    这篇文章主要介绍了Flutter 网络请求框架封装详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Android单选按钮RadioButton的使用详解

    今天小编就为大家分享一篇关于Android单选按钮RadioButton的使用详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

  3. 解决android studio 打包发现generate signed apk 消失不见问题

    这篇文章主要介绍了解决android studio 打包发现generate signed apk 消失不见问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  4. Android 实现自定义圆形listview功能的实例代码

    这篇文章主要介绍了Android 实现自定义圆形listview功能的实例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. 详解Android studio 动态fragment的用法

    这篇文章主要介绍了Android studio 动态fragment的用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. Android用RecyclerView实现图标拖拽排序以及增删管理

    这篇文章主要介绍了Android用RecyclerView实现图标拖拽排序以及增删管理的方法,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下

  7. Android notifyDataSetChanged() 动态更新ListView案例详解

    这篇文章主要介绍了Android notifyDataSetChanged() 动态更新ListView案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

  8. Android自定义View实现弹幕效果

    这篇文章主要为大家详细介绍了Android自定义View实现弹幕效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  9. Android自定义View实现跟随手指移动

    这篇文章主要为大家详细介绍了Android自定义View实现跟随手指移动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. Android实现多点触摸操作

    这篇文章主要介绍了Android实现多点触摸操作,实现图片的放大、缩小和旋转等处理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部