PDA

Ver la Versión Completa : [ CONSULTA ] APP linterna


jamercues
25/09/13, 17:22:05
Hola a todos.
Pues de antemano, hace mucho que no me pasaba por aqui y tal, bueno, he vuelto jeje
Os cuento, en el gs estamos aprendiendo a programar en android ahora, se programar en c++, java, php, pyton...
Ahora toca android y estoy haciendo una app simple, muy simple, de una linterna.
Se trata de 2 botones y un texto.
He estado leyendo y para poder utilizar el hardware del telefono, tengo que comprobar si esta disponible en el telefono.
Pero, donde compruebo si esta disponible?
se que tengo que poner esta linea
context.getPackageManager().hasSystemFeature(Packa geManager.FEATURE_CAMERA_FLASH);
pero donde? donde declaro los botones y tal en el mainactivity? creo un metodo? tengo que utilizar packageManager, como va? estoy echando un vistazo a la api y no veo ningun ejemplo.
El programa en si ya esta, he puesto los permisos en el xml tambien...
<permission

android:name="android.permission.FLASHLIGHT"
android:permissionGroup="android.permission-group.HARDWARE_CONTROLS"
android:protectionLevel="normal"
android:label="@string/permlab_flashlight"
android:description="@string/permdesc_flashlight" />
Alguna ayuda? aun estoy algo perdido.

Os pongo el codigo haber si veis algo raro.
package com.example.holausuario;

import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.os.Bundle;
import android.app.Activity;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final EditText laFrase = (EditText)findViewById(R.id.frase);
final Button elBoton = (Button)findViewById(R.id.el_boton);
final Button elBoton2 = (Button)findViewById(R.id.el_boton2);
final Camera cam = null;
final Parameters param = cam.getParameters();
final PackageInfo context = new PackageInfo;


context.getPackageManager().hasSystemFeature(Packa geManager.FEATURE_CAMERA_FLASH);


elBoton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View e) {
laFrase.setText("Linterna Enchufada");
cam.setParameters(param);
cam.startPreview();
}
});
elBoton2.setOnClickListener(new OnClickListener(){

@Override
public void onClick(View a) {
laFrase.setText("Linterna apagada");
cam.setParameters(param);
cam.stopPreview();
cam.release();

}

});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

}

Gracias!

mocelet
25/09/13, 18:50:59
No es que tengas que comprobarlo obligatoriamente, es que si tu app se ejecutara en un dispositivo sin flash se cerraría con un error.

La comprobación es para avisar al usuario de que su teléfono no tiene luz y tu app no puede hacer nada.

Yo lo comprobaría antes del setContentView para mostrar el layout de ahora si soporta flash y para mostrar otro layout con un texto diciendo que el teléfono no es compatible en caso contrario. Evidentemente, tienes que meter esa línea en un if/else, porque devuelve true si soporta flash y false en caso contrario. Ejecutar la línea sola no vale para nada.

jamercues
25/09/13, 22:46:01
No es que tengas que comprobarlo obligatoriamente, es que si tu app se ejecutara en un dispositivo sin flash se cerraría con un error.

La comprobación es para avisar al usuario de que su teléfono no tiene luz y tu app no puede hacer nada.

Yo lo comprobaría antes del setContentView para mostrar el layout de ahora si soporta flash y para mostrar otro layout con un texto diciendo que el teléfono no es compatible en caso contrario. Evidentemente, tienes que meter esa línea en un if/else, porque devuelve true si soporta flash y false en caso contrario. Ejecutar la línea sola no vale para nada.

Actualice el codigo.
Este es el main activity (sin errores)

package com.example.holausuario;

import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.os.Bundle;
import android.app.Activity;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(getPackageManager().hasSystemFeature(PackageMan ager.FEATURE_CAMERA_FLASH)){


setContentView(R.layout.activity_main);
final EditText laFrase = (EditText)findViewById(R.id.frase);
final Button elBoton = (Button)findViewById(R.id.el_boton);
final Button elBoton2 = (Button)findViewById(R.id.el_boton2);
final Camera cam = null;
final Parameters param = cam.getParameters();



//this.getPackageManager().hasSystemFeature(PackageM anager.FEATURE_CAMERA_FLASH);


elBoton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View e) {
laFrase.setText("Linterna Enchufada");
cam.setParameters(param);
cam.startPreview();
}
});
elBoton2.setOnClickListener(new OnClickListener(){

@Override
public void onClick(View a) {
laFrase.setText("Listerna apagada");
cam.setParameters(param);
cam.stopPreview();
cam.release();

}

});
}
else{

}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

}


este es el xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >

<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />

<EditText
android:id="@+id/frase"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textView1"
android:layout_below="@+id/textView1"
android:layout_marginLeft="18dp"
android:layout_marginTop="48dp"
android:ems="10" >

<requestFocus />
</EditText>

<Button
android:id="@+id/el_boton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textView1"
android:layout_below="@+id/frase"
android:layout_marginTop="54dp"
android:text="encender" />

<Button
android:id="@+id/el_boton2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/el_boton"
android:layout_alignBottom="@+id/el_boton"
android:layout_alignRight="@+id/frase"
android:layout_marginRight="19dp"
android:text="apagar" />

<permission

android:name="android.permission.FLASHLIGHT"
android:permissionGroup="android.permission-group.HARDWARE_CONTROLS"
android:protectionLevel="normal"
android:label="@string/permlab_flashlight"
android:description="@string/permdesc_flashlight" />


</RelativeLayout>

Me da error en las lineas que estan en negrita, las borro o quito el xml pero no carga en el movil, en el LogCat empieza a dar mensajes (no entiendo que dicen, aun soy nuevo) pero segun la consola dice sucess y tal.
Aclarar que para probar la app la paso al movil con la opcion de run as y seleciono el movil (xperia s)
Alguna sugerencia?