Android: Conseguir vibración del dispositivo

Blog >Lista Soluciones > Vibración terminal


Vibración del dispositivo Android

Hola amigos, hoy toca mostraros como se consigue un efecto de vibración durante un tiempo determinado,que podemos prolongar o disminuir a antojo:
Para gestionar la vibración de tu dispositivo en tu app, primero hay que pedir permiso en el androidmanifiest.xml:

 
    

    

    
        
            
                
                
            
        
    
 


Seguidamente, cuando queramos hacer que vibre nuestro dispositivo movil, insertar en Java:
Vibrator v = (Vibrator) getSystemService(VIBRATOR_SERVICE);
v.vibrate(3000);

Pues ya está compañeros, los 3000 se miden en milisegundos, si quereis más tiempo o menos, calcular ese campo, la relación en milisegundos con los segundos es 1s=1000ms,  fácil y sencillo, Salu2!


Android: Tareas en segundo plano ( AsyncTask)

Blog >Lista Soluciones > AsyncTask : lanzar segundo hilo



Lanzar un segundo hilo

Todos los componentes de una aplicación Android, tanto las actividades, los servicios o los broadcast receivers que se ejecutan en el mismo hilo de ejecución, el hilo principal. Cualquier operación larga o costosa que realicemos en este hilo va a bloquear la ejecución del resto de componentes de la aplicación, produciendo al usuario un efecto evidente de lentitud o bloqueo. 

Y como no queremos que nos ocurra, vamos a usar hilos segundarios para ejecutar las operaciones tan "costosas" :

Creamos un nuevo proyecto y colocamos un botón y un ProgressBar en nuestra actividad :





y en el onCreate() de nuestra actividad principal, les hacemos referencia :

        b1=(Button) findViewById(R.id.button1);
        progress= (ProgressBar) findViewById(R.id.progressBar1);
  progress.setMax(100);
        progress.setProgress(0);
        
        b1.setOnClickListener(new OnClickListener(){

   @Override
   public void onClick(View arg0) {
    // TODO Auto-generated method stub
    
   }
         
        });


Ahora, haremos una función que nos haga esperar un segundo cuando hagamos click en el botón, que se llamará desde esta otra que irá dentro del onClick de nuestro botón :

public void onClick(View arg0) {
 reiterarHilo(); 
}

public void reiterarHilo(){
      for(int x=1; x<=10; x++) {
       hilounseg();
             progress.incrementProgressBy(10);
         }
    }

public void hilounseg(){
    try {
        Thread.sleep(1000);
    } catch(InterruptedException e) {}
}

Ejecutamos la aplicación para observar el resultado, de momento el efecto no es el deseado, se ha quedado colgada y a los 10 segundos se ha llenado, esto es porque esta corriendo en el hilo principal.Ahora vemos el método thread, que internamente tiene el run() :

new Thread(new Runnable() {
    public void run() {
        //COMIENZO DE OTRO HILO
    }
}).start();

El código entero :

public class MainActivity extends Activity {

 private Button b1;
 private ProgressBar progress;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        b1=(Button) findViewById(R.id.button1);
        progress= (ProgressBar) findViewById(R.id.progressBar1);
        //LIMITES
  progress.setMax(100);
        progress.setProgress(0);    
        b1.setOnClickListener(new OnClickListener(){
   @Override
   public void onClick(View arg0) {
    new Thread(new Runnable() {
        public void run() {
           //COMIENZO HILO EN SEGUNDO PLANO
         reiterarHilo();
        }
        public void post(){
         
        }
    }).start(); 
   }
        });
        
    }
    public void reiterarHilo(){
      for(int x=1; x<=10; x++) {
       hilounseg();
             progress.incrementProgressBy(10);
         }
    }
    
    public void hilounseg(){
        try {
         //ESTA ES LA LINEA QUE NOS HACE ESPERAR UN SEGUNDO
            Thread.sleep(1000);
        } catch(InterruptedException e) {}
    }
    
}



Ahora sí podemos ver el progreso de nuestro progressBar. La creación de otro hilo nos ha permitido mantener el hilo principal libre para que nuestra interfaz de usuario se actualize durante la ejecución de la tarea en segundo plano. 





AsyncTask

Ahora vamos a ver AsynkTask, esta clase es menos engorroso y más práctico.Si quereis ver más información, ya que yo me enfoco sólo en el ámbito práctico del código y quereis curiosear podeis meteros aquí.

La forma más básica de usar la clase AsyncTask consiste en crear una nueva clase que extienda de ella y sobrescribir varios de sus métodos :

  • onPreExecute() : Se ejecutará antes del código principal de nuestra tarea. 
  • doInBackground() : Contendrá el código principal de nuestra tarea. 
  • onProgressUpdate() : Se ejecutará cada vez que llamemos al método publicProgrees() desde el método doInBackground(). 
  • onPostExecute() : Se ejecutará al finalizar la tarea o tras la finalización de doInBackground()
  • onCancelled() : Se ejecutará cuando se cancele la ejecución de la tarea antes de su finalización normal. 


AsyncTask nos permite un uso fácil del hilo, permitiendonos realizar procesos en background y publicandolos posteriormente sin necesidad de usar handlers. Son tareas asíncronas : Estas tareas asíncronas se definen con tres tipos, llamados Params, Progress y Result, y cuatro métodos, onPreExecute, doInBackground, onProgressUpdate y onPostExecute. Por ejemplo, para cargar los elementos en un ListView :

private class ListViewTask extends AsyncTask>{
    Context context;
    ProgressDialog pDialog;
 //CONSTRUCTOR
    public CargarListView(Context context){
        this.context = context;
    }
 
    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
 
        pDialog = new ProgressDialog(context);
        pDialog.setMessage("Cargando");
        pDialog.setCancelable(true);
        pDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        pDialog.show();
    }
 
    @Override
    protected ArrayAdapter<String> doInBackground(Void... arg0) {
        // TODO Auto-generated method stub
 
        try{
            Thread.sleep(2000);
        }catch(Exception ex){
            ex.printStackTrace();
        }
 
        ArrayAdapter adaptador = new ArrayAdapter(context, android.R.layout.simple_list_item_1, sistemas);
        return adaptador;
    }
 
    @Override
    protected void onPostExecute(ArrayAdapter result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        list.setAdapter(result);
        pDialog.dismiss();
    }
}


Para llamarla...
new CargarListViewTask(activity).execute();



O por ejemplo, para cargar una foto a traves de Internet por medio de un enlace :

class DownloadImageTask extends AsyncTask {
  ImageView bmImage;

  public DownloadImageTask(ImageView bmImage) {
   this.bmImage = bmImage;
  }

  @Override
  protected Bitmap doInBackground(String... urls) {
   String urldisplay = urls[0];
   Bitmap mIcon11 = null;
   try {
    InputStream in = new java.net.URL(urldisplay).openStream();
    mIcon11 = BitmapFactory.decodeStream(in);
   } catch (Exception e) {
    Log.e("Error", e.getMessage());
    e.printStackTrace();
   }
   return mIcon11;
  }

  @Override
  protected void onPostExecute(Bitmap result) {
   bmImage.setImageBitmap(result);
  }
 }
}


Para llamarla...
new DownloadImageTask(R.id.image).execute("http//:miImagenColgada.jpg");




Compartir Compartir Compartir Compartir


Android: Crear una animacion mediante xml y Java

Blog >Lista Soluciones > Animacion frames


Crear animación mediante frames en xml

Hola programadores, hoy vengo a mostraros como se crea una animacion, lo implementaremos de tal forma que se ejecute cuando se inicia la actividad: Tenemos estas imágenes :




Y queremos este efecto,¿Cómo se hace?


Bien... vamos a ello; la tecnica que vamos a usar, es haciendo un nuevo documento XML en la carpeta drawable que llamaremos alarma.xml



 
   
   
   
   



Y en nuestra activity, en la parte gráfica pondremos una imagen, ajustandola como mejor veamos, pero a la derecha en la propiedad src:@drawable/alarma (en mi caso el archivo xml se llama intro)




Ahora para que se inicie cuando comienze la actividad, procedemos a insertar este código JAVA:


public class SplashScreenActivity extends Activity {

    private ImageView imagen;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Hide title bar
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        
        imagen=(ImageView)findViewById(R.id.introduccion);
        final AnimationDrawable myAnimationDrawable=
                 (AnimationDrawable)imagen.getDrawable();
            imagen.post(
                 new Runnable(){
                   @Override
                   public void run() {
                    myAnimationDrawable.start();
                   }
                 });
    }   



Podeis descargar el código fuente de thebestandroide con sólo compartir en facebook,twitter,linkedin o suscribirte a nuestro canal RSS más abajo. 



Compartir Compartir Compartir Compartir




Nuevo software para Developers: Android Studio

Muy buenas, aquí os dejo el último software de google para desarrolladores android, personalmente cuando acabe mi app actual me migrare a trabajar en este entorno... Os dejo el link de descarga y una muy buena referencia desde esta excelente pagina : www.elandroidelibre.com aquí.
Link de descarga aquí.

Notification Manager Activity new instance and resume activity

Blog >Lista Soluciones > Notification Manager

Hola programadores, os traigo un problemilla que me ha llevado unos días, ya que debido a la falta de info en la red, me ha traido varios quebraderos de cabeza. Expongo aquí una función que he comentado bastante para que se entienda, al llamar a esta función.

Crea una notificación en la persiana de notificaciones del teléfono Android, el código puede abrir una nueva instancia de la Activity o abrir la antigua en el método onPause()


oOo JAVA oOo
//FUNCION DE CREAR NOTIFICACION
   protected void LanzarNotificacion(){
//EL ID DE LA NOTIFICACION
        int notificationID = 1;
        //SE  CREA UN INTENT EN EL QUE SE GUARDA EL ID DE LA NOTIFICACION, SE LLAMA ASI MISMA
        Intent i = new Intent(this, MainActivity.class);
        i.putExtra("notificationID", notificationID);
        //EL PENDINGINTENT ES UN INTENT ADAPTABLE PARA QUE SE REALICE LA NOTIFICACION
        //MIENTRAS LA APLICACION PASA AL CICLO DE VIDA ONPAUSE()
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, i, 0);
        NotificationManager nm = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
         
        //DETALLES
        CharSequence ticker ="Cronómetro Asalto Boxeo Activado";
        CharSequence contentTitle = "Cronómetro Asalto Boxeo";
        CharSequence contentText = "Cronómetro activado, sonará hasta que cierre la aplicación.";
        Notification noti = new NotificationCompat.Builder(this)
                                .setContentIntent(pendingIntent)
                                .setTicker(ticker)
                                .setContentTitle(contentTitle)
                                .setContentText(contentText)
                                .setSmallIcon(R.drawable.guante)
                                .addAction(R.drawable.guante,minuteroNotif+"  "+ticker, pendingIntent)
                                .setVibrate(new long[] {100, 250, 100, 500})
                                .build();
        
        //pa/ra que cuando se pulse desaparezca
        noti.flags= Notification.FLAG_AUTO_CANCEL;

        nm.notify(notificationID, noti);
        hayNotificacion=true;
    }


Y el resultado:





El problema de raíz, le tenía en que al pulsar sobre la notificación, me abría mi app pero en una nueva instancia, en vez de la anterior, que estaba en el ciclo de vida onPause()
Para que vuelva a abrir la instancia, en vez de una nueva:  En el Android Manifiest.xml añadir:

 oOo XML oOo
 
        
            /////////////////////////////////
            
                
                
            
        



Crea una notificación en la persiana de notificaciones del teléfono Android, que vuelve a primera instancia que se abrio de la Activity

Y en la función que lanza la actividad:
 oOo JAVA oOo
//FUNCION DE CREAR NOTIFICACION
   protected void LanzarNotificacion(){
//EL ID DE LA NOTIFICACION
        int notificationID = 1;
        //SE  CREA UN INTENT EN EL QUE SE GUARDA EL ID DE LA NOTIFICACION, SE LLAMA ASI MISMA
        Intent i = new Intent(this, MainActivity.class);
        //////////////////////////////////////////////////////////////////////////////////
        //AQUI ESTA LA LINEA PARA QUE SE LLAME A LA INSTANCIA DE LA ACTIVIDAD QUE ESTABA ONPAUSE();
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
        //////////////////////////////////////////////////////////////////////////////////
        i.putExtra("notificationID", notificationID);
        //EL PENDINGINTENT ES UN INTENT ADAPTABLE PARA QUE SE REALICE LA NOTIFICACION
        //MIENTRAS LA APLICACION PASA AL CICLO DE VIDA ONPAUSE()
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, i, 0);
        NotificationManager nm = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
         
        //DETALLES
        CharSequence ticker ="Cronómetro Asalto Boxeo Activado";
        CharSequence contentTitle = "Cronómetro Asalto Boxeo";
        CharSequence contentText = "Cronómetro activado, sonará hasta que cierre la aplicación.";
        Notification noti = new NotificationCompat.Builder(this)
                                .setContentIntent(pendingIntent)
                                .setTicker(ticker)
                                .setContentTitle(contentTitle)
                                .setContentText(contentText)
                                .setSmallIcon(R.drawable.guante)
                                .addAction(R.drawable.guante,minuteroNotif+"  "+ticker, pendingIntent)
                                .setVibrate(new long[] {100, 250, 100, 500})
                                .build();
        
        //pa/ra que cuando se pulse desaparezca
        noti.flags= Notification.FLAG_AUTO_CANCEL;

        nm.notify(notificationID, noti);
        hayNotificacion=true;
    }



Bye Bye!! Haber si a más de uno le echa un cable!! salu2!!!

oOo mAkOnE oOo



Podeis descargar el código fuente de thebestandroide con sólo compartir en facebook,twitter,linkedin o suscribirte a nuestro canal RSS más abajo. 



Compartir Compartir Compartir Compartir




Android : Cambiar BackGround efecto onClick() en Button por XML

Blog >Lista Soluciones > Cambiar background Button

Hola desarrolladores, continuando con el blog vamos a tratar la naturaleza del XML de Android para usarla con un botón.

Como conseguir el efecto de que un botón al pulsar cambie de background en la ejecución de tu app.

Primero,aunque también podría hacerse desde XML (depende de lo que queramos, pero suele quedar más profesional) lo vamos a hacer mediante imágenes.

Tenemos que crear 2 imágenes, que van a partir desde la misma, pero no olvideis que para conseguir el efecto deseado al clickar, una de ellas ha debido ser tratada.Si lo haceis a photoshop, a la hora de guardar ya sea .jpg o .png  no olvideis de usar exportar para web en vez de un simple guardar como.Esto te ahorrará problemas de memoria en un futuro, ya que el gestor de basura de Android es una miserable bazofia.

En las mías, go1 y go2, si os fijais, lo único que tiene una es una sombra, la otra está en bruto :



A continuacion, arrastrar las imágenes a la carpeta drawable, y seleccionar copy-files,después botón derecho al proyecto y crear Android XML File, y en la carpeta drawable insertar el archivo xml que contendrá este código(el mio se llama go.xml):

 oOo XML oOo

    
    

En el código anterior simplemente da las instrucciones en las que dice que al clickar el botón, aparezca una imágen, y sin clickarlo aparezca la otra.
Después, en el XML donde tengamos el botón de nuestra actividad principal, observar lo que se pone en la propiedad background:

oOo XML oOo
                                          
 


Es decir, en vez de llamar a una imagen, llama a un xml que se encarga de asociar las imágenes en función de si el botón está presionado o no, sencillito y rápido.
Mi consejo personal, es que lo hagais primero con un par de imágenes con las mismas dimensiones pero distintas para probar si la programación es correcta, después, trabajar con el diseño.



Podeis descargar el código fuente de thebestandroide con sólo compartir en facebook,twitter,linkedin o suscribirte a nuestro canal RSS más abajo. 



Compartir Compartir Compartir Compartir




Deshabilitar el botón atrás o retroceso Android Java




Desabilitar el botón de atrás mediante onBackPressed()

Buscando documentación sobre deshabilitar el botón de atras de los dispositivos Android, me tope con esta función, para controlarlo:


 public void onBackPressed() {
    
 }



Podeis descargar el código fuente de thebestandroide con sólo compartir en facebook,twitter,linkedin o suscribirte a nuestro canal RSS más abajo. 



Compartir Compartir Compartir Compartir




Podeis descargar el código fuente de thebestandroide con sólo compartir en facebook,twitter,linkedin o suscribirte a nuestro canal RSS más abajo. 



Compartir Compartir Compartir Compartir




Android : Contar caracteres InputText en un TextView Por Java y XML

Blog >Lista Soluciones > Contar caracteres ImputText

Hola desarrolladores, hoy continuando con el blog, vamos a tratar un tema bastante sencillo :

Cómo se cuentan los caracteres que se van introduciendo en un imput text, y se muestran a continuación por un TextView


oOo XML oOo

        <EditText

            android:id="@+id/cadena"

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:textSize="10sp" >

            <requestFocus />

        </EditText>

            <TextView

                android:id="@+id/car1"

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:text="car1"

                android:textSize="9sp" />


 oOo JAVA oOo
Main:

        //CREO Y REFERENCIO MIS OBJETOS A LOS DEL XML

        private TextView car1;

        private EditText cadena;

        

        car1=(TextView)findViewById(R.id.car1);

        cadena=(EditText)findViewById(R.id.cadena); 

OnCREATE:

       cadena.addTextChangedListener(new TextWatcher() {

        @Override

        public void afterTextChanged(Editable arg0) {

            // TODO Auto-generated method stub

        }

        @Override

        public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,

                int arg3) {

            // TODO Auto-generated method stub

        }

        @Override

        public void onTextChanged(CharSequence arg0, int arg1, int arg2,

                int arg3) {

            //AQUI ES DONDE VA EL CONTADOR

            //EN TIEMPO REAL AL TEXVIEW

            car1.setText(String.valueOf(cadena.length()));




/OnCREATE: 
 
 
Os ha ayudado¿? espero que sí!!


oOo mAkOnE oOo



Podeis descargar el código fuente de thebestandroide con sólo compartir en facebook,twitter,linkedin o suscribirte a nuestro canal RSS más abajo. 



Compartir Compartir Compartir Compartir




Android: Cambiar color TextView XML y Java (ejemplo button)

Blog >Lista Soluciones > Cambiar color TextView

Hola develpers, continuamos el blog con una nueva entrada que en principio para algunos puede resultar muy básica, pero es un gran recurso que se necesita saber.

Cambiar color texto en TextView

A continuación vamos a aprender a dar a un TextView un determinado color pulsando previamente en un botón al que ya se le ha asignado un color.

En primer lugar debemos declarar los colores en un archivo xml para poder hacer referencia a los mismos. Mediante código Java crearemos las instancias de los botones, y en ellas, utilizaremos el método onClick() para terminar con el resultado de proporcionar color al TextView.

1 .- Crear un archivo xml en la carpeta res/values/Colores.xml, os facilito un ejemplo del código donde se almacenan los colores:

 <?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="BLANCO">#FFFFFF</color>
    <color name="NARANJA">#F28220</color>
    <color name="MORADO">#C733C9</color>
    <color name="PISTACHO">#C0D787</color>
    <color name="NEGRO">#000000</color>
    <color name="ROJO">#DE0814</color>
    <color name="ROSA">#E13157</color>
    <color name="SALMON">#FA8071</color>
    <color name="VVIVO">#7EF40A</color>
    <color name="AMARILLO">#FCFA36</color>
    <color name="CELESTE">#ADDBD9</color>
    <color name="COBALTO">#0C23B1</color>
</resources>
Una vez tenemos esto, es muy fácil cambiarlo desde la interfad gráfica del XML, a la derecha en el panel.En properties seleccionamos el TexView o editText y seleccionamos la propiedad TextColor, ahi pulsamos CTRL+ALT+3 para que salga @ y el resto es pan comido, ya que te lo indica la misma ayuda de eclipse :

Seleccionamos y listo, así quedaria en el código:

                    android:id="@+id/nummero"
                    style="?android:attr/buttonStyleSmall"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_vertical"
                    android:textColor="@color/NEGRO"
                    android:text="00"
                    android:textAppearance="?android:attr/textAppearanceLarge"
                    android:textSize="70sp" />


Ahora,si por el contrario queremos hacer un programita en el que 3 textView cambien del mismo color cada vez que se pulse un boton, aplicaremos código Java en lugar del código anterior :


    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_colores); 

        //inicializo textviews

        numero=(TextView)findViewById(R.id.nummero);

        letras=(TextView)findViewById(R.id.letra);

        guion=(TextView)findViewById(R.id.guion);

        letras.setText(String.valueOf(array[i]));



        b1=(Button)findViewById(R.id.i1);

        b1.setOnClickListener(new OnClickListener(){



            @Override

            public void onClick(View arg0) {

                PonerColores(0);
            }  

        });

}





//FUNCION QUE PONE LOS COLORES A LOS TEXTVIEW

    public void PonerColores(int color){



            letras.setTextColor(letras.getContext().getResources().getColor(R.color.MORADO));

            guion.setTextColor(guion.getContext().getResources().getColor(R.color.MORADO));

            numero.setTextColor(numero.getContext().getResources().getColor(R.color.MORADO));

  }
Vualá!! Espero que os haya servido!!

oOo mAkOnE oOo



Podeis descargar el código fuente de thebestandroide con sólo compartir en facebook,twitter,linkedin o suscribirte a nuestro canal RSS más abajo. 



Compartir Compartir Compartir Compartir