您的位置:首页 > 移动开发 > Android开发

Android中发送短信的几种常见写法及注意事项

2016-05-12 18:39 381 查看
在Android中常见的发送短信的方式有以下两种:1.利用系统的短信发送程序发送短信这里面又可以分为两种写法:1.1 利用Intent发送一个隐式意图
Intent intent = new Intent(Intent.ACTION_SENDTO);
Uri data = Uri.parse("smsto:"+ "15555215556");
intent.setData(data);
intent.putExtra("sms_body", etContent.getText().toString());
startActivity(intent);
1.2	另外一种隐式意图
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setType("vnd.android-dir/mms-sms");
intent.putExtra("address", "15555215556");
intent.putExtra("sms_body",  etContent.getText().toString());
startActivity(intent);
2.利用代码来发送短消息
2.1 简单一些的写法
SmsManager manager = SmsManager.getDefault();
manager.sendTextMessage(对方手机号码,null,短信正文,null,null);
2.2 添加上两个PendingIntent,可以获得短信的发送状态。
MainActivity完整代码如下:
package xxxx.Messagedemo;import android.app.Activity;import android.app.PendingIntent;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.os.Bundle;import android.telephony.SmsManager;import android.telephony.SmsMessage;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;public class MainActivity extends Activity {EditText etContent;Button btnSend;MyReceiver receiver;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);                etContent=(EditText) findViewById(R.id.etContent);        btnSend=(Button) findViewById(R.id.btnSend);        btnSend.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {sendSMS();}});            }   /* public void onClick(View v){    	sendSMS();    }*/    @Override    protected void onResume() {    	super.onResume();    	receiver=new MyReceiver();    	IntentFilter filter=new IntentFilter();    	filter.addAction("terena.SENT");    	filter.addAction("tarena.DELIVERY");    	filter.addAction("android.provider.Telephony.SMS_RECEIVED");    	filter.setPriority(1001);       	registerReceiver(receiver, filter);    }    @Override    protected void onPause() {    	unregisterReceiver(receiver);    	super.onPause();    }private void sendSMS() {//1.发送隐式意图发送短信/*Intent intent=new Intent(Intent.ACTION_SENDTO);Uri data=Uri.parse("smsto:"+15555215556);intent.setData(data);intent.putExtra("sms_body", etContent.getText().toString());startActivity(intent);*//*Intent intent=new Intent(Intent.ACTION_VIEW);intent.setType("vnd.android-dir/mms-sms");intent.putExtra("address", "15555215556");intent.putExtra("sms_body", etContent.getText().toString());startActivity(intent);*///2.利用代码发送短信SmsManager manager=SmsManager.getDefault();Intent intent=new Intent("terena.SENT");PendingIntent pi1=PendingIntent.getBroadcast(this, 0, intent, 0);Intent intent2=new Intent("tarena.DELIVERY");PendingIntent pi2=PendingIntent.getBroadcast(this, 0, intent2, 0);manager.sendTextMessage("15555215556", null, etContent.getText().toString(), pi1, pi2);}public class MyReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent) {String action=intent.getAction();if("terena.SENT".equals(action)){Log.d("TAG", "发送成功"+System.currentTimeMillis());}if("tarena.DELIVERY".equals(action)){Log.d("TAG", "对方已收到短信"+System.currentTimeMillis());}if("android.provider.Telephony.SMS_RECEIVED".equals(action)){//处理短信Bundle bundle=intent.getExtras();Object[] pdus=(Object[]) bundle.get("pdus");StringBuffer sb=new StringBuffer();String number="";//把一个个pdus转为一段段的短消息for(int i=0;i<pdus.length;i++){SmsMessage message=SmsMessage.createFromPdu((byte[])pdus[i]);sb.append(message.getDisplayMessageBody());number=message.getDisplayOriginatingAddress();}Log.d("TAG", "发送方电话:"+number+",发送的内容是:"+sb.toString());//"有短息"这条广播不再继续下发abortBroadcast();}}}    }
利用代码发送短信,有两点问题要注意:1)申请权限 SEND_SMS2) 利用代码发送短信,短信是不会被系统写入数据表短信的接收安卓系统后台有一个服务(Service),专门用来接收短消息。当有新的消息达到时,Service会发送一个广播,广播的Action是“android.provider.Telephony.SMS_RECEIVED”并且将收到短消息作为广播Intent的一部分(Intent的Extra)发送出去。先到先得!
自己编写的程序如果想收到短信息,需要注意以下几点:1)注册广播接收器,接收android.provider.Telephony.SMS_RECEIVED广播2)必须设定权限 RECEIVE_SMS3) 设定较高的优先级 (1000左右)4)如果不希望系统的短信程序接收短信,就执行abortBroadcast,广播停止下发同时也会有一个问题:如果系统短信接收程序收不到短信了,那么这条短信也不会被写入数据库,在本地是查询不到记录的,不利于我们日后查询相关信息,切记,小心使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  短信 android