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,广播停止下发同时也会有一个问题:如果系统短信接收程序收不到短信了,那么这条短信也不会被写入数据库,在本地是查询不到记录的,不利于我们日后查询相关信息,切记,小心使用。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories