Android调系统发送短信使用的是SmsManager,一条短信的字数有一个最大长度限制,如果超过的话就需要拆分。
SmsManager为我们提供的方法有:
SmsManager.getDefault()静态方法获取SmsManager的默认实例对象;
SmsManager.divideMessage(content)发送内容大于70时自动拆分;
SmsManager.sendTextMessage(destinationAddress, scAddress, text, sentIntent, deliveryIntent)发送一条短信;
SmsManager.sendMultipartTextMessage(destinationAddress, scAddress, parts, sentIntents, deliveryIntents)发送多条短信,一般与sms.divideMessage(content)同时使用;
一般情况使用上述方法就足够了,发送多条时接收方接收到的是多条短信成一条短信的形式,其实发送方是发送出去了多条。
下边说一下参数,发一条和发多条都是需要5个参数,前两个相同:destinationAddress表示目的地址正常也就是接收方号码;scAddress服务中心地址,一般置为null表示使用默认。
后边三个参数对比着说:
text:表示发送一条短信的内容;
parts:表示ArrayList<String> parts,是一个短信列表,里边是拆分的多条短信;
sentIntent:表示发送方发送消息成功或失败的广播,如果不需要可以置null;
sentIntents:表示ArrayList<PendingIntent> sentIntents,sentIntent的列表集合;
deliveryIntent;接收方接收消息成功或失败的广播,一般置null;
deliveryIntents:表示ArrayList<PendingIntent> deliveryIntents,deliveryIntent的列表集合,也是一般置null。
发送一条或多条短信的方法都需要PendingIntent,那么这个东西到底是什么呢?
获取PendingIntent 对象的方法有多种,这里只介绍发送短信所需要的一种,
可以通过getBroadcast(Context context, int requestCode, Intent intent, int flags)方法从系统取得一个用于向BroadcastReceiver发送广播的PendingIntent对象
这样我们就可以通过BroadcastReceiver来获取发送结果给与用户提示和进行下一步操作。
requestCode一般置为0 就可以;
intent就是你注册发送广播的意图;
flags有多个常量这里列出来几个比较会用到的:
FLAG_CANCEL_CURRENT:如果当前系统中已经存在一个相同的PendingIntent对象,那么就将先将已有的PendingIntent取消,然后重新生成一个PendingIntent对象。
FLAG_NO_CREATE:如果当前系统中不存在相同的PendingIntent对象,系统将不会创建该PendingIntent对象而是直接返回null。
FLAG_ONE_SHOT:该PendingIntent只作用一次。在该PendingIntent对象通过send()方法触发过后,PendingIntent将自动调用cancel()进行销毁,那么如果你再调用send()方法的话,系统将会返回一个SendIntentException。
FLAG_UPDATE_CURRENT:如果系统中有一个和你描述的PendingIntent对等的PendingInent,那么系统将使用该PendingIntent对象,但是会使用新的Intent来更新之前PendingIntent中的Intent对象数据,例如更新Intent中的Extras。
这样需要的所有方法和参数基本介绍完了,下边代码贴上:
首先注册广播
public static final String SENT_SMS_ACTION = "SENT_SMS_ACTION"; private SMSSendResultReceiver mSMSReceiver = new SMSSendResultReceiver(); private IntentFilter mSMSResultFilter = new IntentFilter(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.aboutour_recommend_to_friend); content = getIntent().getStringExtra("content"); //注册广播 mSMSResultFilter.addAction(SENT_SMS_ACTION); registerReceiver(mSMSReceiver, mSMSResultFilter); init(); Config.setContext(this.getApplicationContext()); } private ReminderDialog reminderDialog = null; class SMSSendResultReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub switch (getResultCode()) { case Activity.RESULT_OK: if (reminderDialog == null) { reminderDialog = new ReminderDialog(RecommendToFriendActivity.this); reminderDialog.setCancelable(false); reminderDialog.setMessage("短信发送成功"); reminderDialog.getEnterButton().setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { reminderDialog.dismiss(); Intent intent = new Intent(RecommendToFriendActivity.this, MainActivity.class); startActivity(intent); } }); reminderDialog.show(); } break; default: ToastManager.makeText(RecommendToFriendActivity.this, "短信发送失败!"); break; } } }
SmsManager sms = SmsManager.getDefault(); Intent sentIntent = new Intent(SENT_SMS_ACTION); PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, sentIntent, 0); //发送两条 // String[] texts = content.split("http"); // String text = ""; // for (int i = 0; i < texts.length; i++) { // text = texts[i]; // if (i == 1) { // sms.sendTextMessage(telephone, null, "http" + text, sentPI, null); // } else { // sms.sendTextMessage(telephone, null, text, sentPI, null); // } // } //发送一条 if (content.length() > 70) { ArrayList msgs = sms.divideMessage(content); ArrayList sentIntents = new ArrayList(); for(int i = 0;i