java - flash_mode_torch - Luz de flash no detectada
photo torch android (4)
Intento escribir una aplicación que enciende la luz del flash cuando se presiona un botón. El problema es que la aplicación no está detectando la luz del flash en mi teléfono. He buscado mucho en internet. Seguro que otros se han enfrentado al problema, también he aplicado esas soluciones, pero parece que no funcionan. No sé qué está causando este problema. Publicando el código aquí:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_starting_point);
if(! getApplicationContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH)) // checking if flash light is available inn android phone
{
Toast.makeText(StartingPoint.this, "Sorry this app can''t work without flash light", Toast.LENGTH_LONG).show();
finish();
}
cam = Camera.open();
param = cam.getParameters();
}
@Override
public void onClick (View v)
{
if(!flashOn)
{
i=0;
flashOn=true;
param.setFlashMode(Parameters.FLASH_MODE_TORCH);
cam.setParameters(param);
cam.startPreview();
}
else{
i=0;
flashOn=false;
param.setFlashMode(Parameters.FLASH_MODE_OFF);
cam.setParameters(param);
cam.stopPreview();
}
}
También agregué estos permisos en el Manifiesto de Android.
<uses-permission android:name="android.permission.FLASHLIGHT"/>
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
Saludos
Creo que no estás configurando tus params nuevamente: usé esto para verificar si hay una linterna:
public static Boolean hasFlashLight(Context context){
return context.getApplicationContext().getPackageManager()
.hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
}
y para apagarlo y encenderlo:
Parameters params = mCamera.getParameters();
if (!isFlashlightOn) {
params.setFlashMode(Parameters.FLASH_MODE_OFF);
} else {
params.setFlashMode(Parameters.FLASH_MODE_TORCH);
}
mCamera.setParameters(params);
Avíseme si también funciona para usted.
Tengo una aplicación que verifica la función de linterna y funciona bien. Aquí está el código que utilicé para verificar si el usuario tiene la luz:
if (!pm.hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
new AlertDialog.Builder(this)
.setTitle("Sorry")
.setMessage("It appears that your device is incompatible with this app. Sorry for the inconvenience.")
.setNeutralButton("Close", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
finish();
}
}).show();
return;
}
Ahora para hacer que la luz funcione, hice un botón para alternar y escribí el siguiente código:
private boolean isLightOn = false;
private Camera camera;
private ToggleButton button;
public Vibrator v;
if (camera == null) {
camera = Camera.open();
}
final Parameters p = camera.getParameters();
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
if (isLightOn) {
Toast.makeText(context, "Light off!", Toast.LENGTH_SHORT).show();
v.vibrate(40);
p.setFlashMode(Parameters.FLASH_MODE_OFF);
camera.setParameters(p);
camera.stopPreview();
isLightOn = false;
} else {
Toast.makeText(context, "Light on!", Toast.LENGTH_SHORT).show();
v.vibrate(40);
p.setFlashMode(Parameters.FLASH_MODE_TORCH);
camera.setParameters(p);
camera.startPreview();
isLightOn = true;
}
}
});
Y finalmente, aquí están los únicos permisos que utilicé:
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
Nota: Todo el código anterior está en el método onCreate de mi actividad.
Espero que esto ayude a resolver tu problema!
Yo tuve el mismo problema. Utilizar esta
if(getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH)) {
//Flash ok
Parameters params = mCamera.getParameters();
params.setFlashMode(Parameters.FLASH_MODE_TORCH);
} else {
//Flash not supported
}
para determinar si su dispositivo tiene flash.
Algunas cámaras necesitan soporte de superficie, de lo contrario bloquean el flash.
SurfaceView preview = (SurfaceView) findViewById(...);
SurfaceHolder holder = preview.getHolder();
holder.addCallback(this);
Camera camera = Camera.open();
camera.setPreviewDisplay(holder);