java - 如何使用相同的按钮启动和停止方法
问题描述
如何使用相同的 onClick 按钮启动和停止此相机(或预览?)?启动相机没有问题,但现在也关闭相机,使用相同的按钮证明对于像我这样的新手来说更加困难。
第二次按下按钮时,程序现在崩溃,这并不理想。
public class MainActivity extends AppCompatActivity {
PreviewView previewView;
public int REQUEST_CODE_PERMISSIONS = 101;
public final String[] REQUIRED_PERMISSIONS = new String[]{"android.permission.CAMERA"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
previewView = findViewById(R.id.previewView);
Button captureButton = findViewById(R.id.buttonPreview);
captureButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (allPermissionsGranted()) {
startCamera();
} else {
ActivityCompat.requestPermissions(MainActivity.this, REQUIRED_PERMISSIONS, REQUEST_CODE_PERMISSIONS);
}
}
});
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull
int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (allPermissionsGranted()) {
startCamera();
} else {
Toast.makeText(this, "Permissions not granted by the user.", Toast.LENGTH_SHORT).show();
finish();
}
}
public boolean allPermissionsGranted() {
for (String permission : REQUIRED_PERMISSIONS) {
if (ContextCompat.checkSelfPermission(getApplicationContext(), permission) != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
return true;
}
public void startCamera() {
ListenableFuture cameraProviderFuture = ProcessCameraProvider.getInstance(this);
cameraProviderFuture.addListener(() -> {
try {
ProcessCameraProvider cameraProvider = (ProcessCameraProvider) cameraProviderFuture.get();
Preview preview = new Preview.Builder().build();
CameraSelector cameraSelector = new CameraSelector.Builder()
.requireLensFacing(CameraSelector.LENS_FACING_BACK)
.build();
ImageAnalysis imageAnalysis =
new ImageAnalysis.Builder()
.setTargetResolution(new Size(1280, 720))
.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
.build();
preview.setSurfaceProvider(previewView.getSurfaceProvider());
Camera camera = cameraProvider.bindToLifecycle(
((LifecycleOwner) this),
cameraSelector,
preview,
imageAnalysis);
} catch (InterruptedException | ExecutionException e) {
}
}, ContextCompat.getMainExecutor(this));
}
}
解决方案
只需要创建一个 boolean 或 int 变量,例如:
boolean ifCameraStarted=false;
当您调用 startCamera() 时,将此变量更改为 true,当您停止相机时,将其更改为 false;当你点击按钮时,你用这个变量来判断它是真还是假,做不同的事情
booleam ifStarted=false;
captureButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(ifStarted==false){
startcamer();
}else{
stopcamer();
}
}
}
推荐阅读
- react-native - React-native DrawerNavigator 不显示
- mysql - 如何在 MySQL 中显示具有 2 种可能性的数据?
- c# - 将列表项添加到集合时,AddRange() 不起作用
- authentication - EMV 小程序(如 MasterCard 的 M/Chip 和 Visa 的 VSDC)与 POS 终端之间的相互认证
- java - 如何使用外观方法将实体转换为列表
- python - 当列值匹配时,Pandas Dataframe 从一行中替换 Nan
- python - type() 不能与 input() 一起使用并且总是返回“str” - Python 3.x
- ruby-on-rails - Rails 在 ajax 请求上闪烁(无需重新加载)
- rabbitmq - RabbitMq 中的高可用性和负载平衡
- javascript - 方法减少javascript