从端口接收短信
receive SMS from a port
我想创建可以从端口接收 SMS
的应用程序!但是当 运行 它时,我的 msg.getMessageBody()
returns 为空。我该如何解决?
manifext.xml
<receiver android:name="data.SMSReceiver" android:enabled="true">
<intent-filter>
<action android:name="android.provider.telephony.SMS_RECEIVED" />
<data android:scheme="sms"
android:host="*"
android:port="4030"/>
</intent-filter>
广播接收器代码
public class SMSReceiver extends BroadcastReceiver {
private static final String SHORTCODE = "+9810004473";
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
Object[] messages = (Object[])bundle.get("pdus");
SmsMessage[] sms = new SmsMessage[messages.length];
for(int n=0; n < messages.length; n++) {
sms[n] = SmsMessage.createFromPdu((byte[]) messages[n]);
}
for(SmsMessage msg : sms) {
if(TextUtils.equals(msg.getOriginatingAddress(), SHORTCODE)) {
Toast.makeText(context, "SMS: " + msg.getMessageBody(), Toast.LENGTH_LONG).show();
}
}
}
}
我的 Toast
节目:SMS: null
您可以将此代码替换为您在 onReceive
:
中的代码
// Get the object of SmsManager
final SmsManager sms = SmsManager.getDefault();
public void onReceive(Context context, Intent intent) {
// Retrieves a map of extended data from the intent.
final Bundle bundle = intent.getExtras();
try {
Bundle bundle = intent.getExtras();
String recMsgString = "";
String fromAddress = "";
SmsMessage recMsg = null;
byte[] data = null;
if (bundle != null)
{
//---retrieve the SMS message received---
Object[] pdus = (Object[]) bundle.get("pdus");
for (int i=0; i<pdus.length; i++){
recMsg = SmsMessage.createFromPdu((byte[])pdus[i]);
try {
data = recMsg.getUserData();
} catch (Exception e){
}
if (data!=null){
for(int index=0; index<data.length; ++index)
{
recMsgString += Character.toString((char)data[index]);
}
}
fromAddress = recMsg.getOriginatingAddress();
}
} catch (Exception e) {
Log.e("SmsReceiver", "Exception smsReceiver" +e);
}
}
好的,如果您之前对消息进行了编码并且现在想对其进行解码,则必须按照以下步骤操作,但如果不是,只需删除整个 onReceive
并替换我的代码。
您在错误的地方解密您的消息,您必须按照我写的确切步骤进行操作。您必须在此处获取消息(在获取 data
之后):
if (data!=null){
for(int index=0; index<data.length; ++index)
{
recMsgString += Character.toString((char)data[index]);
}
}
String decryptedData = Base64.decode(recMsgString ,...)//add this line
在 recMsgString
中获取消息字符串后,您可以使用 Base64
class.
对其进行解密
我想创建可以从端口接收 SMS
的应用程序!但是当 运行 它时,我的 msg.getMessageBody()
returns 为空。我该如何解决?
manifext.xml
<receiver android:name="data.SMSReceiver" android:enabled="true">
<intent-filter>
<action android:name="android.provider.telephony.SMS_RECEIVED" />
<data android:scheme="sms"
android:host="*"
android:port="4030"/>
</intent-filter>
广播接收器代码
public class SMSReceiver extends BroadcastReceiver {
private static final String SHORTCODE = "+9810004473";
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
Object[] messages = (Object[])bundle.get("pdus");
SmsMessage[] sms = new SmsMessage[messages.length];
for(int n=0; n < messages.length; n++) {
sms[n] = SmsMessage.createFromPdu((byte[]) messages[n]);
}
for(SmsMessage msg : sms) {
if(TextUtils.equals(msg.getOriginatingAddress(), SHORTCODE)) {
Toast.makeText(context, "SMS: " + msg.getMessageBody(), Toast.LENGTH_LONG).show();
}
}
}
}
我的 Toast
节目:SMS: null
您可以将此代码替换为您在 onReceive
:
// Get the object of SmsManager
final SmsManager sms = SmsManager.getDefault();
public void onReceive(Context context, Intent intent) {
// Retrieves a map of extended data from the intent.
final Bundle bundle = intent.getExtras();
try {
Bundle bundle = intent.getExtras();
String recMsgString = "";
String fromAddress = "";
SmsMessage recMsg = null;
byte[] data = null;
if (bundle != null)
{
//---retrieve the SMS message received---
Object[] pdus = (Object[]) bundle.get("pdus");
for (int i=0; i<pdus.length; i++){
recMsg = SmsMessage.createFromPdu((byte[])pdus[i]);
try {
data = recMsg.getUserData();
} catch (Exception e){
}
if (data!=null){
for(int index=0; index<data.length; ++index)
{
recMsgString += Character.toString((char)data[index]);
}
}
fromAddress = recMsg.getOriginatingAddress();
}
} catch (Exception e) {
Log.e("SmsReceiver", "Exception smsReceiver" +e);
}
}
好的,如果您之前对消息进行了编码并且现在想对其进行解码,则必须按照以下步骤操作,但如果不是,只需删除整个 onReceive
并替换我的代码。
您在错误的地方解密您的消息,您必须按照我写的确切步骤进行操作。您必须在此处获取消息(在获取 data
之后):
if (data!=null){
for(int index=0; index<data.length; ++index)
{
recMsgString += Character.toString((char)data[index]);
}
}
String decryptedData = Base64.decode(recMsgString ,...)//add this line
在 recMsgString
中获取消息字符串后,您可以使用 Base64
class.