Reputation: 31
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
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
Reputation: 35783
i guessing you are going wrong @ onReceive method.
i have created a small app to listen incoming message using Broadcast Receiver.
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();
}
}}
<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