Android:相机调用与Activity生命周期

一个小项目,要用到相机拍照,保存拍照后,下一个界面就是扫描二维码。
参考github里面的大师的项目,分别完成了程序。经过测试,分开两个界面单独调用没问题。
可是,将两个界面连接起来,在拍照保存Activity(简称A)跳转时候,跳到第二个界面扫描二维码(简称B)时候,提示相机出错。

A中:相机初始化打开和设置参数的代码都在onCreate里面,一个类搞定。使用EasyCamera。
B中:大牛都是在onResume和onPause中开启关闭相机的。这个写法复杂一点。需要设置管理相机的类等。如:Zxing。

思考一下:单独调用A,在A按back键或者home键退出,调用系统默认相机都正常,然后再重新返回A,相机都正常运作。只是:A中的一个按钮BtnA 打开B,就出错。应该是打开B时候,A没有关闭或者释放相机资源。
测试一下生命周期:
A 的代码:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activityA);

        ShowMsg("A Create.");
        btn1 = (Button) findViewById(R.id.buttonA1);
        btn1.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                ShowMsg("BtnA1 Click And Start CycleB");
                Intent intent = new Intent(ActivityA.this, ActivityB.class);
                startActivity(intent);
                ShowMsg("Start CycleB at A, And Finish A.");
                finish();
            }
        });
    }

    @Override
    protected void onResume() {
        super.onResume();
        ShowMsg("A1 Resume");
    }

    @Override
    protected void onPause() {
        super.onPause();
        ShowMsg("A1 Pause");
    }

B的代码:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_activity_cycle_b);

        ShowMsg("B Create.");
        btn2 = (Button) findViewById(R.id.buttonB2);
        btn2.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                ShowMsg("BtnB2 Click Finish");
                finish();
            }
        });
    }

    @Override
    protected void onResume() {
        super.onResume();
        ShowMsg("B2 Resume");
    }

    @Override
    protected void onPause() {
        super.onPause();
        ShowMsg("B2 Pause");
    }

运行结果:
跳转到B时候A先Pause
跳转到B时候A先Pause 然后B才Create。这样A的相机应该还没有完全停止,关闭,明白了。
生命周期使用不当,影响整个程序的运作。
应该参考B的写法,重新理解Activity生命周期。
参考下图:最中间的[Another activity comes in front of then activity] 这个是一个重点,简单理解为一个要被开启的activity,也就是上图运行结果的:B还没被create,先停止A.Pause,此时,A的相机没被关闭或者释放,就在B执行打开相机,程序就会出错。
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在Android应用程序中使用CameraX系统相机,您需要执行以下步骤: 1. 添加依赖项:在您的项目级别build.gradle文件中,添加以下依赖项: ```groovy dependencies { ... def camerax_version = "1.0.0-alpha06" implementation "androidx.camera:camera-core:${camerax_version}" implementation "androidx.camera:camera-camera2:${camerax_version}" } ``` 2. 在布局文件中添加预览View:您需要在布局文件中添加一个用于相机预览的View,例如: ```xml <androidx.camera.view.PreviewView android:id="@+id/viewFinder" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 3. 启动相机:您可以使用CameraX.bindToLifecycle方法来启动相机,并将预览View绑定到相机生命周期中。例如,在Activity的onCreate方法中,您可以添加以下代码: ```java private PreviewView viewFinder; private Camera camera; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); viewFinder = findViewById(R.id.viewFinder); // 绑定相机生命周期activity中 CameraX.bindToLifecycle((LifecycleOwner) this, getCamera(), getPreview()); } private Camera getCamera() { if (camera == null) { // 创建相机实例 camera = new Camera.Builder() .setTargetAspectRatio(AspectRatio.RATIO_16_9) .setTargetRotation(viewFinder.getDisplay().getRotation()) .build(); } return camera; } private Preview getPreview() { // 创建预览实例 Preview preview = new Preview.Builder() .setTargetAspectRatio(AspectRatio.RATIO_16_9) .setTargetRotation(viewFinder.getDisplay().getRotation()) .build(); // 绑定预览View到预览实例中 preview.setSurfaceProvider(viewFinder.createSurfaceProvider()); return preview; } ``` 4. 拍照:您可以使用ImageCapture类来拍摄照片。例如,在点击按钮时,您可以添加以下代码: ```java private ImageCapture imageCapture; // 初始化ImageCapture private void initImageCapture() { imageCapture = new ImageCapture.Builder() .setTargetAspectRatio(AspectRatio.RATIO_16_9) .setTargetRotation(viewFinder.getDisplay().getRotation()) .build(); } // 拍摄照片 private void takePhoto() { File file = new File(getExternalMediaDirs()[0], "photo.jpg"); ImageCapture.OutputFileOptions outputFileOptions = new ImageCapture.OutputFileOptions.Builder(file).build(); imageCapture.takePicture(outputFileOptions, ContextCompat.getMainExecutor(this), new ImageCapture.OnImageSavedCallback() { @Override public void onImageSaved(@NonNull ImageCapture.OutputFileResults outputFileResults) { // 照片保存完成 } @Override public void onError(@NonNull ImageCaptureException exception) { // 照片保存失败 } }); } ``` 这样,您就可以在Android应用程序中使用CameraX系统相机并拍摄照片了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值