本文实例为大家分享了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 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源码

<?xml version="1.0" encoding="utf-8"?>      

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多相关文章

  1. android studio 6.0以上动态申请权限的代码
  2. framework中自定义系统级权限
  3. Android(安卓)权限表
  4. Android创建快捷方式
  5. Android下的配置管理之道之gerrit权限管理
  6. Android(安卓)进程保活系列:(一)利用 Activity 提升权限
  7. Android(安卓)Marshmallow 6.0,Asking For Permission(未校验)
  8. 手机Root后如何拿取data/data目录下的文件夹到电脑上
  9. [九鼎RK3399Pro] Android(安卓)8.1 取消usb权限弹窗,直接默认给权

随机推荐

  1. Android(安卓)Studio 在活动中使用Toast
  2. Android widget使用
  3. Total Commander 公测第三版发布[Android
  4. 01.Android相关术语
  5. Android中Bitmap和Drawable互相转化
  6. Android初识之Activity组件
  7. android View System touch 事件分发流程
  8. Android中显示,隐藏Status Bar和Navigatio
  9. Android和Android Linux kernel源码获取
  10. iOS这几个方面该向Android好好学习