Search code examples
androidbroadcastreceiverhttp-get

android http get request in broadcast receiver


I'm new to android and need help, as the question states i want to have a background service that listens to incoming smses(using broadcast receiver?) and then makes a http get request with sms body and phone number for each sms as soon as it arrives(to upload to a web server), trying to do this from scratch, ideas and code examples anyone ? :)

public class ReceiverContainer extends Service{

public SMSreceiver mSMSreceiver;
public IntentFilter mIntentFilter;

@Override
public void onCreate()
{
super.onCreate();

//SMS event receiver
mSMSreceiver = new SMSreceiver();
mIntentFilter = new IntentFilter();
mIntentFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
registerReceiver(mSMSreceiver, mIntentFilter);
}

@Override
public void onDestroy()
{
super.onDestroy();

// Unregister the SMS receiver
unregisterReceiver(mSMSreceiver);
mSMSreceiver = null;
}

@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}

public class SMSreceiver extends BroadcastReceiver
{
 public void Action(Context context,Intent intent) throws ClientProtocolException, URISyntaxException, IOException
    {
     Bundle myBundle = intent.getExtras();
     SmsMessage [] messages = null;
     String strMessage = "";
     String msgFrom = "";
     String msgText = "";

     if (myBundle != null)
     {
         Object [] pdus = (Object[]) myBundle.get("pdus");
         messages = new SmsMessage[pdus.length];

         for (int i = 0; i < messages.length; i++)
         {
             messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
             strMessage += "SMS From: " + messages[i].getOriginatingAddress();
             msgFrom += messages[i].getOriginatingAddress();
             strMessage += " : ";
             strMessage += messages[i].getMessageBody();
             msgText += messages[i].getMessageBody();
             strMessage += "\n";
         }

         Toast.makeText(context, strMessage, Toast.LENGTH_SHORT).show();

         uploadMessage(context,msgFrom,msgText);

     }
    }

@Override
public void onReceive(Context context, Intent intent)
{
        try {
            Action(context,intent);
        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (URISyntaxException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
}

}

public void uploadMessage(Context context,String number,String msg) throws URISyntaxException,   ClientProtocolException, IOException
{

HttpResponse response = null;
HttpClient client = new DefaultHttpClient();


Uri.Builder path = new Uri.Builder();
path.scheme("http");
path.authority("technonectar11.com");
path.path("sms");
path.appendQueryParameter("fromno" , number);
path.appendQueryParameter("text" , msg);
path.appendQueryParameter("uname" , "vijay");

HttpGet request = new HttpGet(path.build().toString());     
//request.setURI(new URI("http://www.technonectar11.com/sms/insertsms?fromno="+number+"&text="+msg+"&uname=vijay"));
response = client.execute(request);

String result = convertStreamToString(response.getEntity().getContent());

Toast.makeText(context, result, Toast.LENGTH_SHORT).show();

}

public static String convertStreamToString(InputStream inputStream) throws IOException
{
if (inputStream != null)
{
    Writer writer = new StringWriter();

    char[] buffer = new char[1024];
    try
    {
        Reader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"),1024);
        int n;
        while ((n = reader.read(buffer)) != -1)
        {
            writer.write(buffer, 0, n);
        }
    }
    finally
    {
        inputStream.close();
    }
    return writer.toString();
}
else
{
    return "";
}

} }

this is my code in its entirety, but the upload message function does not work


Solution

  • Turns out that I'm not allowed to perform Network Operations on the main thread. It gives me a NetworkOnMainThreadException. I have to use IntentService/AsyncTasks/Handler for this one.