Category Archives: android

Modificaciones sobre boton flotante

Partiendo del componente FabOptions

Añadiendo en la clase FabOptions.java el método:

public void changeColorbackground(int color){
Drawable d = mBackground.getBackground();
d = DrawableCompat.wrap(d);
DrawableCompat.setTint(d.mutate(), color);

}
public void changeColor(int color){
mFab.setBackgroundTintList(new ColorStateList(new int[][]{new int[]{0}}, new int[]{color}));

}

y llamandolo pasandole el color:

fabOptions.changeColorBackground((getResources().getColor(R.color.verde));

Podemos obtener resultados como:

Y para cambiar el color del boton principal:

fabOptions.changeColor((getResources().getColor(R.color.verde2));

Poner borde a un botón android

Función para poner borde a un botón de manera programática, creado en una clase de utilidades.

 

public class Util {

public static void bordecolorboton(Button b,int color,int radio){
  if (b!=null){
    GradientDrawable gd = new GradientDrawable();
    if (color!=0){
      gd.setColor(color); 
    }
    gd.setCornerRadius(radio);
    gd.setStroke(1, 0xFF000000);
    b.setBackground(gd);
  }
}
}

Luego en el método onCreate, podemos llamar a la función pasandole el botón

  btcolor1 = (Button)popupView.findViewById(R.id.btcolor1);
  btcolor1.setOnClickListener(new ImageButton.OnClickListener(){
      @Override public void onClick(View v) {
          //que haga lo que tenga que hacer.....
      }
  });
 //pone un borde negro de 1 px y color de fondo definido en el fichero de colores	   
 Util.bordecolorboton(btcolor1,Color.parseColor(getResources().getString(R.string.color1)),10);
 
	  

Presentar un input text con texto cargado en Android

Para presentar una ventana con una caja de texto y poner un texto por defecto:

private void preguntaTexto(){
AlertDialog.Builder alert = new AlertDialog.Builder(this);

alert.setTitle(getString(R.string.titulosms));
alert.setMessage(getString(R.string.telefonosms));

// Set an EditText view to get user input
final EditText input = new EditText(this);

input.setText("TEXTO_QUE_QUEREMOS CARGAR");
alert.setView(input);

alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
String textorecuperado= input.getText().toString();
//aqui hacemos lo que queramos con el texto que el usuario ha introducido

});

alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
// No hacemos nada
}
});

alert.show();
}

------------------------------------
@Override
public void onAttachedToWindow() {
openOptionsMenu();
};

Permitir conexiones no seguras

Cuando intentamos conectar con un servidor mediante https y el certificado no es “reconocido” nos da un error.

 

Para permitir todo tipo de conexiones seguras podemos crear una función

private static void trustAllHosts() {
		// Create a trust manager that does not validate certificate chains
		X509TrustManager tm = new X509TrustManager() {
			
			public java.security.cert.X509Certificate[] getAcceptedIssuers() {
				return new java.security.cert.X509Certificate[] {};
			}
			@Override
			public void checkClientTrusted(X509Certificate[] chain,
					String authType) throws CertificateException {
				// TODO Auto-generated method stub
				
			}
			@Override
			public void checkServerTrusted(X509Certificate[] chain,
					String authType) throws CertificateException {
				// TODO Auto-generated method stub
				
			}
		} ;
		TrustManager[] trustAllCerts = new TrustManager[] {tm};

		// Install the all-trusting trust manager
		try {
			SSLContext sc = SSLContext.getInstance("TLS");
			sc.init(null, trustAllCerts, new java.security.SecureRandom());
			HttpsURLConnection
					.setDefaultSSLSocketFactory(sc.getSocketFactory());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

Y llamar a la función antes de realizar la conexión:

HttpTransportSE androidHttpTransport= null;
		try {
			String conexion = url;
			trustAllHosts(); // poner aqui la llamada 
			androidHttpTransport = new HttpTransportSE(conexion);
			androidHttpTransport.debug = true;
			androidHttpTransport.call(METHOD, envelope,headerList);
			res=androidHttpTransport.responseDump;
			res=datoGateway(res);
		}catch (Exception e){
			Log.e("Error",e.toString());
			
		}

Ciclo de vida de actividad en android

Selección_005

En el caso de querer guardar estado antes de rotar la pantalla se utiliza el metodo onSaveInstanceState

Posteriormente cuando se vuelve a crear se llama al metodo onRestoreInstanceState despues de onStart()

public void onSaveInstanceState (Bundle outState) {
outState.putString("estadoactual", valorquequeremosconservar);
super.onSaveInstanceState(outState);
}

public void onRestoreInstanceState (Bundle savedInstanceState){
super.onRestoreInstanceState(savedInstanceState);
String valorqueteniaantes = savedInstanceState.getString("estadoactual");
hacer algo con el valor que tenia antes

}

Añadir google play services a proyecto Android en eclipse

Lo primero que tenemos que hacer es crear un proyecto a partir de código existente:
Captura de pantalla 2015-09-29 a las 17.33.06

 

Captura de pantalla 2015-09-29 a las 17.32.07

 

Buscamos el directorio de Google_play_services dentro de android_sdk/extras/google/Captura de pantalla 2015-09-29 a las 17.32.26

 

Tenemos que seleccionar solo el primer proyecto para importarCaptura de pantalla 2015-09-29 a las 17.32.52

 

Una vez lo hemos importado nos aparece un nuevo proyecto en eclipse:

Captura de pantalla 2015-09-29 a las 17.38.40

 

Ahora nos vamos al proyecto donde queremos añadir la dependencia y con el boton derecho abrimos las propiedades:

Captura de pantalla 2015-09-29 a las 17.39.40

 

En la pestaña Android pulsamos sobre Add en la seccion Library

Captura de pantalla 2015-09-29 a las 17.42.07

 

Elegimos el proyecto google-play-services-lib

Captura de pantalla 2015-09-29 a las 17.42.21

Una vez que lo hemos añadido nos muestra la rutaCaptura de pantalla 2015-09-29 a las 17.42.27

 

Y si vamos a la pestaña Java Build Path vemos que nos aparece la dependenciaCaptura de pantalla 2015-09-29 a las 17.42.44

 

Ya tenemos añadido en nuestro proyecto la libreria de google play services.

Trabajar con fechas en sqlite

Las bases de datos SQlite no tienen el tipo date por lo que las fechas se tienen que guardar como text.

Si queremos trabajar con fechas para buscar las que cumplan que sean mayores a …. etc, podemos utilizar la conversión a fecha del tipo yyyymmddhhiiss

Dada una tabla con los valores de fecha y hora:
sqlite1

Podemos ejecutar una consulta como :

select fecha,hora,id
from notificaciones 
where substr(fecha,7)||substr(fecha,4,2)||substr(fecha,1,2)||substr(hora,1,2) ||substr(hora,4,2) ||substr(hora,7,2)
> '20150901140920'

Que nos devuelve uno tal y como se esperaba

Redondear icono con pixelmator

Para dar un aspecto mas profesional al icono de una aplicación vamos a redondear los bordes, para ellos usamos el programa de mac Pixelmator.

Una vez que tenemos la imagen, tenemos que seleccionar todo

pixelmator1

Y definir la selección:
pixelmator2
Desplazamos la barra de suavizar hasta conseguir el efecto deseado
pixelmator3
Ahora vemos como nos aparece la selección con los bordes
pixelmator4
Invertimos la selección
pixelmator5
Y borramos el contenido seleccionado para que nos quite los restos del borde
pixelmator6
Ya tenemos nuestra imagen lista para exportar con el formato que necesitemos, en mi caso es un png pues el market permite transparencias.
pixelmator7

Pausar la música para notificar un evento

En la ultima actualización de la app de android Canta notificaciones se añade la característica de pausar la música si está sonando para que se oiga mejor la locución y después continuar con la música
Para que funcione son necesarios los objetos:

private AudioManager am;
boolean reanudarmusica;
am= (AudioManager) getBaseContext().getSystemService(Context.AUDIO_SERVICE);
		

Al principio probé el código:

am.setStreamMute(AudioManager.STREAM_MUSIC, true);
//escuchar la locución
am.setStreamMute(AudioManager.STREAM_MUSIC, false);

Pero no funcionaba.

El código que si funciona es:

if (am.isMusicActive()) {

   			Intent i = new Intent("com.android.music.musicservicecommand");

   			i.putExtra("command", "pause"); 
   			NLService.this.sendBroadcast(i);
   			reanudarmusica=true;
}   

Una vez que termina la locución, hay que volver a poner el sonido con:

if (reanudarmusica){
	       			Intent i = new Intent("com.android.music.musicservicecommand");

	       			i.putExtra("command", "togglepause"); 
	       			NLService.this.sendBroadcast(i);
	       			reanudarmusica=false;
}