点击返回时相机变为黑色(QR码)

时间:2018-01-23 15:46:32

标签: java android camera android-camera qr-code

我有一个使用相机扫描QR码的应用程序。当我打开应用程序并进入QR阅读器时,一切正常。一旦我扫描代码,信息就会被发送到另一个活动,但是一旦我点击后退按钮,相机就会变黑(见下文),我就不能再看了。所以以某种方式恢复活动会停止相机。

enter image description here

我试图扫描代码,即使它是空白的,因为我认为它可能只是一个屏幕问题,但事实并非如此。但如果我离开活动并回来,它将恢复。 Logcat没有显示任何问题,只需在Firebase中注册该事件即可。任何人都可以帮我弄清楚它是硬件问题还是坏代码?或者是需要重启活动的正常行为?

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;
  }
}

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

1 个答案:

答案 0 :(得分:1)

如果您查看barcodescanner repo中的示例代码,则应使用CodQR活动的onPause()方法停止相机预览。

这是因为当活动暂停且不再在前台时需要释放相机资源。当您转到Qr_Results活动时,CodQR活动仅暂停且未释放相机。这就是当您点击后退按钮时预览不会重新启动的原因。优良作法是在不再需要时释放活动的资源。

尝试在stopCamera()活动中添加对CodQR的调用,看看是否能解决问题:

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