栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

android CameraX自定义相机使用

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

android CameraX自定义相机使用

android CameraX自定义相机使用

=


    

activity代码 

package com.nyw.mycameraxdemo;

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.lifecycle.ProcessCameraProvider;
import androidx.camera.view.PreviewView;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

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 com.google.common.util.concurrent.ListenableFuture;

import java.io.File;
import java.util.concurrent.ExecutionException;

public class MainActivity 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;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        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 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);
                // 设置用于预览的view
                if(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);
        ImageCapture.OutputFileOptions outputOptions = new ImageCapture.OutputFileOptions.Builder(file).build();
        // 开始拍照
        imageCapture.takePicture(outputOptions, ContextCompat.getMainExecutor(this),
                new ImageCapture.onImageSavedCallback() {
                    @Override
                    public void onImageSaved(@NonNull ImageCapture.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()));
                        }

                    }

                    @Override
                    public void onError(@NonNull  ImageCaptureException exception) {
                        System.out.println(exception.getImageCaptureError());
                    }
                });
    }


    
    public void startTake(View view) {
        takePhoto();
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull  String[] permissions, @NonNull  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("你拒绝了权限");
        }
    }


}

build.gradle文件 

plugins {
    id 'com.android.application'
}

android {
    compileSdk 30

    defaultConfig {
        applicationId "com.nyw.mycameraxdemo"
        minSdk 21
        targetSdk 30
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {

    implementation 'androidx.appcompat:appcompat:1.2.0'
    implementation 'com.google.android.material:material:1.3.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'

    // CameraX 核心库使用 camera2 实现
    implementation "androidx.camera:camera-camera2:1.0.0-beta03"
    // 可以使用CameraView
    implementation "androidx.camera:camera-view:1.0.0-alpha10"
    // 可以使用供应商扩展
    implementation "androidx.camera:camera-extensions:1.0.0-alpha10"
    //camerax的生命周期库
    implementation "androidx.camera:camera-lifecycle:1.0.0-beta03"

}

AndroidManifest.xml




    
    
    
    
    
    

    
        
            
                

                
            
        
    

 settings.gradle

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        jcenter() // Warning: this repository is going to shut down soon
    }
}
rootProject.name = "MyCameraxDemo"
include ':app'

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/781164.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号