java - 点击返回时相机变黑(二维码)

标签 java android camera android-camera qr-code

我有一个使用相机扫描二维码的应用程序。当我打开应用程序并转到二维码阅读器时,一切正常。一旦我扫描代码,信息就会发送到另一个 Activity ,但是一旦我点击后退按钮,相机就会变黑(见下文),我就无法再拍照了。因此,以某种方式恢复 Activity 会停止相机。

enter image description here

我尝试扫描代码,即使它是空白的,因为我认为这可能只是屏幕问题,但事实并非如此。但如果我离开 Activity 并回来, Activity 就会恢复。 Logcat 没有显示任何问题,只是在 Firebase 中注册了事件。谁能帮我看看这是硬件问题还是代码错误?或者这是需要重新启动 Activity 的正常行为?

用于QR扫描的Java文件如下:

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Toast;

import com.google.zxing.Result;

import me.dm7.barcodescanner.zxing.ZXingScannerView;

public class CodQR extends AppCompatActivity implements ZXingScannerView.ResultHandler {
  private static final int ID_UL_MEU_PENTRU_PERMISIA_DE_CAMERA = 1000;
  private ZXingScannerView zXingScannerView;


  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_cod_qr);
  }

  public void scan() {
    zXingScannerView = new ZXingScannerView(getApplicationContext());
    setContentView(zXingScannerView);
    zXingScannerView.setResultHandler(this);
    zXingScannerView.startCamera();

  }

  @Override
  public void handleResult(Result result) {
    Toast.makeText(getApplicationContext(), result.getText(), Toast.LENGTH_SHORT).show();
    String MyText = result.getText().toString();
    Intent intent = new Intent(CodQR.this, Qr_Results.class);
    intent.putExtra(Intent.EXTRA_TEXT, MyText);
    startActivity(intent);
    zXingScannerView.resumeCameraPreview(this);
  }
  //Permissions

  public void CheckPermissionsCamera(View view) {
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
      Toast.makeText(this, "Insufficient permissions.", Toast.LENGTH_LONG).show();
      ActivityCompat.requestPermissions(this,
        new String[] {
          Manifest.permission.CAMERA
        },
        ID_UL_MEU_PENTRU_PERMISIA_DE_CAMERA
      );
    } else {
      scan();
    }
  }


  @Override
  public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
      case ID_UL_MEU_PENTRU_PERMISIA_DE_CAMERA:
        {
          if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            Toast.makeText(this, "Permission granted", Toast.LENGTH_SHORT).show();
          } else {
            // daca grantResults e gol, a dat cancel
            Toast.makeText(this, "You didn't accept the permission", Toast.LENGTH_LONG).show();
          }
        }
    }
  }
}


public class Qr_Results extends AppCompatActivity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_qr_results);
    TextView myText = findViewById(R.id.Text_Qr_Results);
    //Get Intent
    Intent intent = getIntent();
    //Get the string value of the intent
    String text = intent.getStringExtra(Intent.EXTRA_TEXT);
    //Set text to TextView
    myText.setText(text);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    if (getSupportActionBar() != null) {
      getSupportActionBar().setDisplayHomeAsUpEnabled(true);
      getSupportActionBar().setDisplayShowHomeEnabled(true);
    }
  }
  public boolean onSupportNavigateUp() {
    onBackPressed();
    return true;
  }
}

我也可以发布布局,但我认为它们不相关。代码中是否有某些内容可能会触发此行为?或者我应该添加一些东西来重新启动相机?

最佳答案

如果你看一下 barcodescanner repo 中的示例代码,您应该在 CodQR Activity 的 onPause() 方法中停止相机预览。

这是因为当 Activity 暂停且不再位于前台时,需要释放相机资源。当您转到 Qr_Results Activity 时,CodQR Activity 仅暂停而不释放相机。这就是当您点击后退按钮时预览不会重新启动的原因。当不再需要某个 Activity 的资源时,最好始终释放它们。

尝试在 CodQR Activity 中添加对 stopCamera() 的调用,看看是否可以解决问题:

@Override
public void onPause() {
    super.onPause();
    zXingScannerView.stopCamera();
}

关于java - 点击返回时相机变黑(二维码),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48405665/

相关文章:

android - 相机类型的 Camera.open() 和 setPreviewDisplay() 未定义

java - 以编程方式访问 macbook pro 相机 java

android - 从 Assets 文件夹中读取图像文件

java - Glide : log each request

ios - 使用未解析的标识符 'image'

java - 无法使用 getApplication 方法转换为 Application

java - 总是在 edittext 上方设置 textinputlayout 的提示?

java - 是否可以测试流程的事务性?

java - org.springframework.beans.factory.BeanInitializationException : Could not load properties

java - 如何测试嵌套包中的代码