Android工具类ImgUtil选择相机和系统相册的示例分析
发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,这篇文章主要为大家展示了"Android工具类ImgUtil选择相机和系统相册的示例分析",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"Android工具类
千家信息网最后更新 2026年11月04日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) {//检查相机权限 ArrayList 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权限声明
5、file_paths.xml
android:resource="@xml/file_paths"中@xml/的文件名字可以随便起,但一般规范化都用此名。
xml包下(在res下面新建包xml,然后在xml下面新建file_paths.xml文件)
* file_paths.xml源码
以上是"Android工具类ImgUtil选择相机和系统相册的示例分析"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!
相机
相册
权限
选择
系统
图片
工具
内容
示例
分析
篇文章
代码
图库
地址
对话框
文件
存储
学习
对话
帮助
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
南京欣网互联网络科技有限公司
互联网科技会
互联网中国科技
金融科技 互联网金融
互联网金融科技平台
青岛中康互联网医疗科技有限公司
互联网科技博主是什么意思
互联网教育科技公司vipkid
互联网系的金融科技公司
厦门比较好的科技互联网公司
移动互联网年度科技创新
注册互联网科技公司经营范围大全
深圳艾果互联网通讯科技
卓翼科技产业互联网合作
沐思想互联网科技有限公司
2021互联网科技公司排名
互联网科技数字货币
上海互联网科技公司ppt
互联网科技包装股
北京天晋互联网科技有限公司
互联网科技的
互联网科技大会
互联网科技宣传片
互联网科技公司需要的职位
隆华科技工业互联网
互联网教育科技公司vipkid
科技互联网大厂
坤平互联网科技
图游互联网科技
中国主要互联网科技公司