我有一个使用相机扫描QR码的应用程序。当我打开应用程序并进入QR阅读器时,一切正常。一旦我扫描代码,信息就会被发送到另一个活动,但是一旦我点击后退按钮,相机就会变黑(见下文),我就不能再看了。所以以某种方式恢复活动会停止相机。
我试图扫描代码,即使它是空白的,因为我认为它可能只是一个屏幕问题,但事实并非如此。但如果我离开活动并回来,它将恢复。 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;
}
}
我也可以发布布局,但我不认为它们是相关的。代码中是否存在可能触发此行为的内容?或者我应该添加一些东西重新启动相机?
答案 0 :(得分:1)
如果您查看barcodescanner repo中的示例代码,则应使用CodQR
活动的onPause()
方法停止相机预览。
这是因为当活动暂停且不再在前台时需要释放相机资源。当您转到Qr_Results
活动时,CodQR
活动仅暂停且未释放相机。这就是当您点击后退按钮时预览不会重新启动的原因。优良作法是在不再需要时释放活动的资源。
尝试在stopCamera()
活动中添加对CodQR
的调用,看看是否能解决问题:
@Override
public void onPause() {
super.onPause();
zXingScannerView.stopCamera();
}