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

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

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

(0)

相关推荐

  • Android获取本地相册图片和拍照获取图片的实现方法

    需求:从本地相册找图片,或通过调用系统相机拍照得到图片. 容易出错的地方: 1.当我们指定了照片的uri路径,我们就不能通过data.getData();来获取uri,而应该直接拿到uri(用全局变量或者其他方式)然后设置给imageView imageView.setImageURI(uri); 2.我发现手机前置摄像头拍出来的照片只有几百KB,直接用imageView.setImageURI(uri);没有很大问题,但是后置摄像头拍出来的照片比较大,这个时候使用imageView.setIm

  • Android拍照和获取相册图片

    之前遇到各种拍照啊,获取相册图片之类,都是直接去度娘,要么之前的代码复制下,没好好总结过. 再也不要问度娘了,再也不用一堆博客里找啊找了... ----------------------------------------------我是正文的分割线----------------------------------------------------------- 一个一个来,先说调用手机相机拍照(最简单版): cameraButton.setOnClickListener(new View

  • android图像绘制(六)获取本地图片或拍照图片等图片资源

    从SD卡中获取图片资源,或者拍一张新的图片. 先贴代码 获取图片: 注释:拍照获取的话,可以指定图片的保存地址,在此不说明. 复制代码 代码如下: CharSequence[] items = {"相册", "相机"}; new AlertDialog.Builder(this) .setTitle("选择图片来源") .setItems(items, new OnClickListener() { public void onClick(Dia

  • Android自定义组件获取本地图片和相机拍照图片

    iOS中有封装好的选择图片后长按出现动画删除效果,效果如下 而Android找了很久都没有找到有这样效果的第三方组件,最后懒得找了还是自己实现这效果吧 选择图片后还可对图片进行剪裁 当然,代码中还有很多不完善的地方,我接下来会继续完善这个组件的 已经上传到开源社区,欢迎大家来Star啊~ Demo源码:传送门 设计中的碰到的一些问题和解决思路 1.如何让加号图片显示在GridView最后面 首先在调用GridAdapter构造方法时就加载加号图片 /** * 图片适配器 * @param con

  • Android开发之使用ExifInterface获取拍照后的图片属性

    本文实例讲述了Android开发之使用ExifInterface获取拍照后的图片属性.分享给大家供大家参考,具体如下: ExifInterface exif = new ExifInterface(file.getPath()); String widthStr = exif.getAttribute(ExifInterface.TAG_IMAGE_WIDTH); String heightStr = exif.getAttribute(ExifInterface.TAG_IMAGE_LENGT

  • Android应用中拍照后获取照片路径并上传的实例分享

    Activity 中的代码,我只贴出重要的事件部分代码 public void doPhoto(View view) { destoryBimap(); String state = Environment.getExternalStorageState(); if (state.equals(Environment.MEDIA_MOUNTED)) { Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); s

  • Android部分手机拍照后获取的图片被旋转问题的解决方法

    调用Android系统拍照功能后,三星手机拍摄后的照片被旋转了90度,横着拍给你变成竖的,竖的拍给你变成横的.其它品牌的手机都是正常的,就三星出现这个怪事. 在Android适配上,我原来一直以为国内的小米手机够奇葩了,结果还有更奇葩的!你说你没事旋转照片干啥,实在是猜不透其居心何在,纯粹是在给开发者制造麻烦啊! 解决办法是获取到拍照后照片被旋转的角度,再旋转回去就好了. 具体思路: 1.首先在调用拍照方法时,保存拍照后的相片原图,得到原图路径,(PhotoBitmapUtils是我自己写的一个

  • Android 拍照选择图片并上传功能的实现思路(包含权限动态获取)

    作为一个Android新手,想实现手机拍照并上传的功能,经过查找资料,已实现此功能.在此记录备忘.老鸟请忽略. 一.实现思路: 1.Android手机客户端,拍照(或选择图片),然后上传到服务器. 2.服务器端接收手机端上传上来的图片. 二.实现步骤: 1.按惯例,先放效果图: 项目结构: 2.activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:a

  • 适配AndroidQ拍照和读取相册图片的实现方法

    Google发行Android Q版本也有很长一段时间了,华为应用市场已经要求要适配Android Q版本了,所以,我们也要去对Android Q进行适配. 先讲一下咱们这节用到的新特性 Android Q文件存储机制修改成了沙盒模式,类似于iOS 应用只能访问自己沙盒下的文件和公共媒体文件 如果有想具体了解Android Q新版特效的可以去 官方文档 我们在这个地方记录一下Android Q版本进行拍照保存到相册的功能. 权限问题 Android Q不再需要申请文件读写权限,默认可以读写自己沙

  • Android实现拍照截取和相册图片截取

    关于拍照截取和相册截取,看了网上很多资料,自己整理了一份比较详细的,供有需要的人参考 1  拍照 原理就是通过intent调用系统的相机,拍完照在回调进行操作,成功获取到拍完照的图片根据uri调用系统的裁剪页面,裁剪完也是在回调中进行处理,显示在页面的imageview中. 2  相册选取图片 原理也是通过intent打开系统的图片,用户选择完成以后在回调中根据图片的uri调用系统的裁剪页面,同上. 首先,定义几个常量 public static final int TAKE_PHOTO = 1

  • Android实现拍照、选择相册图片并裁剪功能

    通过拍照或相册中获取图片,并进行裁剪操作,然后把图片显示到ImageView上.  当然也可以上传到服务器(项目中绝大部分情况是上传到服务器),参考网上资料及结合项目实际情况,  测试了多款手机暂时没有发现严重问题.代码有注释,直接贴代码: public class UploadPicActivity extends Activity implements View.OnClickListener { private Button take_photo_btn; private Button s

  • Android圆形头像拍照后“无法加载此图片”的问题解决方法(适配Android7.0)

    Feature: 点击选择拍照或者打开相册,选取图片进行裁剪最后设置为圆形头像. Problem: 拍好照片,点击裁剪,弹Toast"无法加载此图片". Solution: 在裁剪的class里加两行代码 intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 主要代码如下: public static final S

  • 微信js-sdk预览图片接口及从拍照或手机相册中选图接口用法示例

    本文实例讲述了微信js-sdk预览图片接口及从拍照或手机相册中选图接口用法.分享给大家供大家参考,具体如下: 目前中js-sdk 1.0版本中,预览图片提供了2个接口,接口的定义参考官方文档 1.预览网络图片http链接的 2.预览本地图片wenxin:// 链接的 一.预览图片接口 注: 1.预览图片接口目前只支持微信手机版 2.预览图片只支持http连接,对于weixin:// 无法预览 3.预览图片的地址需要进行加密处理,尤其路径中有中文的情况下,需要使用window.encodeURI(

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

    本文实例为大家分享了Android实现拍照或者选取本地图片的具体代码,供大家参考,具体内容如下 总体流程 从selectPhotoActivity中启动图册或者相机,再根据获取的uri进行裁剪,返回uri,再对这个uri执行一系列操纵. 从相册选取图片 private void pickPhoto() {         Intent intent = new Intent(Intent.ACTION_PICK,                 android.provider.MediaSto

  • Android实现选择相册图片并显示功能

    本文实例为大家分享了Android实现选择相册图片并显示的具体代码,供大家参考,具体内容如下 需求描述: 选择手机相册中的一张图片,并通过ImageView展示出来 参考博文: android打开手机相册获取真正的图片路径 效果展示: 示例代码: MainActivity package com.example.www.mutilmedia; import android.Manifest; import android.app.Activity; import android.content.

  • android实现拍照或从相册选取图片

    从相册或拍照更换图片功能的实现:(取图无裁剪功能) 获取图片方式: (类似更换头像的效果) 1.手机拍照 选择图片: 2.相册选取图片: 本文只是简单实现该功能,页面展示有些简陋,运行效果图如下: 创建xml布局文件(activity_main.xml ): 头部两个Button按钮,一个控制从相册选择照片,一个控制启动相册拍照选择图片.底部为一个ImageVIew,用于展示刚刚选择的图片. <?xml version="1.0" encoding="utf-8&quo

  • JS实现的相册图片左右滚动完整实例

    本文实例讲述了JS实现的相册图片左右滚动效果.分享给大家供大家参考,具体如下: 执行左移右移函数: var $get = function(id) { return "string" == typeof id ? document.getElementById(id) : id; }; var Extend = function(destination, source) { for (var property in source) { destination[property] = s

随机推荐