Android使用CameraX打开相机拍照简单使用
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打开相机拍照简单使用相关推荐
- Android WebView中打开相机拍照和选择相册
一般在项目中与js交互,可能会遇到上传文件图片等操作,避免不了一些坑,下面简单说一下,Android 在不同版本中webView调用相机,选择相册的方法是不一样的,3.0以下的调用 public vo ...
- Android开发之调用相机拍照与本地图库选择图片
引用链接 Android开发之调用相机拍照与本地图库选择图片 Android调用相机实现拍照功能 部分截图 引言 小项目有一个访问相册的需求,在网上查找得到两位大神博客指点,但博客发布时间过旧,难免因 ...
- Unity for IOS 加载手机相册图片以及打开相机拍照获取图片
Unity for IOS 加载手机相册图片以及打开相机拍照获取图片 最近想做一个使用unity for IOS获取手机图片的功能,所以就研究了一下 这里我们需要创建两个objective-c文件,最 ...
- Qt for Android调用原生接口打开相机拍照并存储照片
Qt开发Android应用,需求是通过调用Android原生接口去打开系统相机拍照,并返回拍摄的照片.原理很简单,现在Java文件中写android代码调用相机,拍照后将将相片存储在SD卡,然后在C+ ...
- 详记Android打开相机拍照流程
写在前面 本文并不是基于Camera2的,所以想要了解Camera2的同学可以先散了.文题加了详记二字,因为相机整个打开的流程的确是比较复杂的,稍有疏忽可能就会引发一系列问题.我也是看了一下Andro ...
- android 打开相机拍照功能吗,Android调用相机实现拍照功能
引言 在Android开发中相信大家都会遇到修改用户头像的问题,用户信息常常包含用户头像,一般流程为:默认头像-->用户修改(拍照/相册选择)-->保存头像图片. 本期我们就来实现调用系统 ...
- Android的camerax预览拍照
前面讲了,camera1和camera2的简单使用.从前文可以看出来,API 的调用还是比较繁琐的,而且像一些最佳尺寸,角度等还得自己算.由于camera1支持的特性很少,camera2流程又很繁琐, ...
- android基础学习之相机拍照部分
在学习这个模块之前必须要对android有关于相机拍照的API有所了解 , 这个模块的API有两部分 一部分就是Camera 还有一部分 是Camera2 好像androidX包里面还有一个Cam ...
- Android 调起系统相机拍照
概述 比奇小说网 m.biqi.org 最近在看 nanChen 写的图片选择器 ImagePicker,感觉写得很不错,也打算把从中学到的东西写下来.很多时候,遇到一个好的框架能够降低开发成本这是好 ...
最新文章
- 深大计算机与科学,陆楠 - 深圳大学 - 计算机与软件学院
- Spring中bean的scope详解
- 重设忘记的Mysql密码
- P4597-序列sequence【堆】
- iPhone12再曝光:苹果终于对它的天线动手了
- GHOST XP SP2 遐想网络 纯净驱动版 3.1
- 测试计划模板——Test Plan(中英文)
- html手机页面怎么保存图片,【答疑】你知道手机怎么保存网页长图吗?超简单!...
- box-sizing失效的原因
- HTML生成Word文档,可自定义Word文档页眉、页脚、分页。
- 强哥日常高效工作流骨灰级玩家培训课程
- 介绍中国传统节日的网页html,中国传统节日大全表 中国16个传统节日介绍
- java 无限循环_Java中的无限循环
- 安卓第三方ROM----AOKP和CM
- QA:Modem-QAM解码
- Frequent Pattern Mining(频繁模式挖掘) - Aprior挖掘算法
- visual studio code下载慢解决办法
- 【转录调控网络】代谢组学与其他组学的联合分析经典模式简介
- excel如何快速自动让空白单元格填充上一行内容
- NodeMCU(ESP8266)使用HTTP Get和Post