Android工具类ImgUtil选择相机和系统相册
程序员文章站
2023-09-04 14:02:31
本文实例为大家分享了android选择相机和系统相册的具体代码,供大家参考,具体内容如下
说明:
android选择相机和系统相册
代码:
1、打开系统相机和系统相...
本文实例为大家分享了android选择相机和系统相册的具体代码,供大家参考,具体内容如下
说明:
android选择相机和系统相册
代码:
1、打开系统相机和系统相册工具类
package com.gxjl.pe.gxjlpesdk.util; import android.manifest; import android.app.activity; import android.app.activitymanager; import android.app.alertdialog; import android.content.context; import android.content.dialoginterface; import android.content.intent; import android.content.pm.packagemanager; import android.graphics.bitmap; import android.net.uri; import android.os.build; import android.provider.mediastore; import android.support.v4.app.activitycompat; import android.support.v4.content.contextcompat; import android.support.v4.content.fileprovider; import android.widget.toast; import java.io.bytearrayoutputstream; import java.io.file; import java.io.ioexception; import java.util.arraylist; import java.util.list; /** * 图片工具类 * created by xiaoshuai on 2018/8/17. */ public class imgutil { public static final int take_photo = 1;//拍照 public static final int choose_photo = 2;//选择相册 public static final int request_code_camera = 3;//相机权限请求 public static final int request_code_album = 4;//相册权限请求 public static uri imageuri;//相机拍照图片保存地址 /** * 选择图片,从图库、相机 * * @param activity 上下文 */ public static void choicephoto(final activity activity) { //采用的是系统dialog作为选择弹框 new alertdialog.builder(activity).settitle("上传头像")//设置对话框标题 .setpositivebutton("拍照", new dialoginterface.onclicklistener() {//添加确定按钮 @override public void onclick(dialoginterface dialog, int which) { if (build.version.sdk_int >= 23) {//检查相机权限 arraylist<string> permissions = new arraylist<>(); if (activity.checkselfpermission(manifest.permission.camera) != packagemanager.permission_granted) { permissions.add(manifest.permission.camera); } if (permissions.size() == 0) {//有权限,跳转 //打开相机-兼容7.0 opencamera(activity); } else { activity.requestpermissions(permissions.toarray(new string[permissions.size()]), request_code_camera); } } else { //打开相机-兼容7.0 opencamera(activity); } } }). setnegativebutton("系统相册", new dialoginterface.onclicklistener() { @override public void onclick(dialoginterface dialog, int which) { //如果有权限申请,请在activity中onrequestpermissionsresult权限返回里面重新调用openalbum() if (contextcompat.checkselfpermission(activity, manifest.permission.write_external_storage) != packagemanager.permission_granted) { activitycompat.requestpermissions(activity, new string[]{manifest.permission.write_external_storage}, request_code_album); } else { openalbum(activity); } } }).show();//在按键响应事件中显示此对话框 } /** * 打开相机 * 兼容7.0 * * @param activity */ public static void opencamera(activity activity) { // 创建file对象,用于存储拍照后的图片 file outputimage = new file(activity.getexternalcachedir(), "output_image.jpg"); try { if (outputimage.exists()) { outputimage.delete(); } outputimage.createnewfile(); } catch (ioexception e) { e.printstacktrace(); } if (build.version.sdk_int < 24) { imageuri = uri.fromfile(outputimage); } else { //android 7.0系统开始 使用本地真实的uri路径不安全,使用fileprovider封装共享uri //参数二:fileprovider绝对路径 com.dyb.testcamerademo:项目包名 imageuri = fileprovider.geturiforfile(activity, "com.mandaotech.ewallet.fileprovider", outputimage); } // 启动相机程序 intent intent = new intent("android.media.action.image_capture"); intent.putextra(mediastore.extra_output, imageuri); activity.startactivityforresult(intent, take_photo); } /** * 打开图库 * @param activity */ public static void openalbum(activity activity) { //调用系统图库的意图 intent choosepicintent = new intent(intent.action_pick, null); choosepicintent.setdataandtype(mediastore.images.media.external_content_uri, "image/*"); activity.startactivityforresult(choosepicintent, choose_photo); //打开系统默认的软件 //intent intent = new intent("android.intent.action.get_content"); //intent.settype("image/*"); //activity.startactivityforresult(intent, choose_photo); // 打开相册 } /** * 得到byte[] * 这里对传入的图片uri压缩到1m以内,并转换为byte[]后返回 * * @param activity 上下文 * @param uri 传入图片的uri * @return byte[] */ public static byte[] getimgbytefromuri(activity activity, uri uri) throws ioexception { bitmap bitmap = mediastore.images.media.getbitmap(activity.getcontentresolver(), uri); bytearrayoutputstream out = new bytearrayoutputstream(); bitmap.compress(bitmap.compressformat.png, 100, out);//100表示不压缩,直接放到out里面 int options = 90;//压缩比例 while (out.tobytearray().length / 1024 > 200) { // 循环判断如果压缩后图片是否大于100kb,大于继续压缩 out.reset(); // 重置baos即清空baos bitmap.compress(bitmap.compressformat.jpeg, options, out);// 这里压缩options%,把压缩后的数据存放到baos中 options -= 10;// 每次都减少10 } byte[] bs = out.tobytearray(); return bs; } }
相机选择:采用固定地址选择大图方式,上段代码块是适配7.0的,因为android 7.0系统开始 使用本地真实的uri路径不安全,使用fileprovider封装共享uri。其中android:name、exported、 android:granturipermissions、取值固定,android:authorities取值为:“自己项目包名”.fileprovider。
2、申请权限确认
工具类中点击申请权限,可以在activity中检测用户是否同意了权限
@override public void onrequestpermissionsresult(int requestcode, string[] permissions, int[] grantresults) { switch (requestcode) { case request_code_album://相册存储权限 if (grantresults.length > 0 && grantresults[0] == packagemanager.permission_granted) { imgutil.openalbum(this); } else { uiutil.showtoast(this, "选择图库需要同意权限"); } break; case request_code_camera://相机拍照权限 if (grantresults[0] == packagemanager.permission_granted) {//允许 imgutil.opencamera(ocrhandreviewactivity.this); } else {//拒绝 uiutil.showtoast(this, "只有同意相机权限,才能使用扫码功能"); } break; default: } }
3、相机和相册放回
在activity中得到拍照和选择的图片
//相机、相册、剪切 返回 @override public void onactivityresult(int requestcode, int resultcode, intent data) { //正确返回 if (resultcode == result_ok) { switch (requestcode) { case imgutil.take_photo://相机返回 log.e("返回相机", imgutil.imageuri.tostring()); glideapp.with(elecidpaactivity.this) .load(imgutil.imageuri) .skipmemorycache(true) .diskcachestrategy( diskcachestrategy.none ) .into(iv_zhengmain_photo); break; case imgutil.choose_photo://相册返回 try { if (data != null) { //相册返回 uri uri = data.getdata(); log.e("返回相册", uri.tostring()); glideapp.with(elecidpaactivity.this) .load(uri) .skipmemorycache(true) .diskcachestrategy( diskcachestrategy.none ) .into(iv_zhengmain_photo); } } catch (exception e) { e.printstacktrace(); uiutil.showtoast(this, "图片选择失败"); } break; } } else { uiutil.showtoast(this, "图片选择失败"); } }
4、androidmanifest.xml权限声明
<!--获取sd卡写的权限,用于文件上传和下载--> <uses-permission android:name="android.permission.write_external_storage"/> <uses-permission android:name="android.permission.read_external_storage"/> <!--允许读取手机状态--> <uses-permission android:name="android.permission.read_phone_state"/> <!-- 相机权限 --> <uses-permission android:name="android.permission.camera"/> <uses-permission android:name="android.permission.vibrate"/> <uses-permission android:name="android.permission.flashlight"/> <application <!--7.0相机权限--> <provider android:name="android.support.v4.content.fileprovider" android:authorities="com.dyb.testcamerademo.fileprovider" android:exported="false" android:granturipermissions="true"> <meta-data android:name="android.support.file_provider_paths" android:resource="@xml/file_paths"/> </provider>
5、file_paths.xml
android:resource=“@xml/file_paths”中@xml/的文件名字可以随便起,但一般规范化都用此名。
xml包下(在res下面新建包xml,然后在xml下面新建file_paths.xml文件)
* file_paths.xml源码
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <!-- name属性的值可以随便写,别名 path属性的值表示共享的具体位置,设置空就表示将整个sd卡进行共享 --> <paths> <external-path name="camera_photos" path=""/> </paths> </paths>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: 希腊罗马文明存在吗?为什么会有人质疑罗马文明的真实性?
下一篇: 茶叶的种类有哪些,中国六大茶类介绍