【问题标题】:Camera turns black when clicking back (QR Code)点击返回时相机变黑(二维码)
【发布时间】:2018-01-23 15:46:32
【问题描述】:

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

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

二维码扫描的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;
  }
}

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

【问题讨论】:

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


    【解决方案1】:

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

    这是因为在activity暂停且不再在前台时需要释放camera资源。当您转到您的Qr_Results 活动时,CodQR 活动只是暂停而不释放相机。这就是当您点击返回按钮时预览不会重新启动的原因。最好在不再需要时释放 Activity 的资源。

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

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

    【讨论】:

    • 谢谢。我实际上是这样做的,然后禁用它,因为当我回去的时候它崩溃了。所以通过删除这个,我摆脱了那个崩溃,但我有这个当前的问题。所以 onPause = 崩溃,没有 onPause = 黑屏。有没有其他方法可以优化这部分?
    • @CuriousPaul 崩溃日志是怎么说的?
    • 其实也是一样的。我取消注释它并且它具有相同的行为。虽然没有错误。我的 Logcat 中有这个:Connection attempt already in progress Activity resumed, time: 2968307003 Logging event (FE): user_engagement(_e), Bundle[{firebase_event_origin(_o)=auto, engagement_time_msec(_et)=7904, firebase_screen_class(_sc)=Qr_Results, firebase_screen_id(_si) Connection attempt already in progress
    • 虽然没有崩溃
    • @CuriousPaul 你在哪里调用你的CheckPermissionsCamera() 方法?它应该在CodQR 活动的onResume() 方法中调用。这样,当按下返回按钮后活动恢复时,相机将使用scan() 方法重新启动。您仍然应该在onPause() 中停止摄像头。您还可以删除对resumeCameraPreview() 的调用,因为您实际上不需要通过onResume() 中的调用重新启动它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 2022-09-28
    相关资源
    最近更新 更多