Como hacer una linterna en android studio

Hola amig@s como están, ayer recibí un mensaje de un usuario. Necesitaba una app que use el flash de su celular como linterna, había buscado por muchos sitios y no encontraba y los tutoriales que encontraba ya estaban obsoletos, esto se debe a que a partir de la Api 21 hay que dar cierto permisos para usar algún atributo de nuestro móvil, no los canso mas con mi bla bla bla y vamos directo al grano.
Como hacer una linterna en android studio

Primero necesitamos dos imágenes para hacer nuestro botón de encendido, yo les dejare las imágenes ok.

Ahora necesitamos un ImageButton “pero androfast tenemos dos imágenes no seria mejor usar dos ImageButton” claro que no, en el código java lo llamaremos de tal forma que al hacer clic pasara de ON a OFF.
Como ya es de costumbre les dejo código del activity_main:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/background"
tools:context="com.androidmorefast.pc.applinterna.MainActivity">

<ImageButton
android:id="@+id/btnOnOff"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:background="@color/background"
android:scaleType="fitCenter"
app:srcCompat="@drawable/off"
tools:layout_editor_absoluteX="66dp"
tools:layout_editor_absoluteY="71dp" />
</android.support.constraint.ConstraintLayout>

Ahora tienen que ir a la siguiente ruta res luego values por ultimo el archivo color ahí deben agregar
un color llamado background esto es para que los botones sean del mismo color que el fondo de la app y esta sea vea mas estética.

Aquí les dejo el código:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#3F51B5</color>
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#FF4081</color>
<color name="background">#dddddd</color>
</resources>

Ahora debemos agregar unos permisos en nuestro AndroidManifest

    <uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera"/>
<uses-permission android:name="android.permission.FLASHLIGHT"/>
<uses-feature android:name="android.hardware.camera.flash" />

Y por ultimo tenemos el código de nuestro MainActivity

import android.Manifest;
import android.content.DialogInterface;
import android.content.pm.PackageManager;
import android.hardware.Camera;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageButton;

public class MainActivity extends AppCompatActivity {
ImageButton btnlinterna;
Camera camera;
Camera.Parameters parameters;
boolean isFlash = false;
boolean isOn = false;

@Override
protected void onStop() {
super.onStop();
if(camera != null){
camera.release();
camera = null;
}
}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);


btnlinterna = (ImageButton)findViewById(R.id.btnOnOff);
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA,}, 1000);
} else {


if (getApplicationContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH)) {
camera = Camera.open();
parameters = camera.getParameters();
isFlash = true;
}


btnlinterna.setOnClickListener(new View.OnClickListener(){

@Override
public void onClick(View v) {

if (isFlash) {

if (!isOn) {
btnlinterna.setImageResource(R.drawable.on);
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
camera.setParameters(parameters);
camera.startPreview();
isOn = true;
} else {
btnlinterna.setImageResource(R.drawable.off);
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
camera.setParameters(parameters);
camera.stopPreview();
isOn = false;

}


} else {

AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("Error");
builder.setMessage("flash no compatible");
builder.setPositiveButton("ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
finish();
}

});

AlertDialog alertDialog = builder.create();
alertDialog.show();
}

}


});

} }
}

Y con eso hemos culminado solo les queda hacer clic en su botón para encender u apagar su linterna.

ENLACES DE INTERÉS:

como hacer una aplicación que lea archivos pdf online en android studio

5 comentarios en «Como hacer una linterna en android studio»

  1. Yadira

    Hola, una duda, después de que doy permisos no puedo encender el flash, es necesario que cierre y abra de nuevo la app, ¿Que puedo hacer para no tener que reiniciar la app?, gracias.

    1. ANDROFAST Autor

      Empiezo comentando que hay muchas aplicaciones así, pero en este caso te recomiendo juegues un poco con la condicional if del permiso, prometo actualizarlo…ya tiene varios años este post, saludos.

  2. marcelo

    Buenas, primero que nada me funcionó perfectamente. Pero tengo dos problemas.
    • Si la pantalla se bloquea, se apaga la luz.
    • Luego de desbloquear o minimizar la app sin cerrarla, al precionar el botón la app chashea.

    Se puede restaurar el botón a su estado original si se cierra la app para que no crashee?

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

WhatsApp chat