您的位置:首页 > 其它

短信的接收,短信的发送

2016-05-06 19:16 375 查看
发送短信的几种方式:

第一种:直接发送一个隐式意图,访问android中自带的发送短消息

//1发送一个隐式意图用模拟器发送短消息
       Intent intent = new Intent(Intent.ACTION_SENDTO);
       Uri data = Uri.parse("smsto:"+"手机号码");
intent.setData(data);
       intent.putExtra("sms_body", "短信内容");
startActivity(intent);
//2发送一个隐式意图用模拟器的发送短消息
       Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setType("vnd.android-dir/mms-sms");
intent.putExtra("address", "手机号码");
       intent.putExtra("sms_body", "短信内容");
       startActivity(intent);


第二种:用Java代码来实现


Intent intent = new Intent("com.tarena.SENT");
PendingIntent p1 = PendingIntent.getBroadcast(this, 0, intent, 0);
Intent intent2 = new Intent("com.tarena.DELIVERY");
PendingIntent p2 = PendingIntent.getBroadcast(this, 0, intent2, 0);

SmsManager manager = SmsManager.getDefault();
manager.sendTextMessage(
"15555215556",
null,
etSms.getText().toString(),
p1,
p2);


注解:sendTextMessage方法的几个参数分别是:

1)destinationAddress:目标地址

2)scAddress :相当于哪个移动基站的地址,好像是一直没有启用这个参数,所以一般给Null

3)text :发送的短信内容

//发送短信一般是先发送到运营商的基站,如果基站收到了,会用到了第四个参数

//发送一个延迟广播,来发送状态。

4)sentIntent :发送状态:成功收到我发的信息

//发送短信到运营商的基站,在由基站发送到目标地址,如果目标地址收到了,会用到第五个参数,

//发送一个延迟广播,来发送我收到的状态,但是这个广播会不会发送,一般取决于你运营商会不会发

//模拟器上,这个参数是没有用的;

5)deliveryIntent :接收状态:成功接收到我发的信息

注意:利用代码直接发送短信,有两点问题要注意

1)申请权限 SEND_SMS;

2)利用代码发送短信,短信是不会被系统写入数据表;

解决办法:

要插入的具体数据根据自己的需求来决定:

ContentValues values = new ContentValues();
values.put("date", date);
values.put("body", body);
values.put("address", number);
values.put("thread_id", thread_id);
values.put("person", 0);
values.put("type", 2);

context.getContentResolver().insert(Uri.parse("content://sms/sent"), values);


短信接收:

安卓系统后台有一个服务(Service),专门用来接收短消息,当有新的消息到达时,Service会发送一个广播广播的Action是:”android.provider.Telephony.SMS_RECEIVED”。并且将收到短消息作为广播Intent的 一部分(Intent的Extra)发送出去。

短信接收的一个简单的实例:

注册一个广播:

protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
myReciever = new MyReciever();
IntentFilter filter = new IntentFilter();
filter.addAction("android.provider.Telephony.SMS_RECEIVED");
filter.setPriority(1001);
registerReceiver(myReciever, filter);

}


创建一个广播接收者:

public class MyReciever extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
String action = intent.getAction();

("android.provider.Telephony.SMS_RECEIVED".equals(action)) {
Bundle bundle = intent.getExtras();
Object [] pdus = (Object[]) bundle.get("pdus");
StringBuilder builder = new StringBuilder();
String  number = "";
//把拼接pdus数组里面的数据
for (int i = 0; i < pdus.length; i++) {
SmsMessage message = SmsMessage.createFromPdu((byte[]) pdus[i]);
//短信内容
builder.append(message.getDisplayMessageBody());
//电话号码
number = message.getDisplayOriginatingAddress();
}

//拦截短信,不让系统接收到,
abortBroadcast();
}

}

}


解除注册:

@Override
protected void onPause() {
// 解除广播注册
super.onPause();
unregisterReceiver(myReciever);
}


咱们的程序如果想收到短信息:

1)注册广播接收器,接收android.provider.Telephony.SMS_RECEIVED广播

2)必须设定权限 RECEIVE_SMS:

3) 设定较高的优先级 (1000左右)

4)如果不希望系统的短信程序接收短信,就执行abortBroadcast,广播停止下发

问题:如果系统短信接收程序收不到短信了,那么这条短信也不会被写入数据库,自己往数据表中插入就可以了:

Values的值自己来决定:

context.getContentResolver().insert(Uri.parse("content://sms/inbox"), values);


我也是自己找到的办法,有更好的解决方案。还望多多提提意见!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: