Android工具类ImgUtil选择相机和系统相册的示例分析
发表于:2024-11-15 作者:千家信息网编辑
千家信息网最后更新 2024年11月15日,这篇文章主要为大家展示了"Android工具类ImgUtil选择相机和系统相册的示例分析",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"Android工具类
千家信息网最后更新 2024年11月15日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安全错误
数据库的锁怎样保障安全
2015年典型网络安全事件
网络安全门槛高吗
数据库安全被破坏的案例
数据库技术及应用刘国燊答案
论文一般要找多少数据库
服务器铁笼
南充云服务器网址
学校存在的网络安全问题
平谷ibm服务器回收价格
东升租房软件开发
云服务器备份本地数据
直播服务器多大合适
软件开发人员的专业知识技能
sql数据库语句设计
河南计算机软件开发哪家专业
网络安全法第27条要求
嵌入式软件开发环境介绍
expdp 备份数据库
数据库收权
电控硬件用什么软件开发
LA服务器
数据库报1138
霸州代理服务器
网络安全教育学生论文
应用可以创建几个数据库连接池
如何一款游戏软件开发
江苏网络安全审计系统咨询服务费
永寿县网络安全局
软件开发行业工商缴费比例
保证数据库安全和备份的文件