Sevil
Sevil

Reputation: 31

Handling incoming messages my broadCastReceiver does not work

Hi everyone I have really important question please help me. I'm trying to handle incoming messages with broadcastReceiver.However,it does not work.I send the code below please help me.

My Manifest:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.commonsware.andorid"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="8" />
    <uses-permission android:name="android.permission.INTERNET"/>
      <uses-permission android:name="android.permission.READ_CONTACTS" />

    <uses-permission  android:name="android.permission.SEND_SMS"/>
    <uses-permission android:name="android.permission.RECEIVE_SMS"/>
    <uses-permission android:name="android.permission.BROADCAST_SMS"/>
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>



    <application
        android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
         <receiver android:name=".SMSBroadcastReceiver">
           <intent-filter android:priority="999">
                <action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
            </intent-filter>
        </receiver>
        <activity
            android:name=".NewPage"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".NewMessage" />
        <activity android:name=".SignFrame"></activity>
        <activity android:name=".MyMenu"></activity>
        <activity android:name=".Detail"></activity>
        <activity android:name=".Browser"></activity>
        <activity android:name=".Login"></activity>
        <activity android:name=".UserDetail"></activity>
        <activity android:name=".AndroidAppActivity"></activity>
    </application>

</manifest>




My Class:


package com.commonsware.andorid;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.acl.Owner;
import java.util.StringTokenizer;

import javax.crypto.BadPaddingException;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract.PhoneLookup;
import android.telephony.SmsMessage;

import android.util.Log;
import android.widget.Toast;

public class SMSBroadcastReceiver extends BroadcastReceiver {




        private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
        private static final String TAG = "SMSBroadcastReceiver";
        RSA rsa;
        DataBaseHelper db;
        @Override
        public void onReceive(Context context, Intent intent) {
            try {
                rsa=new RSA();
            } catch (InvalidKeyException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            } catch (NoSuchAlgorithmException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            } catch (IllegalBlockSizeException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            } catch (NoSuchProviderException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            } catch (BadPaddingException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            } catch (NoSuchPaddingException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            } catch (FileNotFoundException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
             Log.i(TAG, "Intent recieved: " + intent.getAction());

             if (intent.getAction().equals(SMS_RECEIVED)) {
                abortBroadcast();
                    Bundle bundle = intent.getExtras();
                    if (bundle != null) {
                        Object[] pdus = (Object[])bundle.get("pdus");
                        final SmsMessage[] messages = new SmsMessage[pdus.length];
                        for (int i = 0; i < pdus.length; i++) {
                            messages[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
                        }
                        if (messages.length > -1) {
                            abortBroadcast();
                            Toast toast =Toast.makeText(context, messages.toString(), Toast.LENGTH_LONG);
                            String body = messages[0].getMessageBody().toString();
                            String address = messages[0].getOriginatingAddress();
                            System.out.println(address);
                            String decrypted = null;

                            toast.show();
                            Intent i = new Intent(context, Detail.class);
                            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                            context.startActivity(i); 
                            try {
                                decrypted=rsa.decrypt(body.getBytes());

                            } catch (InvalidKeyException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            } catch (IllegalBlockSizeException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            } catch (BadPaddingException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            } catch (NoSuchAlgorithmException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            } catch (NoSuchPaddingException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }

                            Log.i(TAG, "Message recieved: " + messages[0].getMessageBody());
                            if(body.startsWith("<publicKey>")){
                                createContact(messages[0]);

                            }
                            else if(body.startsWith("<secureSmsMessaging>")){
                            createMessage(messages[0]);
                            }
                            messages[0].getMessageBody().replaceAll(body, decrypted);


                        }
                    }
                }

                this.abortBroadcast();
           }
}

I tried to debug it.But it does not enter into my broadcastreceiver .Whenever I send a message Android's default messaging service handles it.What am I doing wrong?

I'm waiting for your answer.Thanks.

Sevil.

Upvotes: 1

Views: 1387

Answers (2)

Sevil
Sevil

Reputation: 31

I solved my problem by using an https server.My problem was converting a string that contains a byte array into byte array during sending the user's public key and encrypted messages.Now I'm using a https server to write my staffs and then read from there.It is now more economic.I recommend everyone to use https server who wants to provide encryption in messaging since you may encounter many problem.

Upvotes: 2

swiftBoy
swiftBoy

Reputation: 35783

i guessing you are going wrong @ onReceive method.

i have created a small app to listen incoming message using Broadcast Receiver.

SMSBroadcastReceiver.java

public class SMSBroadcastReceiver extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub
    Bundle bundle = intent.getExtras();
    SmsMessage[] msgs = null;
    String str = "";
    if(bundle != null){

        Object[] pdus = (Object[]) bundle.get("pdus");
        msgs = new SmsMessage[pdus.length];
        for(int i=0; i<msgs.length;i++){

            msgs[i]= SmsMessage.createFromPdu((byte[])pdus[i]);
            str += "SMS from Phone No: " +msgs[i].getOriginatingAddress();
            str +="\n"+"Message is: ";
            str += msgs[i].getMessageBody().toString();
            str +="\n";
        }

        Log.v("Debug", str);
        Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
    }
}}

AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.rdc"
  android:versionCode="1"
  android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" />

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

<application android:icon="@drawable/icon" android:label="@string/app_name">
    <receiver android:name=".SMSBroadcastReceiver">
        <intent-filter>
            <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
        </intent-filter>
    </receiver>

</application></manifest>

you can check this and implement into your code!!

Upvotes: 2

Related Questions