2018-05-21
可以利用SmsManager中的api实现
有一组常量负责表示发送的状态:RESULT_ERROR_GENERIC_FAILURE ,RESULT_ERROR_NO_SERVICE 等
然后用如下代码就可以简单的实现:
public void sendSMS(){
Log.d("SendMessage","Start in "+SendMessage.class.getName());
Date d = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SmsManager smsManager = SmsManager.getDefault();
ArrayList<String> list = smsManager.divideMessage("this is 5554 at "+sdf.format(d));
for (String text:list) {
smsManager.sendTextMessage("5556", null, text, null, null);
}
Log.d("SendMessage","Complete in "+SendMessage.class.getName());
}
最后,别忘了在manifest里面加上发送短信的权限,运行app即可完成
<uses-permission android:name="android.permission.SEND_SMS"/>
安卓中,接收短信的处理是利用安卓中的BroadcastReceiver机制来实现的,当系统收到一条短信之后,会发送一个广播,实现了BroadcastReceiver的处理类就会接收到这个广播,并在OnReceive函数里进行处理,判断当前广播所携带intent的action是android.provider.Telephony.SMS_RECEIVED时,则说明是对收到短信的情况进行处理
具体代码如下:
public class SmsReceiver extends BroadcastReceiver {
private static final String TAG = "SmsReceiver";
private String content = "test";
public static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Log.d(TAG,"action: "+action);
if (SMS_RECEIVED_ACTION.equals(action)) {
Bundle bundle = intent.getExtras();
StringBuffer messageContent = new StringBuffer();
if (bundle != null) {
Object[] pdus = (Object[])bundle.get("pdus");
SmsMessage[] msg = new SmsMessage[pdus.length];
// 获取短信内容
for(int i = 0 ;i<pdus.length;i++){
msg[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
}
for(SmsMessage curMsg:msg){
String body = curMsg.getMessageBody();
messageContent.append("You got the message From:【");
messageContent.append(curMsg.getDisplayOriginatingAddress());
messageContent.append("】Content:");
messageContent.append(body);
Data data = new Data();
if(body.contains("yyf") && content.contains("test")){
// 不同情况的处理
}
}
}
}
}
}
实现完之后我们需要验证我们的实现是否正确,这个时候我发现adb提供的服务中并没有发送短信的服务,于是查了很多之后发现,可以使用telnet的方法实现发送短信
> telnet local 5554
> auth <可能需要生成的验证码emulator_console_auth_token>
> sms send <手机号> <短信信息>
这样就可以在模拟器中收到短信了,但是后来在研究接收短信的原理之后觉得其本质是一个接收一个广播的过程,所以不知道通过adb执行一个广播的方式能不能实现发送短信的功能,还需要进一步的验证