引用链接

Android开发之调用相机拍照与本地图库选择图片
Android调用相机实现拍照功能

部分截图

引言

小项目有一个访问相册的需求,在网上查找得到两位大神博客指点,但博客发布时间过旧,难免因更新而产生Bug,我便把Bug进行修改并对代码进行了适量调整,供大家参考

MainActivity2

package com.example.myapplication;import android.Manifest;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.core.content.FileProvider;import java.io.File;public class MainActivity2 extends AppCompatActivity {private static final String TAG = "图片";private static final int TAKE_PHOTO = 11;// 拍照private static final int CROP_PHOTO_TAKE = 12;// 裁剪图片private static final int CROP_PHOTO_LOCAL = 14;// 裁剪图片private static final int LOCAL_CROP = 13;// 本地图库private Button btn_choose_picture;private ImageView iv_show_picture;private Uri imageUri;// 拍照时的图片uri@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main2);setViews();// 初始化控件setListeners();// 设置监听requestPermission();  //在其中若用户给予权限则请求相机拍照}//动态请求权限private void requestPermission() {if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {//请求权限ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA}, 1);}}/*** 设置监听*/private void setListeners() {// 展示图片按钮点击事件btn_choose_picture.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {takePhotoOrSelectPicture();// 拍照或者调用图库}});}/****/private void takePhotoOrSelectPicture() {CharSequence[] items = {"拍照", "图库"};// 裁剪items选项// 弹出对话框提示用户拍照或者是通过本地图库选择图片new AlertDialog.Builder(MainActivity2.this).setItems(items, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {switch (which) {// 选择了拍照case 0:// 创建文件保存拍照的图片File takePhotoImage = new File(Environment.getExternalStorageDirectory(), "take_photo_image.jpg");try {// 文件存在,删除文件if (takePhotoImage.exists()) {takePhotoImage.delete();}// 根据路径名自动的创建一个新的空文件takePhotoImage.createNewFile();} catch (Exception e) {e.printStackTrace();}// 获取图片文件的uri对象// imageUri = Uri.fromFile(takePhotoImage);if (Build.VERSION.SDK_INT >= 24) {imageUri = FileProvider.getUriForFile(MainActivity2.this,"com.example.myapplication.MainActivity2", takePhotoImage);} else {imageUri = Uri.fromFile(takePhotoImage);}// 创建Intent,用于启动手机的照相机拍照Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);// 指定输出到文件uri中intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);// 启动intent开始拍照startActivityForResult(intent, TAKE_PHOTO);break;// 调用系统图库case 1:// 创建Intent,用于打开手机本地图库选择图片Intent intent1 = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);// 启动intent打开本地图库startActivityForResult(intent1, LOCAL_CROP);break;}}}).show();}/*** 调用startActivityForResult方法启动一个intent后,* 可以在该方法中拿到返回的数据*/@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);switch (requestCode) {case TAKE_PHOTO:// 拍照if (resultCode == RESULT_OK) {// 创建intent用于裁剪图片Intent intent = new Intent("com.android.camera.action.CROP");// 设置数据为文件uri,类型为图片格式intent.setDataAndType(imageUri, "image/*");// 允许裁剪intent.putExtra("scale", true);// 指定输出到文件uri中intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);// 启动intent,开始裁剪startActivityForResult(intent, CROP_PHOTO_TAKE);}break;case LOCAL_CROP:// 系统图库if (resultCode == RESULT_OK) {// 创建intent用于裁剪图片Intent intent1 = new Intent("com.android.camera.action.CROP");// 获取图库所选图片的uriUri uri = data.getData();intent1.setDataAndType(uri, "image/*");//  设置裁剪图片的宽高intent1.putExtra("outputX", 300);intent1.putExtra("outputY", 300);// 裁剪后返回数据intent1.putExtra("return-data", true);// 启动intent,开始裁剪startActivityForResult(intent1, CROP_PHOTO_LOCAL);}break;case CROP_PHOTO_TAKE:// 裁剪后展示图片if (resultCode == RESULT_OK) {try {// 展示拍照后裁剪的图片if (imageUri != null) {// 创建BitmapFactory.Options对象BitmapFactory.Options option = new BitmapFactory.Options();// 属性设置,用于压缩bitmap对象option.inSampleSize = 2;option.inPreferredConfig = Bitmap.Config.RGB_565;// 根据文件流解析生成Bitmap对象Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri), null, option);// 展示图片iv_show_picture.setImageBitmap(bitmap);}} catch (Exception e) {e.printStackTrace();}}break;case CROP_PHOTO_LOCAL:// 裁剪后展示图片if (resultCode == RESULT_OK) {try {// 展示图库中选择裁剪后的图片if (data != null) {// 根据返回的data,获取Bitmap对象Bitmap bitmap = data.getExtras().getParcelable("data");// 展示图片iv_show_picture.setImageBitmap(bitmap);}} catch (Exception e) {e.printStackTrace();}}break;}}/*** 控件初始化*/private void setViews() {btn_choose_picture = (Button) findViewById(R.id.btn_choose_picture);iv_show_picture = (ImageView) findViewById(R.id.iv_show_picture);}
}

布局activity_main2

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity2"><Buttonandroid:id="@+id/btn_choose_picture"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Button"app:layout_constraintBottom_toTopOf="@+id/iv_show_picture"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.5"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /><ImageViewandroid:id="@+id/iv_show_picture"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/ic_launcher_background"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.5"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/btn_choose_picture" />
</androidx.constraintlayout.widget.ConstraintLayout>```

manifests中添加权限

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

manifests中application添加内容提供者

<!-- 为调用相机拍照设置内容提供者 -->
<providerandroid:name="androidx.core.content.FileProvider"android:authorities="com.example.myapplication.MainActivity2"android:exported="false"android:grantUriPermissions="true"tools:ignore="WrongManifestParent"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_paths" />
</provider>

mainfests中application标签里添加

android:requestLegacyExternalStorage="true"

res\xml目录下新建file_paths

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android"><external-pathname="my_images"path="."/>
</paths>

Android开发之调用相机拍照与本地图库选择图片相关推荐

  1. uni-app用uni.chooseImage API调用相机或从相册中选择图片

    uni-app用uni.chooseImage API调用相机或从相册中选择图片 chooseImage: function() {var _this = this;uni.chooseImage({ ...

  2. ionic android 小米手机 调用相机拍照失败或者照片不显示(Camera cancelled)

    我们用的是ionic框架,而项目中调用手机拍照的功能是使用cordova插件中的cordova plugin add cordova-plugin-camera插件,但是在有些android拍完照片之 ...

  3. h5(网页) 调用相机拍照和相册,实现图片上传功能

    情景描述: 一个h5或者网页中需要上传图片功能,并且这个功能可以选择本地的图片或者拍照上传: 实现方法: 我们在网页中是可以直接调用手机的相机或者上传本地图片的,也就是说,我们是有使用本地图片文件和 ...

  4. JS和Android互调(调用相机拍照)

    Android用的是jsbridge.BridgeWebView.github链接:https://github.com/lzyzsd/JsBridge js封装了一下方法(参考:JSbridge 在 ...

  5. Android开发之调用摄像头拍照(Android 第一行代码)

    布局文件(拍照按钮+图片显示) <?xml version="1.0" encoding="utf-8"?> <LinearLayout xm ...

  6. 安卓端调用相机拍照返回并预览---清晰原图

    安卓端调用相机拍照并返回预览图片 一.demo预览 二.xml代码和activity简单代码描述. 三.老规矩再来写几个转换工具方法 继之前写的安卓调用相机拍照返回预览,如果对于画质要求不高的话可以考 ...

  7. iOS上传头像, 相册权限,相册权限,拍照上传,相册选择图片,拍照页面语言设置,保存到相册...

    2019独角兽企业重金招聘Python工程师标准>>> 1. 权限 在打开相机拍照或者打开相册选择图片之前, 有必要先判断先是否有权限, 如果没有权限应该给个提示, 让用户自己去设置 ...

  8. 安卓系统android使用C# .NET Xamarin框架调用相机拍照

    安卓系统android使用C# .NET Xamarin框架调用相机拍照 引言 一.用到的软件.包 二.创建Android应用(Xamarin), 三.增加Nuget中库Xam.Plugin.Medi ...

  9. android intent拍照,Android通过Intent方式调用相机拍照取得图片

    Android通过Intent方式调用相机拍照取得图片 AndroidManifest.XML 权限设置: XML布局设置: 代码: public classMainActivityextendsAp ...

最新文章

  1. mysql db.opt+ (frm,MYD,MYI)备份与还原数据库
  2. css匹配title,解决css中的匹配问题
  3. 编写MyLayer,2 锚点,3 精灵的创建,4 zorder
  4. 10+ 最佳的 Node.js 教程和实例
  5. 使用国内DOCKER镜像源
  6. PSIM软件中 Simplified C Block模块 和 C Block模块区别
  7. 线段树之单点更新,区域求和
  8. 想成为嵌入式程序员应知道的0x10个基本问题——转
  9. eclipse开发servlet,HttpServletRequest报红叉解决方案
  10. 【题目】两个整数相除得到循环小数,求循环节
  11. 朴素贝叶斯解决凉鞋问题
  12. 内容过于真实,可能会引起不适-----程序员去面试的梗!面试官:“哦了,明天来上班吧”
  13. 数据标准化——scikit-learn
  14. 28.查询所有学生的课程及分数情况(存在学生没成绩,没选课的情况)
  15. 未能找到下列包文件: C:\Users\Administrator\Desktop\DotNetFX40\dotNetFx40LP_Full_x86_x64zh-Hans.exe
  16. 《程序员的数学》三部曲
  17. 高新的技术对不对_同样是申请高新技术企业认定,为什么你会失败?
  18. EEC: LEARNING TO ENCODE AND REGENERATE IMAGES FOR CONTINUAL LEARNING
  19. Vue2-搭建书写健身app项目
  20. c#如何wmf图片转换成png图片_c# bmp图片转换成 wmf格式 实例

热门文章

  1. 三行代码把女朋友照片变成了素描图片!人生苦短,爱python多一些
  2. 拼接 sql 防注入
  3. JAVA泛型QUIK START
  4. android 原生按键事件触发
  5. 巧用树莓派为孩子播放art for kids画画课程
  6. 小程序和uniapp的globalData以及getApp()
  7. [架构之路-132]-《软考-系统架构设计师》-软件工程-2-需求工程
  8. Games104 Lecture 3 如何构建一个游戏世界
  9. win10 wslg安装中文输入法
  10. Android OpenGL开发学习(二)手把手教你实现抖音分屏相机