凯发娱发k8

如何适配androidq拍照和读取相册图片? -凯发娱发k8

2024-01-24

不懂如何适配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拍照和读取相册图片?内容对大家有帮助,同时也希望大家多多支持本站,关注本站行业资讯频道,遇到问题就找本站,详细的解决方法等着你来学习!

网站地图