Я сделал простое приложение FlashLight. Работает хорошо, но есть ошибка. Когда я нажимаю кнопку вниз в первый раз после запуска приложения, фонарик не запускается. При втором нажатии на кнопку запускается фонарик.
Помогите мне решить эту проблему. Спасибо!
Issue: FlashLight not starting on very first button press.
private Camera camera;
private ImageButton flashlightButton;
private TextView Status;
private static final int CAMERA_REQUEST = 123;
boolean hasCameraFlash = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.CAMERA},CAMERA_REQUEST);
Status = findViewById(R.id.Status);
flashlightButton = findViewById(R.id.flashlight_button);
flashlightButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (hasCameraFlash){
if (Status.getText().toString().contains("ON")){
Status.setText("OFF");
flashlightOff();
} else {
Status.setText("ON");
flashlightOn();
}
}else{
Toast.makeText(MainActivity.this, "No Flash Available on your device",Toast.LENGTH_SHORT).show();
}
}
});
}
private void flashlightOn(){
CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
try {
String cameraId = cameraManager.getCameraIdList()[0];
cameraManager.setTorchMode(cameraId,true);
flashlightButton.setImageResource(R.drawable.flashlight_on);
} catch (CameraAccessException e) {
}
}
private void flashlightOff(){
CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
try {
String camerid = cameraManager.getCameraIdList()[0];
cameraManager.setTorchMode(camerid,false);
flashlightButton.setImageResource(R.drawable.flashlight_off);
} catch (CameraAccessException e){
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case CAMERA_REQUEST:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
hasCameraFlash = getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
}else{
Toast.makeText(MainActivity.this, "Permission Denied for the Camera", Toast.LENGTH_SHORT).show();
}
break;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (camera != null) {
camera.stopPreview();
camera.setPreviewCallback(null);
camera.release();
camera = null;
}
}
}
разрешение на использование
<uses-permission android:name = "android.permission.FLASHLIGHT" />
<uses-feature
android:name = "android.hardware.camera.flash"
android:required = "false" />
<uses-feature
android:name = "android.hardware.camera"
android:required = "false" />
Код:
Parameters p = mCamera.getParameters();
Camera mCamera = Camera.open();
p = mCamera.getParameters();
p.setFlashMode(Parameters.FLASH_MODE_ON);
mPreview = new CameraPreview(mContext, mCamera);
mCamera.startPreview();
В ваших кодах ошибок не обнаружено. Возможно, в вашем XML-файле макета кнопка имеет такой атрибут, как:
android:onClick = "onClick" //delete if such line exists
Другая вероятность - кнопка имеет такой атрибут, как:
android:focusableInTouchMode = "true" //delete if such line exists
@Rakesh не могли бы вы опубликовать XML макета
<ImageButton android: id = "@ + id / flashlight_button" android: layout_width = "wrap_content" android: layout_height = "wrap_content" android: layout_centerInParent = "true" android: background = "@ null" android: contentDescription = "@ null" android: src = "@ drawable / flashlight_off" />
Для этого приложения добавлены разрешения .... <uses-permission android: name = "android.permission.CAMERA" /> <uses-feature android: name = "android.hardware.camera" />