Mostrando entradas con la etiqueta desarrollo apps. Mostrar todas las entradas
Mostrando entradas con la etiqueta desarrollo apps. Mostrar todas las entradas

jueves, 13 de abril de 2017

como subir una imagen desde android a una base de datos en mysql

Hola amigos y amigas programadores les traigo un nuevo tutorial de como subir una imagen desde android a una base de datos en mysql.
A pedido de un subscriptor de youtube vamos hacerlo, algo rápido porque ando de vacaciones, si no les queda muy claro solo me escriben:

PASO: 1   Crear nuestra Web Services

Bien para este tuto haremos nuestra ws en la nube :)  utilizare el hosting gratuito webcindario:
y debemos crear nuestra base de datos con tres campos, como se muestra en la siguiente imagen


Ahora debemos crear nuestro archivo dbConnect.php
<?php 
 
 define('HOST','mysql.webcindario.com');
 define('USER','usuario del hosting');
 define('PASS','pass del usuario');
 define('DB','nombre de base de datos');
 
 $con = mysqli_connect(HOST,USER,PASS,DB) 
 or die('unable to connect to db');


Recuerda que los datos debes cambiarlo según el lugar donde tengas tu base de datos:
Ahora debemos de crear nuestro archivo upload.php
<?php
 
 if($_SERVER['REQUEST_METHOD']=='POST'){
 
 $imagen= $_POST['foto'];
                $nombre = $_POST['nombre'];
 
 require_once('dbConnect.php');
 
 $sql ="SELECT id FROM frutas ORDER BY id ASC";
 
 $res = mysqli_query($con,$sql);
 
 $id = 0;
 
 while($row = mysqli_fetch_array($res)){
 $id = $row['id'];
 }
 
 $path = "uploads/$id.png";
 
 $actualpath = "http://servermorefast.webcindario.com/ImagenConNombre/$path";
 
 $sql = "INSERT INTO frutas (foto,nombre) VALUES ('$actualpath','$nombre')";
 
 if(mysqli_query($con,$sql)){
 file_put_contents($path,base64_decode($imagen));
 echo "Subio imagen Correctamente";
 }
 
 mysqli_close($con);
 }else{
 echo "Error";
 }

 Esos dos archivos deben subirlo a su hosting o servidor local y aparte deben crear una carpeta llamada uploads donde se guardara las imágenes y quedara como en la siguiente imagen.




PARTE 2: Ahora toca meter mano a la aplicación en android, nuestro activity_main.xml tendra lo siguiente

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


    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Elegir imagen"
        android:id="@+id/btnBuscar" />


    <ImageView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:id="@+id/imageView" />


    <EditText
        android:id="@+id/editText"
        android:hint="Ingresa un Nombre"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Subir Imagen"
        android:id="@+id/btnSubir" />


</LinearLayout>


Y por ultimo nuestro MainActivity.java 

public class MainActivity extends AppCompatActivity implements View.OnClickListener  {

    private Button btnBuscar;
    private Button btnSubir;

    private ImageView imageView;

    private EditText editTextName;

    private Bitmap bitmap;

    private int PICK_IMAGE_REQUEST = 1;

    private String UPLOAD_URL ="http://servermorefast.webcindario.com/upload.php";

    private String KEY_IMAGEN = "foto";
    private String KEY_NOMBRE = "nombre";

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

        btnBuscar = (Button) findViewById(R.id.btnBuscar);
        btnSubir = (Button) findViewById(R.id.btnSubir);

        editTextName = (EditText) findViewById(R.id.editText);

        imageView  = (ImageView) findViewById(R.id.imageView);

        btnBuscar.setOnClickListener(this);
        btnSubir.setOnClickListener(this);
    }

    public String getStringImagen(Bitmap bmp){
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);
        byte[] imageBytes = baos.toByteArray();
        String encodedImage = Base64.encodeToString(imageBytes, Base64.DEFAULT);
        return encodedImage;
    }

    private void uploadImage(){
        //Mostrar el diálogo de progreso
        final ProgressDialog loading = ProgressDialog.show(this,"Subiendo...","Espere por favor...",false,false);
        StringRequest stringRequest = new StringRequest(Request.Method.POST, UPLOAD_URL,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String s) {
                        //Descartar el diálogo de progreso
                        loading.dismiss();
                        //Mostrando el mensaje de la respuesta
                        Toast.makeText(MainActivity.this, s , Toast.LENGTH_LONG).show();
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError volleyError) {
                        //Descartar el diálogo de progreso
                        loading.dismiss();

                        //Showing toast
                        Toast.makeText(MainActivity.this, volleyError.getMessage().toString(), Toast.LENGTH_LONG).show();
                    }
                }){
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                //Convertir bits a cadena
                String imagen = getStringImagen(bitmap);

                //Obtener el nombre de la imagen
                String nombre = editTextName.getText().toString().trim();

                //Creación de parámetros
                Map<String,String> params = new Hashtable<String, String>();

                //Agregando de parámetros
                params.put(KEY_IMAGEN, imagen);
                params.put(KEY_NOMBRE, nombre);

                //Parámetros de retorno
                return params;
            }
        };

        //Creación de una cola de solicitudes
        RequestQueue requestQueue = Volley.newRequestQueue(this);

        //Agregar solicitud a la cola
        requestQueue.add(stringRequest);
    }

    private void showFileChooser() {
        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE_REQUEST);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) {
            Uri filePath = data.getData();
            try {
                //Cómo obtener el mapa de bits de la Galería
                bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), filePath);
                //Configuración del mapa de bits en ImageView
                imageView.setImageBitmap(bitmap);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public void onClick(View v) {

        if(v == btnBuscar){
            showFileChooser();
        }

        if(v == btnSubir){
            uploadImage();
        }
    }
}


Ahora debemos agregar la libreria volley a dependencias en buil.gradle

compile 'com.mcxiaoke.volley:library-aar:1.0.0'


quedaría algo así




dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:23.0.1'
    compile 'com.mcxiaoke.volley:library-aar:1.0.0'
}

Y por ultimo un permiso en el androidManifest

<uses-permission android:name="android.permission.INTERNET"/>


El producto final seria lo siguiente:

EN EL ANDROID

   




EN EL SERVIDOR


Las imágenes se guardan en la BD con el nombre original y en la carpeta uploads con un numero, de esa forma aunque se repitan de nombre las fotos, no se chancaran al momento de cargarlos.


Igual si piensas que hablo escribo en chino te dejo el ejercicio:

  Link de la descarga
Programador alfa, lomo plateado, barba de clavos, mentón de roca, no descarga la aplicación sigue el tutorial. Clic para DESCARGAR

     
ENLACES DE INTERÉS:

domingo, 2 de abril de 2017

Como hacer un splash screen en android studio

Hola a todos hoy veremos un tutorial de como hacer un SPLASH SCREEN en android personalmente a mi me gusta este tipo de artículos, porque de alguna forma te enseñan a mejorar la estética de tu producto final, hay un dicho entre programadores,  "los que programan diseñan mal" y eso no es cierto si bien es verdad que en países avanzados existe un sujeto para cada trabajo, en Latinoamerica una sola persona es analista,diseñadora,programador, marketero etc de cosas y si bien es cierto esto genera muchas veces que las cosas se hagan a medias un programador que desarrolle mas de una actitud siempre hará bien su trabajo, con esto te digo que no debes hacer 20 cosas tu mismo porque nunca seras bueno en todo pero al menos puedes programar y hacer interfaces amigables para tus usuario.




Que es un Splash Screen?

No vamos hacer técnicos en la definición, Te has dado cuenta que cuando descargas alguna aplicación  y le das en ejecutar y carga hermosas entradas antes de ejecutarse "eso es un Splash Screen" te dejo algunos ejemplos en las siguientes imágenes:




Bien sin mas rodeos empezamos, hay muchas formas de hacerla pero en este tuto amantes delas frutas y los fragment, lo haremos con fragment :)
utilizaremos 3 layouts y 3 clases y para hacer los efectos del Splash Screen 2 layout en la carpeta animator.

activity_main.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/contenedor"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

</FrameLayout>

MainActivity.java

public class MainActivity extends Activity {

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

}


fragment_main.xml

<RelativeLayout 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"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Bienvenidos!!"
        android:textSize="60sp" />

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:srcCompat="@drawable/logo1"
        android:layout_marginTop="110dp"
        android:id="@+id/imageView3"
        android:layout_below="@+id/textView"
        android:layout_centerHorizontal="true" />

</RelativeLayout>


MainFragment.java

public class MainFragment extends Fragment {

 @Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
  return inflater.inflate(R.layout.fragment_main, container, false);
 }

}


fragment_splash_screen

<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"
    tools:context=".SplashScreenFragment" >

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:contentDescription="@string/app_name"
        android:scaleType="fitXY"
        android:src="@drawable/cereza1" />

</RelativeLayout>


SplashScreenFragment.java

<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"
    tools:context=".SplashScreenFragment" >

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:contentDescription="@string/app_name"
        android:scaleType="fitXY"
        android:src="@drawable/cereza1" />

</RelativeLayout>

Bien ahora debemos crear la carpeta animator dentro de la carpeta res no puede ser otro nombre o no lo reconocerá android studio.
Dentro de nuestra carpeta animator crearemos dos layout y serán los siguientes:


salir_a_la_izquierda_xml

<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <!-- Rotate. -->
    <objectAnimator
        android:duration="10"
        android:interpolator="@android:interpolator/accelerate_decelerate"
        android:propertyName="rotationY"
        android:valueFrom="0"
        android:valueTo="180" />

    <!-- Half-way through the rotation (see startOffset), set the alpha to 0. -->
    <objectAnimator
        android:duration="1"
        android:propertyName="alpha"
        android:startOffset="10"
        android:valueFrom="1.0"
        android:valueTo="0.0" />

</set>


voltear_a_la_izquierda.xml

<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <!-- Before rotating, immediately set the alpha to 0. -->
    <objectAnimator
        android:duration="0"
        android:propertyName="alpha"
        android:valueFrom="1.0"
        android:valueTo="0.0" />

    <!-- Rotate. -->
    <objectAnimator
        android:duration="100"
        android:propertyName="rotationY"
        android:valueFrom="-180"
        android:valueTo="0" />

    <!-- Half-way through the rotation (see startOffset), set the alpha to 1. -->
    <objectAnimator
        android:duration="1"
        android:propertyName="alpha"
        android:startOffset="10"
        android:valueFrom="0.0"
        android:valueTo="1.0" />

</set>


en la carpeta drawable debe ir la imagen de nuestro Splash Screen, les dejo la del ejemplo




Dentro de la carpeta values debemos agregar un archivo llamado color.xml y tendrá lo siguiente:

color.xml 

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

También modificaremos nuestro archivo styles y debe quedar de la siguiente forma:

style.xml

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

</resources>


Y con eso hemos terminado este tutorial, espero les sirva y no se olviden de comentar cualquier duda.


Igual si piensas que hablo escribo en chino te dejo el ejercicio:

  Link de la descarga
Programador alfa, lomo plateado, barba de clavos, mentón de roca, no descarga la aplicación sigue el tutorial. Clic para DESCARGAR

     
ENLACES DE INTERÉS:

lunes, 27 de marzo de 2017

Cómo personalizar listas (ListView) en Android Studio

¿Quieres personalizar listas o listView en Android Studio? cuando yo inicie en la programación con android e implante mi primer ListView y compare con otros ejercicios de programadores mas avanzados me di cuenta que el mio era una porquería jajaja y por entonces no había muchas guías y recuerdo que se trabaja en eclipse, entonces en honor a ese recuerdo hoy te voy a enseñar una bonita forma de crear listas más personalizadas y con un estilo propio, alejándonos de las clásicas listas de Android Studio. Además, esto nos permitirá añadir imágenes o botones entre muchas otras cosas a las listas.

Después de haber visto cómo lanzar un segundo activity, crear un adapter personalizado en Android Studio será como comer pizza gratis, así que vamos a ver cómo crearlos.

Crear lista/adapter personalizado en Android Studio

Para crear un adapter personalizado, y muy básico, en Android vamos a ver un sencillo ejemplo con una lista de frutas en la que mostraremos un ImageView y un TextView.

Primero te aconsejo crear un nuevo proyecto para no tener problemas con otras clases y después lo puedes portar a dónde tú quieras. Para que te hagas una idea, el resultado final sería algo como esto, un ejemplo de lista personalizada en Android Studio.

LISTA (LISTVIEW) PERSONALIZADA EN ANDROID STUDIO


PASO 1: Tenemos que ir a nuestro activity_main.xml e insertar un texView para el titulo y un listView para mostrar la lista y se vera de la siguiente forma

.

Y el código seria el siguiente:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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="com.androidmorefast.pc.appdiseniolistview.MainActivity"
    android:orientation="vertical">

    <TextView
        android:text="LISTA DE FRUTAS"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="24dp"
        android:textStyle="bold"
        android:id="@+id/textView" />

    <ListView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:id="@+id/lvListado" />
</LinearLayout>


Ahora debemos crear un archivo layout que nos servirá para modelar mejor el diseño de la lista,
la creamos de la siguiente forma: clic sobre layout--new--Layout resource file como se muestra en la siguiente imagen

                           Clic en la imagen para agrandar


Este nuevo layout le pondremos de nombre lista_frutas.xml dentro de el ira un texView y una imageView

CÓDIGO:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/imgFrutas"
        android:layout_gravity="center"
        android:layout_width="48dp"
        android:layout_height="48dp" />

    <TextView
        android:id="@+id/textView"
        android:layout_gravity="center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="25dp"
        android:text="textView" />

</LinearLayout> 
PASO 2: Ahora nos toca trabajar con nuestras clases, así que iremos primero a nuestro MainActivity.java y tendrá el siguiente código:

public class MainActivity extends Activity {

    ListView lista;
    Context context;

    ArrayList prgmNombre;
    public static int [] prgmImages={R.drawable.banana,R.drawable.coco,
        R.drawable.manzana,R.drawable.pera,R.drawable.sandia,R.drawable.uva};
    public static String [] progNombreLista={"BANANA","COCO++","MANZANA","PERA",
                                          "SANDIA","UVA"};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        context=this;

        lista=(ListView) findViewById(R.id.lvListado);
        lista.setAdapter(new GestionarAdapter(this, progNombreLista,prgmImages));

    }

}
Ahora también debemos crear una nueva clase java a la cual llamaremos GestionarAdapter.java  se crea de la siguiente forma como se muestra en la imagen:



y tendrá el siguiente código:

public class GestionarAdapter extends BaseAdapter {
    String[] resultado;
    int[] imgId;
    Context contexto;

    private static LayoutInflater inflater= null;
    public GestionarAdapter (MainActivity mainActivity,String[]progNombreLista,int[]progImg) {
        resultado = progNombreLista;
        contexto = mainActivity;
        imgId = progImg;
        inflater = (LayoutInflater) contexto.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

          }
    @Override
        public int getCount(){
           return resultado.length;
        }
    @Override
        public  Object getItem(int posicion) {
            return posicion;
        }
    @Override
       public  long  getItemId(int posicion) {
        return posicion;
        }
    public class Holder
    {
        TextView tv;
        ImageView img;
    }
    @Override
    public View getView(final int posicion, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        Holder holder=new Holder();
        View fila;
        fila = inflater.inflate(R.layout.lista_frutas, null);
        holder.tv=(TextView) fila.findViewById(R.id.textView);
        holder.img=(ImageView) fila.findViewById(R.id.imgFrutas);
        holder.tv.setText(resultado[posicion]);
        holder.img.setImageResource(imgId[posicion]);
        fila.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Toast.makeText(contexto, "Seleccionaste "+resultado[posicion],
                 Toast.LENGTH_LONG).show();
            }
        });
        return fila;
    }

}


Bien y con eso hemos terminado, espero les ayude a mejorar sus ejercicios y futuros proyectos.

 Link de la descarga
Programador alfa, lomo plateado, barba de clavos, mentón de roca, no descarga la aplicación sigue el tutorial. Clic para DESCARGAR

     
ENLACES DE INTERÉS:

 

Copyright @ 2015 Android-facil.

Designed by Draganus | AndroidFacil