android中发送短信很简单,

首先要在Mainfest.xml中加入所需要的权限:

<uses-permission android:name="android.permission.SEND_SMS"></uses-permission>
<uses-permission android:name="android.permission.READ_SMS"></uses-permission>
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>

为了后面测试方便,干脆把SMS的所有权限加上。

方法1:

public class testSms extends Activity {    private void send1(String phone, String message){        PendingIntent pi = PendingIntent.getActivity(this, 0, new Intent(this, testSms.class), 0);        SmsManager sms = SmsManager.getDefault();        sms.sendTextMessage(phone, null, message, pi, null);     }}


方法2:

如果想知道短信发送后的状态,需要两个Receiver来实现

private void send2(String number, String message){    String SENT = "sms_sent";    String DELIVERED = "sms_delivered";        PendingIntent sentPI = PendingIntent.getActivity(this, 0, new Intent(SENT), 0);    PendingIntent deliveredPI = PendingIntent.getActivity(this, 0, new Intent(DELIVERED), 0);        registerReceiver(new BroadcastReceiver(){            @Override            public void onReceive(Context context, Intent intent) {                switch(getResultCode())                {                    case Activity.RESULT_OK:                        Log.i("====>", "Activity.RESULT_OK");                        break;                    case SmsManager.RESULT_ERROR_GENERIC_FAILURE:                        Log.i("====>", "RESULT_ERROR_GENERIC_FAILURE");                        break;                    case SmsManager.RESULT_ERROR_NO_SERVICE:                        Log.i("====>", "RESULT_ERROR_NO_SERVICE");                        break;                    case SmsManager.RESULT_ERROR_NULL_PDU:                        Log.i("====>", "RESULT_ERROR_NULL_PDU");                        break;                    case SmsManager.RESULT_ERROR_RADIO_OFF:                        Log.i("====>", "RESULT_ERROR_RADIO_OFF");                        break;                }            }    }, new IntentFilter(SENT));        registerReceiver(new BroadcastReceiver(){        @Override        public void onReceive(Context context, Intent intent){            switch(getResultCode())            {                case Activity.RESULT_OK:                    Log.i("====>", "RESULT_OK");                    break;                case Activity.RESULT_CANCELED:                    Log.i("=====>", "RESULT_CANCELED");                    break;            }        }    }, new IntentFilter(DELIVERED));            SmsManager smsm = SmsManager.getDefault();        smsm.sendTextMessage(number, null, message, sentPI, deliveredPI);}



方法3:

上面都是发送文本文件,如果想发送一些非文本,比如加密数据,可以用以下方法:

private void send2(String number, String message){    SmsManager smsm = SmsManager.getDefault();    short port = 1000;    PendingIntent pi = PendingIntent.getBroadcast(test.this, 0, new Intent(), 0);    smsm.sendDataMessage(number, null, port, message.getBytes(), pi, null);}


方法4:

调用系统的短信界面,这个方法需要用户自己输入接收方的电话号码

private void send(String message){    Intent sendIntent = new Intent(Intent.ACTION_VIEW);    sendIntent.putExtra("sms_body", message);    sendIntent.setType("vnd.android-dir/mms-sms");}


这个方法自动设置接收方的号码

private void send1(String number, String message){    Uri uri = Uri.parse("smsto:" + number);    Intent sendIntent = new Intent(Intent.ACTION_VIEW, uri);    sendIntent.putExtra("sms_body", message);    startActivity(sendIntent);}


短信的接受,需要实现BroadcastReceiver类,监听系统消息

首先在Mainfest.xml中加入申明,SmsReceiver为实现类

<receiver android:name=".SmsReceiver"> <intent-filter>     <action android:name="android.provider.Telephony.SMS_RECEIVED" /></intent-filter> </receiver>

如果是方法3,使用sendDataMessage时需要加入

<receiver android:name=".SmsReceiver"> <intent-filter>     <action android:name="android.intent.action.DATA_SMS_RECEIVED" />    <data android:scheme="sms" />    <data android:host="localhost" />    <data android:port="1000" /></intent-filter></receiver>

将其中的dat数据注释掉,模拟器上也可以接收到短信; port跟sendDataMessage中的端口值不一致时,也没有问题,太神奇了

public class SmsReceiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        Bundle bundle = intent.getExtras();        SmsMessage[] msgs = null;        String phone;        String message;                        if(bundle != null){            Object[] pdus = (Object[])bundle.get("pdus");            msgs = new SmsMessage[pdus.length];            for(int i = 0; i < msgs.length; i++){                msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);                phone = msgs[i].getOriginatingAddress();                message = msgs[i].getMessageBody();            }        }    }}


如果是sendDataMessage发送:

public class SmsReceiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        Bundle bundle = intent.getExtras();        SmsMessage[] msgs = null;             String phone;             String message;                        if(bundle != null){            Object[] pdus = (Object[])bundle.get("pdus");            msgs = new SmsMessage[pdus.length];            for(int i = 0; i < msgs.length; i++){                msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);                phone = msgs[i].getOriginatingAddress();                byte data[] = SmsMessage.createFromPdu((byte[])pdus[i]).getUserData();                message = new String(data);            }        }    }}


不一样的地方是message的获取时使用getUserData()方法。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/rangq1/archive/2010/08/06/5793953.aspx

更多相关文章

  1. Android(安卓)存储选项之 SQLiteDatabase 创建过程源码分析
  2. Android面试系列文章2018之Android部分Fragment篇
  3. Android图表控件MPAndroidChart——LineChart实现 XY轴、原点线
  4. Android面试系列文章2018之Android部分Fragment篇
  5. android 获取路径目录方法
  6. Android(安卓)对象序列化之你不知道的 Serializable
  7. Android Studio 自动更新失败解决方法
  8. android 获取路径目录方法
  9. android 获取路径目录方法

随机推荐

  1. RelativeLayout 相对布局属性
  2. android实现密码框右侧显示小眼睛
  3. Android之输入银行卡号判断属于哪个银行
  4. Android(安卓)Location在GPS中的应用
  5. Android(安卓)Power Manager分析
  6. js与Android和iOS的webview交互,兼容的写
  7. 【NFC在android中的应用API】
  8. android:screenOrientation属性(设置横屏
  9. GitHub 优秀的 Android(安卓)开源项目
  10. Android(安卓)创建与解析XML(六)—— 比较