1.首先是效果图

2.布局及依赖

布局:

<?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=".MainActivity"><Buttonandroid:id="@+id/take"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="拍照"android:onClick="startTake"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /><androidx.camera.view.PreviewViewandroid:id="@+id/surfacePreview"android:layout_width="match_parent"android:layout_height="match_parent"/><ImageViewandroid:id="@+id/ivPic"android:src="@mipmap/ic_launcher"app:layout_constraintRight_toRightOf="parent"app:layout_constraintBottom_toBottomOf="parent"android:layout_width="200dp"android:layout_height="200dp"/></androidx.constraintlayout.widget.ConstraintLayout>

依赖:

    def camerax_version = "1.0.0-beta03"
// CameraX core library using camera2 implementationimplementation "androidx.camera:camera-camera2:$camerax_version"
// CameraX Lifecycle Libraryimplementation "androidx.camera:camera-lifecycle:$camerax_version"
// CameraX View classimplementation "androidx.camera:camera-view:1.0.0-alpha10"

3.activity

kotlin方式:

package com.xtm.camerademoimport android.Manifest
import android.content.pm.PackageManager
import android.graphics.BitmapFactory
import android.net.Uri
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.ImageView
import android.widget.Toast
import androidx.camera.core.*
import androidx.camera.lifecycle.ProcessCameraProvider
import androidx.camera.view.PreviewView
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import java.io.Fileclass MainActivity : AppCompatActivity() {private lateinit var imageCapture: ImageCaptureprivate var takePic: Button? = nullprivate var ivPick: ImageView? = nullprivate var surfacePreview: PreviewView? = nullprivate lateinit var camera: Cameraprivate lateinit var preview: Previewprivate val REQ_CODE:Int = 1override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)initView()initData()}private fun initView() {surfacePreview = findViewById<PreviewView>(R.id.surfacePreview)takePic = findViewById<Button>(R.id.take)ivPick = findViewById<ImageView>(R.id.ivPic)}private fun initData() {// 检查相机权限if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {println("===>需要权限")if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {println("===>shouldShowRequestPermissionRationale")} else {println("===>not shouldShowRequestPermissionRationale")}ActivityCompat.requestPermissions(this,arrayOf(Manifest.permission.CAMERA),REQ_CODE)} else {println("===>已经获取到了权限")startCamera();}}/*** 打开相机并预览*/private fun startCamera() {println("打开相机")val cameraProviderFuture = ProcessCameraProvider.getInstance(this)val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()// 设置预览preview = Preview.Builder().build()  //  UseCase子类Preview// 设置拍照imageCapture = ImageCapture.Builder().build()// UseCase子类ImageCapture// 设置打开的相机(前置/后置)val cameraSelector =CameraSelector.Builder().requireLensFacing(CameraSelector.LENS_FACING_BACK).build()try {// 解除相机之前的所有绑定cameraProvider.unbindAll()// 绑定前面用于预览和拍照的UseCase到相机上camera = cameraProvider.bindToLifecycle(this, cameraSelector, preview, imageCapture)// 设置用于预览的viewpreview?.setSurfaceProvider(surfacePreview?.createSurfaceProvider(camera?.cameraInfo))} catch (exc: Exception) {println("Use case绑定失败")}}/*** 拍照*/private fun takePhoto() {// 拍照保存路径val imagePath =filesDir.absolutePath + "/test.jpg"// 因为这里是内部文件不需要动态申请内存卡读写权限,这里不能有子目录,否则出错:比如+“/pic/test.jpg”val file = File(imagePath);val outputOptions = ImageCapture.OutputFileOptions.Builder(file).build()// 开始拍照imageCapture.takePicture(outputOptions,ContextCompat.getMainExecutor(this),object : ImageCapture.OnImageSavedCallback {override fun onError(exc: ImageCaptureException) {println("Photo capture failed: ${exc.message}")}override fun onImageSaved(output: ImageCapture.OutputFileResults) {val savedUri = Uri.fromFile(file)val msg = "Photo capture succeeded: $savedUri"Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()println(msg)// 显示拍照内容ivPick?.setImageBitmap(BitmapFactory.decodeFile(file.absolutePath))}})}/*** 点击拍照按钮*/fun startTake(view: View) {takePhoto()}override fun onRequestPermissionsResult(requestCode: Int,permissions: Array<out String>, grantResults: IntArray) {super.onRequestPermissionsResult(requestCode, permissions, grantResults)if (requestCode == REQ_CODE && grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {startCamera()println("权限获取成功")} else {println("你拒绝了权限")}}}

java方式:

import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.camera.core.Camera;
import androidx.camera.core.CameraSelector;
import androidx.camera.core.ImageCapture;
import androidx.camera.core.ImageCaptureException;
import androidx.camera.core.Preview;
import androidx.camera.core.ImageCapture.OnImageSavedCallback;
import androidx.camera.core.ImageCapture.OutputFileOptions;
import androidx.camera.core.ImageCapture.OutputFileResults;
import androidx.camera.lifecycle.ProcessCameraProvider;
import androidx.camera.view.PreviewView;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import com.google.common.util.concurrent.ListenableFuture;
import com.ybzl.big_refrigerator.R;import java.io.File;
import java.util.concurrent.ExecutionException;import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;public final class CameraTestActivity extends AppCompatActivity {private ImageCapture imageCapture;private Button takePic;private ImageView ivPick;private PreviewView surfacePreview;private Camera camera;private Preview preview;private final int REQ_CODE = 1;protected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_camera_test);initView();this.initData();}private void initView() {surfacePreview = findViewById(R.id.surfacePreview);takePic = findViewById(R.id.take);ivPick = findViewById(R.id.ivPic);}private final void initData() {String var1;boolean var2;if (ContextCompat.checkSelfPermission((Context)this, "android.permission.CAMERA") != 0) {var1 = "===>需要权限";var2 = false;System.out.println(var1);if (ActivityCompat.shouldShowRequestPermissionRationale((Activity)this, "android.permission.CAMERA")) {var1 = "===>shouldShowRequestPermissionRationale";var2 = false;System.out.println(var1);} else {var1 = "===>not shouldShowRequestPermissionRationale";var2 = false;System.out.println(var1);}ActivityCompat.requestPermissions((Activity)this, new String[]{"android.permission.CAMERA"}, this.REQ_CODE);} else {var1 = "===>已经获取到了权限";var2 = false;System.out.println(var1);this.startCamera();}}private final void startCamera() {System.out.println("打开相机");ListenableFuture<ProcessCameraProvider>  cameraProviderFuture = ProcessCameraProvider.getInstance(this);ProcessCameraProvider cameraProvider = null;try {cameraProvider = cameraProviderFuture.get();// 设置预览preview = new Preview.Builder().build() ; //  UseCase子类Preview// 设置拍照imageCapture = new ImageCapture.Builder().build();// UseCase子类ImageCapture// 设置打开的相机(前置/后置)CameraSelector cameraSelector = new CameraSelector.Builder().requireLensFacing(CameraSelector.LENS_FACING_BACK).build();try {// 解除相机之前的所有绑定cameraProvider.unbindAll();// 绑定前面用于预览和拍照的UseCase到相机上camera = cameraProvider.bindToLifecycle(this, cameraSelector, preview, imageCapture);// 设置用于预览的viewif(preview!=null && surfacePreview!=null && camera!=null){preview.setSurfaceProvider(surfacePreview.createSurfaceProvider(camera.getCameraInfo()));}} catch (Exception e) {System.out.println("Use case绑定失败");}} catch (ExecutionException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}}private final void takePhoto() {// 拍照保存路径String imagePath = getFilesDir().getAbsolutePath() + "/test.jpg";// 因为这里是内部文件不需要动态申请内存卡读写权限,这里不能有子目录,否则出错:比如+“/pic/test.jpg”File file = new File(imagePath);OutputFileOptions outputOptions = new ImageCapture.OutputFileOptions.Builder(file).build();// 开始拍照imageCapture.takePicture(outputOptions, ContextCompat.getMainExecutor(this),new OnImageSavedCallback() {@Overridepublic void onImageSaved(@NonNull @NotNull OutputFileResults outputFileResults) {Uri savedUri = Uri.fromFile(file);String msg = "Photo capture succeeded: "+savedUri;Toast.makeText(getApplication(), msg, Toast.LENGTH_SHORT).show();// 显示拍照内容if(ivPick!=null){ivPick.setImageBitmap(BitmapFactory.decodeFile(file.getAbsolutePath()));}}@Overridepublic void onError(@NonNull @NotNull ImageCaptureException exception) {System.out.println(exception.getImageCaptureError());}});}/*** 点击拍照按钮*/public void startTake(View view) {takePhoto();}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull @NotNull String[] permissions, @NonNull @NotNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);if (requestCode == REQ_CODE && grantResults!=null && grantResults[0] == PackageManager.PERMISSION_GRANTED) {startCamera();System.out.println("权限获取成功");} else {System.out.println("你拒绝了权限");}}}

4.清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.xtm.camerademo"><uses-feature android:name="android.hardware.camera.any" /><uses-permission android:name="android.permission.CAMERA" /><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.CameraDemo"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>

Android使用CameraX打开相机拍照简单使用相关推荐

  1. Android WebView中打开相机拍照和选择相册

    一般在项目中与js交互,可能会遇到上传文件图片等操作,避免不了一些坑,下面简单说一下,Android 在不同版本中webView调用相机,选择相册的方法是不一样的,3.0以下的调用 public vo ...

  2. Android开发之调用相机拍照与本地图库选择图片

    引用链接 Android开发之调用相机拍照与本地图库选择图片 Android调用相机实现拍照功能 部分截图 引言 小项目有一个访问相册的需求,在网上查找得到两位大神博客指点,但博客发布时间过旧,难免因 ...

  3. Unity for IOS 加载手机相册图片以及打开相机拍照获取图片

    Unity for IOS 加载手机相册图片以及打开相机拍照获取图片 最近想做一个使用unity for IOS获取手机图片的功能,所以就研究了一下 这里我们需要创建两个objective-c文件,最 ...

  4. Qt for Android调用原生接口打开相机拍照并存储照片

    Qt开发Android应用,需求是通过调用Android原生接口去打开系统相机拍照,并返回拍摄的照片.原理很简单,现在Java文件中写android代码调用相机,拍照后将将相片存储在SD卡,然后在C+ ...

  5. 详记Android打开相机拍照流程

    写在前面 本文并不是基于Camera2的,所以想要了解Camera2的同学可以先散了.文题加了详记二字,因为相机整个打开的流程的确是比较复杂的,稍有疏忽可能就会引发一系列问题.我也是看了一下Andro ...

  6. android 打开相机拍照功能吗,Android调用相机实现拍照功能

    引言 在Android开发中相信大家都会遇到修改用户头像的问题,用户信息常常包含用户头像,一般流程为:默认头像-->用户修改(拍照/相册选择)-->保存头像图片. 本期我们就来实现调用系统 ...

  7. Android的camerax预览拍照

    前面讲了,camera1和camera2的简单使用.从前文可以看出来,API 的调用还是比较繁琐的,而且像一些最佳尺寸,角度等还得自己算.由于camera1支持的特性很少,camera2流程又很繁琐, ...

  8. android基础学习之相机拍照部分

    在学习这个模块之前必须要对android有关于相机拍照的API有所了解  , 这个模块的API有两部分  一部分就是Camera 还有一部分 是Camera2 好像androidX包里面还有一个Cam ...

  9. Android 调起系统相机拍照

    概述 比奇小说网 m.biqi.org 最近在看 nanChen 写的图片选择器 ImagePicker,感觉写得很不错,也打算把从中学到的东西写下来.很多时候,遇到一个好的框架能够降低开发成本这是好 ...

最新文章

  1. 深大计算机与科学,陆楠 - 深圳大学 - 计算机与软件学院
  2. Spring中bean的scope详解
  3. 重设忘记的Mysql密码
  4. P4597-序列sequence【堆】
  5. iPhone12再曝光:苹果终于对它的天线动手了
  6. GHOST XP SP2 遐想网络 纯净驱动版 3.1
  7. 测试计划模板——Test Plan(中英文)
  8. html手机页面怎么保存图片,【答疑】你知道手机怎么保存网页长图吗?超简单!...
  9. box-sizing失效的原因
  10. HTML生成Word文档,可自定义Word文档页眉、页脚、分页。
  11. 强哥日常高效工作流骨灰级玩家培训课程
  12. 介绍中国传统节日的网页html,中国传统节日大全表 中国16个传统节日介绍
  13. java 无限循环_Java中的无限循环
  14. 安卓第三方ROM----AOKP和CM
  15. QA:Modem-QAM解码
  16. Frequent Pattern Mining(频繁模式挖掘) - Aprior挖掘算法
  17. visual studio code下载慢解决办法
  18. 【转录调控网络】代谢组学与其他组学的联合分析经典模式简介
  19. excel如何快速自动让空白单元格填充上一行内容
  20. NodeMCU(ESP8266)使用HTTP Get和Post

热门文章

  1. TCP/IP协议数据链路层
  2. python throw_python 之 异常处理
  3. opera中添加搜索引擎
  4. Mysql中大于、大于等于、小于、小于等于的写法
  5. win7 锁定后硬盘灯常亮
  6. 机器学习必备知识点 之 先验概率和后验概率
  7. 数据库应用(mysql)数据库管理
  8. 菜鸟学机器学习,Sklearn库主要模块功能简介
  9. SpringBoot+Vue 实现大文件断点下载
  10. 一次探索:基于香农熵预测DNA中编码序列,python实现。