Android应用发送短信的实现

来源:互联网 发布:淘宝规则在哪里查看 编辑:程序博客网 时间:2024/05/20 02:56

实现Android应用的发送消息


实现两个安卓机之间发送短消息:
新建一个Android项目:
在MainActivity中添加一个EditText,id=et_content,用来输入想要发送的短信内容
然后添加一个Button按钮,it=btn_send,点击后发送短消息
然后在MainActivity.java中添加如下代码:

    EditText etContent; //声明输入框    Button btnSend; //声明发送按钮    private MyReciver receiver;//声明一个广播接收器    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        etContent=(EditText) findViewById(R.id.et_content);        btnSend=(Button) findViewById(R.id.bt_send);        //在发送按钮上添加一个监听器,点击发送后会执行onClick方法        btnSend.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {            //在onClick方法中执行SendSms()方法                sendSMS();            }        });    }    protected void sendSMS() {//通过隐式发送intent实现----------------        //启动系统自带的action:ACTION_SENDTO        Intent intent = new Intent(Intent.ACTION_SENDTO);        //发送给号码为15555215554的设备        Uri data = Uri.parse("smsto:"+15555215554);        intent.setData(data);        //"sms_body"是指系统数据表sms中的body字段,存放的是短信内容        intent.putExtra("sms_body", etContent.getText().toString());        startActivity(intent);//另外一种通过发送隐式intent的方式来实现------------------------        Intent intent = new Intent(Intent.ACTION_VIEW);        intent.setType("vnd.android-dir/mms-sms");        //address为数据表中存放电话号码的字段        intent.putExtra("address", "15555215554");        intent.putExtra("sms_body", etContent.getText().toString());        startActivity(intent);        //以上两种方法,除了电话号码外其他都为固定用法,记住就好//利用代码发送短信, 但是短信不会被写入系统数据表--------------------------//利用代码发送短信,首先要在AndroidMainFest.xml添加接收和发送权限<uses-permission android:name="android.permission.SEND_SMS"/><uses-permission android:name="android.permission.RECEIVE_SMS"/>        //构建一个SMSManager,用来发送短信        SmsManager manager = SmsManager.getDefault();        //自定一两个intent,发送两个隐式意图,这两个隐式意图自己定义        Intent intent1 =  new Intent("com.example.SENT");;        Intent intent2 = new Intent("com.example.DELIVERY");        //延迟意图 sendTextMessage()方法后边两个参数pi1和pi2        为pendingIntent 延迟意图这两个延迟意图用来查看短信是否        发出和接收pi1在发送者发送信息送达基站时,会调用,标志着短信        已经发出pi2是从基站送达接收者手机时会被调用,标志着短信已        经由接收者接收,因为发送出去的信息不一定会被接收到,所以pi2        不一定会被调用,这里的pi1和pi2通过广播的方式,通知短信发送的        相关信息        PendingIntent pi1 = PendingIntent.getBroadcast(this, 0, intent1 , 0);//延迟意图        PendingIntent pi2 = PendingIntent.getBroadcast(this, 0, intent2 , 0);        //发送短信        manager.sendTextMessage("15555215556",                 null,                 etContent.getText().toString(),                 pi1,                 pi2);    }    //onREsume()方法是Activity运行过程中与用户交互时执行的方    法,一般可以再次方法中注册broadcastReceiver    @Override    protected void onResume() {         // TODO Auto-generated method stub        super.onResume();        //创建一个自定义的receiver        receiver = new MyReciver();        //创建意图过滤器,并把刚才定义的Action添加上,表示只接收        这些action发送的广播        IntentFilter filter = new IntentFilter();        filter.addAction("com.example.SENT");        filter.addAction("com.example.DELIVERY");        //安卓系统后台有一个服务(Service),专门用来接收短消        息。当有新的消息达到时,它会发送一个广播,广播的        Action是“android.provider.Telephony.SMS_RECEIV        ED”并且将收到短消息作为广播Intent的一部分(Intent        的Extra)发送出去。权限高的先得到        filter.addAction("android.provider.Telephony.        SMS_RECEIVED");        //在这里给filter添加一个最高权限;        filter.setPriority(Integer.MAX_VALUE);        //注册receiver        registerReceiver(receiver, filter);    }    @Override    protected void onPause() {        // TODO Auto-generated method stub        super.onPause();        //注销注册        unregisterReceiver(receiver);    }    //既然发送了广播就要有一个广播接收者,自定义一个广播接收者,自定    义一个类MyReceiver继承BroadcastReceiver    public class MyReciver extends BroadcastReceiver{        @Override        public void onReceive(Context context, Intent intent) {            String action = intent.getAction();            //既然发送了广播就要有一个广播接收者,自定义一个广            播接收者            if("com.example.SENT".equals(action)){                Log.d("TAG", "短信发送成功"+System.currentTimeMillis());            }            //如果intent的action是com.example.SENT,表示pi1            被调用,即短信已经送达基站            else if("com.example.DELIVERY".equals(action)){                Log.i("TAG", "对方已经收到短信"+System.currentTimeMillis());            }    //如果intent的action是android.provider.Telephony.SMS_R    ECEIVED,这时我们就可以开始处理短信内容了    if("android.provider.Telephony.SMS_RECEIVED".equals(action)){                //处理消息,StringBuilder 对象用来存放短信信息                //String number 用来存放电话号码                Bundle bundle = intent.getExtras();                Object[] pdus = (Object[]) bundle.get("pdus");                StringBuilder sb = new StringBuilder();                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);            }        }    }
0 0