Este post es mas un tip que un tutorial en si, y lo escribo por que en el play-store aparecen muchas app diciendo que hacen esto, cuando en realidad no necesitas ninguna aplicación externa para poder realizar esta acción, simplemente tu celular android y tu computadora donde desarrolles.
Sigue leyendo
Archivo de la etiqueta: android
Google Maps Android
Las aplicaciones con mapas y móviles es como el «hello word» en cualquier lenguaje de programación todo el mundo quiere que su aplicación tenga mapas y mas aun su aplicación se basa en torno a mapas y localizaciones. Pues este es otro tutorial de como manejar mapas de google con android.
Android Push Notification ( Parte 1 – Cliente )
Las Notificaciones push son por hoy una de los mejores features (Opino yo) que han tenido los móviles, ya que le da al developer la opción de poder interactuar de la manera que quiera con el usuario final y poder así brindarle un buen producto de calidad y una buena experiencia.
Desde enviarle una notificación de un chat o mail hasta hacer que su celular se comporte de forma que el developer quiera (Evil inside).
Hoy dia hay varias alternativas para poder implementar las notificaciones push desde proveedores terceros hasta el mismo google con GCM (Google cloud message) y el que estaremos usando para este tutoriral.
Ahora mismo un poco de la interacciones que suceden para poder llevar acabo esto.
Detalles de las interacciones
Paso 1 & 2:
Desde el móvil la aplicación se conecta al CGM y solicita un identificador.
Paso 3:
Desde la aplicación buscamos la manera de almacenar ese identificador retornado por GCM. Digo la manera por que el hecho es que el identificador se genero y depende de nosotros guardarlo.
Paso 4:
Desde nuestro servidor de aplicación enviamos las peticiones al GCM para que este luego procesa a enviar los push al dispositivo especifico.
Antes de comenzar a coder debemos primero realizar los siguientes pasos.
1.Antes de comenzar debemos crear un projecto en el Google console Developer.
2.Luego debemos agregarle la api de Google Cloud Message a nuestro Projecto
3.Generar una key para nuestro projecto.
Una vez hecho todo Esto, Mano en el codigo.
Crear un projecto Android Simple.
Incluirle el google-play-service-lib
Agregar estos permisos a nuestra applicacion.
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
Dentro del tag de application agregar esto, sino les dara un error.
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
Luego agregar este permiso especial, y cambiar «com.example.projecto» por el propio.
<permission android:name="com.example.projecto.permission.C2D_MESSAGE" android:protectionLevel="signature" />
Luego debemos crear un Servicio android que extienda de IntentService, el servicio estara encargado de generar una notificacion una vez reciba un push notificacion de GCM.
public class GCMService extends IntentService{ private NotificationManager mNotificationManager; private int NOTIFICATION_ID = 1234; public GCMService() { super("Listener-Service"); } @Override protected void onHandleIntent(Intent intent) { Bundle extras = intent.getExtras(); sendNotification("Received: " + extras.toString()); GCMBroadCastReceiver.completeWakefulIntent(intent); } private void sendNotification(String msg) { mNotificationManager = (NotificationManager)this.getSystemService(Context.NOTIFICATION_SERVICE); PendingIntent contentIntent = PendingIntent.getActivity(this, 0,new Intent(this, MainActivity.class), 0); NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.drawable.ic_launcher) .setContentTitle("Developer") .setStyle(new NotificationCompat.BigTextStyle() .bigText(msg)) .setContentText(msg); mBuilder.setContentIntent(contentIntent); mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build()); } }
Agregar el servicio que acabamos de crear a nuestro manifest.xml.
<service android:name="com.example.deveoper.GCMService" />
Ahora necesitamos crear un receiver para poder recibir las notificaciones.
public class GCMBroadCastReceiver extends WakefulBroadcastReceiver{ private String TAG = "Broadcast receiver"; @Override public void onReceive(Context context, Intent intent) { ComponentName comp = new ComponentName(context.getPackageName(),GCMService.class.getName()); startWakefulService(context, (intent.setComponent(comp))); setResultCode(Activity.RESULT_OK); Log.i(TAG,"Notification receive"); } }
Agregar el receiver que acabamos de crear en nuestro archivo manifest.xml
<receiver android:name="com.example.developer.GCMBroadCastReceiver" android:permission="com.google.android.c2dm.permission.SEND" > <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <category android:name="com.example.developer" /> </intent-filter> </receiver>
Una vez esten creado nuestro servicio y nuestro receiver procedemos a trabajar sobre la actividad donde estaremos solicitando nuestro «client-id».
En este ejemplo usare el main activity pueden usar cualquier actividad. Nuestra mainActivity estaria quedando de esta forma.
public class MainActivity extends Activity { private final static int PLAY_SERVICES_RESOLUTION_REQUEST = 9000; private GoogleCloudMessaging gcm = null; private String SENDER_ID = "tu-project-id"; private String regid; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if( checkPlayServices(this) == true ){ getReigstrationId(this); } } public void getReigstrationId(final Context context){ new AsyncTask<Void, Void, Void>(){ private String msg; @Override protected Void doInBackground(Void... arg0) { if (gcm == null) { gcm = GoogleCloudMessaging.getInstance(context); } try { Log.i("Sender",SENDER_ID); regid = gcm.register(SENDER_ID); msg = "Movil registrado, registration ID=" + regid; } catch (IOException e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(Void result) { Log.i("Developer",msg); Toast.makeText(context, msg, Toast.LENGTH_LONG).show(); } }.execute(); } public static boolean checkPlayServices(Context context) { int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(context); if (resultCode != ConnectionResult.SUCCESS) { if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)) { GooglePlayServicesUtil.getErrorDialog(resultCode, (Activity) context,PLAY_SERVICES_RESOLUTION_REQUEST).show(); } else { Log.i("Developer", "This device is not supported."); } return false; } return true; } }
Si todos los pasos le salieron bien, tendrían como resultado un Toast con su «registratio-id» el cual es el que se usa para enviar las notificaciones.
Hasta aqui la primera parte de este tutorial.
Android Push Notification ( Parte 2 – Productor ) ( Python )
Hola que tal, esta es una segunda parte de tutorial sobre notificaciones push con android.
Android Push Notification (Parte 1 – Cliente)
En esta entrega estaremos continuando y creando el productor ( Quien genere las notificaciones para GCM ).
Los requerimientos para este tutorial son simple, solo necesitas isntalar la libreria Requests de python para poder realizar los request a GCM.
pip install requests
ahora bien para probar pueden utilizar este simple ejemplo ejecutando este archivo y estarán enviando notificaciones a los «registration-id» que le suplan.
import requests import json #Estos son los parametros extra para enviar y recibirlos por extras en el intent del receiver extra = {"param1":"valor parametro 1","param2":"valor parametro 2"} dataRaw = { "data":extra, "registration_ids":[ #Los registration ids a cuales les enviara la notificacion 'registration-id', ] } key = "your server key generated" headers = { "Content-Type":"application/json", "Authorization":"key={}".format(key) } result = requests.post("https://android.googleapis.com/gcm/send",headers=headers,data=json.dumps(dataRaw)) print result.text print result
Si todo sale bien tendran un resultado como este
{"multicast_id":4616697826678564758,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1402514025648966%2fee3519f9fd7ecd"}]} <Response [200]>
Si quieren mas referencia a la libreria request he aqui un tutorial de como usarla.
Request Python Referencia
Consumir API json con Android
Hola que tal, Buenas. En esta entrega estaré realizando un tutorial de como consumir una api json con android, estaré trabajando con los recursos nativos de android, ósea nada de librerías de terceros por el momento.
Para realizar peticiones http estaremos usando las clases HTTPGet y HTTPPost ademas de los helpers para JSON JSONArray y JSONObject.
Dejaremos detrás la creación del proyecto y todo lo demás relacionado con el proyecto android, al final del día no es el objetivo en este tutorial.
Digamos que tenemos una api «http://localhost.dev/country» que acepta métodos GET para retornar una lista de países y sus respectivas capitales, Algo como esto seria lo que retorna dicha api.
[ { country: "Republica Dominicana", capital: "Santo Domingo" }, { country: "Japon", capital: "Tokio" }, { country: "Venezuela", capital: "Caracas" }, { country: "Portugal", capital: "Lisboa" }, { country: "Espana", capital: "Madrid" }, { country: "Rusia", capital: "Moscow" }, { country: "Colombia", capital: "Bogota" } ]
Una vez sabiendo la respuesta de nuestra api podemos construirle un cliente.
/service api url String url = 'http://localhost.dev/country'; // declarar un client http en este caso DefaultHttpClient HttpClient client = new DefaultHttpClient(); //Como nuestro servicio es un metodo get usamos HTTPGet HttpGet request = new HttpGet(url); HttpResponse response; List entityResult; try { //Ejecutamos el request ya compuesto response = client.execute(request); StatusLine statusLine = response.getStatusLine(); //El statusLine retorna el resultado del request a nivel de statusCode //AKA ( 200,404,500,401,403... ) if (statusLine.getStatusCode() == HttpStatus.SC_OK) { //Si queremos el resultado del servicio (json) debemos de obtenerlo del payload del request //Que es obtenido como un InputStream el cual tendremos que convertir a String InputStream in = response.getEntity().getContent(); BufferedReader buffered = new BufferedReader(new InputStreamReader(in)); StringBuilder fullLines = new StringBuilder(); String line; // while ((line = buffered.readLine()) != null) { fullLines.append(line); } String result = fullLines.toString() JSONArray objetos = new JSONArray(result); for(int i=0;i<objetos.length;i++){ JSONObject objeto = new JSONObject(objetos[i]); /* cada objecto sera compuesto por esto { country: "pais", capital:"capital" } */ } } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }
Para obtener cualquier valor de nuestro objeto json basta con solo decir, mas detalles en la pagina de documentación de JSONObject
object.getString object.getInt object.JSONObject
Este método (wrap) es el que usaremos para convertir el inputStream a un String y poder parsearlo a JSON.
public static String inputStreamToString(InputStream in) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(in)); StringBuilder sb = new StringBuilder(); String line; while ((line = br.readLine()) != null) { sb.append(line); } return sb.toString(); }
Eso seria todo si todos los métodos fueran de tipo GET pero en ocasiones tenemos método que reciben solo POST y parámetros dentro del payload (JSON). El código seria bastante parecido, la diferencia principal es el uso de HTTPPost en vez de HTTPGet.
String url = 'url_to_you_server_api.dev/postservice' HttpClient client = new DefaultHttpClient(); HttpPost request = new HttpPost(url); JSONObject parametros = new JSONObject(); parametros.put("usuario","usuario"); parametros.put("clave","top_secret"); StringEntity jsonEntity = new StringEntity( dataJson.toString() ); HttpPost request = new HttpPost(url); //Agregar esto ya que algunos frameworks (nodejs frameworks) necesitan esto //para poder parsear los payloads automaticamente request.addHeader("Content-Type","application/json"); //Se configura el payload a enviar al servicio request.setEntity(jsonEntity); //Ejecutamos el request ya compuesto response = client.execute(request); //De este punto en adelante es los mismo que una llamada GET al servicio. StatusLine statusLine = response.getStatusLine();
Como pueden notar realizar llamadas POST y GET con android es bastante fácil y simple, Hoy día ya hay varios frameworks que abstraen esta funcionalidad de tener que realizar el request y parsear el JSON.
Saludos.
Conectando Twitter con android (Twitterj4)
El uso de las redes sociales en aplicaciones moviles el dia de hoy es bastante utilizado, la mayoria de las paltaformas ofrecen sus api para ser consumidas por los developer y estos integrarlas a sus aplicaciones. Twitter no es la excepion ofreciendo todas las posibilidades de su pagina a una muy buena Api, desde simplemente ver un timelime hasta ver todo el historia de DMs.
Android y twitter
Para este tutorial estaremos utilizando la libreria Twitterj4, pueden pasar y darle un ojo cuando tengan tiempo.
Antes de comenzar a codear lo primero que necesitamos es crear una aplicacion de twitter para poder opterner los datos de «authenticacion» y todo lo demas.
Crear la aplicacion de twitter
llenar los campos obligatorios para poder crear la aplicacion.
Una vez creada tendran algo como esto.
Luego de crear nuestra aplicacion debemos de crear los token de aceso.
Una vez creado los datos de acceso tendremos los siguientes campos disponibles:
<intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:host="url-example" android:scheme="oauth" /> </intent-filter>
Agregar permisos de internet
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
La url es la que pondremos para que realice el callback con esa url de ejemplo funcionara, mas luego veran donde la editamos, pueden poner cualquier valor ahi.
Manos en el codigo.
Debemos de declarar varias constantes
static String TWITTER_CONSUMER_KEY = "api key"; static String TWITTER_CONSUMER_SECRET = "api secret"; static final String TWITTER_CALLBACK_URL = "oauth://url-example";
Tenemos un metodo para realizar el login con twitter que es de esta forma.
public void loginTwitter(){ ConfigurationBuilder builder = new ConfigurationBuilder(); builder.setOAuthConsumerKey(TWITTER_CONSUMER_KEY); builder.setOAuthConsumerSecret(TWITTER_CONSUMER_SECRET); Configuration configuration = builder.build(); TwitterFactory factory = new TwitterFactory(configuration); Twitter twitter = factory.getInstance(); try { requestToken = twitter.getOAuthRequestToken(TWITTER_CALLBACK_URL); startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(requestToken.getAuthenticationURL()))); } catch (TwitterException e) { e.printStackTrace(); } }
Nuestor metodo oncreate sera donde llamemos para hacer el login con twitter, tendriamos algo asi.
Creamos una variable estatica y privada para guardar el request token y tener la misma instancia. (No es la mejor forma pero es la mas rapida).
private static RequestToken requestToken;
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //Para los fines de este tutorial hare esto, pero no es recomendable hacer http request en el main thread. // Ya sera en otra ocacion donde explicare como hacer los request en segundo plano. // Simplemente usen un AsyncTask http://stackoverflow.com/questions/9671546/asynctask-android-example StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); Uri data = getIntent().getData(); if(data != null){ String token = data.getQueryParameter("oauth_token"); String oauthVerified = data.getQueryParameter("oauth_verifier"); // ConfigurationBuilder builder = new ConfigurationBuilder(); builder.setOAuthConsumerKey(TWITTER_CONSUMER_KEY); builder.setOAuthConsumerSecret(TWITTER_CONSUMER_SECRET); Configuration conf = builder.build(); TwitterFactory factory = new TwitterFactory(conf); Twitter twitter = factory.getInstance(); RequestToken r = requestToken; if(twitter != null){ try { AccessToken accessToken = twitter.getOAuthAccessToken(r, oauthVerified); this.setTitle("Twitter " + accessToken.getScreenName().toString()); } catch (IllegalStateException e) { e.printStackTrace(); } catch (TwitterException e) { e.printStackTrace(); } } }else{ loginTwitter(); } }
Si todo sale bien tendrian algo como esto.