Android工具类ImgUtil选择相机和系统相册的示例分析
发表于:2025-01-22 作者:千家信息网编辑
千家信息网最后更新 2025年01月22日,这篇文章主要为大家展示了"Android工具类ImgUtil选择相机和系统相册的示例分析",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"Android工具类
千家信息网最后更新 2025年01月22日Android工具类ImgUtil选择相机和系统相册的示例分析
这篇文章主要为大家展示了"Android工具类ImgUtil选择相机和系统相册的示例分析",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"Android工具类ImgUtil选择相机和系统相册的示例分析"这篇文章吧。
具体内容如下
说明:
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) {//检查相机权限 ArrayListpermissions = 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权限声明
5、file_paths.xml
android:resource="@xml/file_paths"中@xml/的文件名字可以随便起,但一般规范化都用此名。
xml包下(在res下面新建包xml,然后在xml下面新建file_paths.xml文件)
* file_paths.xml源码
以上是"Android工具类ImgUtil选择相机和系统相册的示例分析"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!
相机
相册
权限
选择
系统
图片
工具
内容
示例
分析
篇文章
代码
图库
地址
对话框
文件
存储
学习
对话
帮助
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
服务器目前
专家讲解网络技术
低分可以学软件开发专业吗
邯郸计算机软件开发有用吗
网络安全宣传周主题晚会陕西
战地5联不上ea服务器
移动web软件开发
青岛公安局网络安全管理待遇如何
删除数据库test并作删除判断
如何用云服务器设置路由器
三层架构 数据库
融易推网络技术
泰州fil服务器咨询
短期网络技术培训
嵌入式软件转行应用软件开发
网络安全检测算法
steamea服务器
电商平台网络安全等级
江苏网络技术转让哪家好
软件开发职位
服务器主板 插普通电源没反应
上海潮流软件开发价格优惠
共享服务器测试
长春数据库数据恢复
卓越服务器是什么
东城区信息网络技术推广服务保障
阿里云服务器密钥文件类型
绿盟科技中国网络安全年会
河北党员教育软件开发电话
山东大学的网络安全教授