Android_短信

Android_短信

1、接受短信

当手机接收到一条短信的时候,系统会发出一条值为android.provider.Telephony.SMS_RECEIVED的广播,这条广播携带者与短信相关的所有数据。结合我们从前学习的BroadcastReceiver相关的知识,我们就可以将这个小实践写出来。
1、activity_main.xml文件中的布局文件代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >
    <LinearLayout 
        android:layout_width="match_parent"
        android:layout_height="50dp">
       <TextView 
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:layout_gravity="center_vertical"
           android:padding="10dp"
           android:text="From"
           /> 
        <TextView 
            android:id="@+id/sender"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            />
    </LinearLayout>

    <LinearLayout 
        android:layout_width="match_parent"
        android:layout_height="50dp">
       <TextView 
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:layout_gravity="center_vertical"
           android:padding="10dp"
           android:text="Content"
           /> 
        <TextView 
            android:id="@+id/content"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            />
    </LinearLayout>
</LinearLayout>

2、在MainActivity中的主要逻辑代码:

public class MainActivity extends Activity {
    private TextView tvSender,tvContent;
    private IntentFilter filter;
    private MessageReceiver receiver;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        filter=new IntentFilter();
        filter.addAction("android.provider.Telephony.SMS_RECEIVED");
        receiver=new MessageReceiver();
        registerReceiver(receiver, filter);
        tvSender=(TextView) findViewById(R.id.sender);
        tvContent=(TextView) findViewById(R.id.content);
    }
    class MessageReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            Bundle bundle =intent.getExtras();
            //提取短信消息
            Object [] pdus =(Object[]) bundle.get("pdus");
            SmsMessage [] messages =new SmsMessage[pdus.length];
            for (int i = 0; i < messages.length; i++) {
                messages[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
            }
            //获取发送方号码
            String address =messages[0].getOriginatingAddress();
            String fullMessage="";
            for (SmsMessage message : messages) {
                //获取短信内容
                fullMessage += message.getMessageBody();
            }
            tvSender.setText(address);
            tvContent.setText(fullMessage);
        }
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(receiver);
    }
}

3、不要忘了读取短信是需要权限的,我们要在AndroidManifest.xml文件中添加以下代码:

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

拦截短信

当我们在我们自己的程序中接收到短信的时候,我们手机屏幕上的状态栏中还会有系统给的通知,这样给用户的体验会非常的查,我们不想把这个短信发给系统,所以我们要拦截短信。系统发出的短信广播是一条有序广播。

1、在动态注册广播的同时,添加一行代码:

filter.setPriority(100);

2、在重写的onReceiver()方法中,当我们把我们的逻辑执行完以后,我们添加一行代码:

abortBroadcast();

这样,我们就可以防止系统的短信应用程序,接收到短信了。

发送短信

我还是在刚刚那个项目之上进行修改,我在activity_main.xml文件中又添加了2行布局。
1、

<LinearLayout 
        android:layout_width="match_parent"
        android:layout_height="50dp">
       <TextView 
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:layout_gravity="center_vertical"
           android:padding="10dp"
           android:text="To:"
           /> 
        <EditText 
            android:id="@+id/to"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:layout_weight="1"
            />
    </LinearLayout>

    <LinearLayout 
        android:layout_width="match_parent"
        android:layout_height="50dp">
       <EditText
           android:id="@+id/msg_input" 
           android:layout_width="0dp"
           android:layout_height="wrap_content"
           android:layout_gravity="center_vertical"
          android:layout_weight="1"
           /> 
        <Button 
            android:id="@+id/send"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:text="Send"
            />
    </LinearLayout>

2、我的MainActivity中的逻辑代码如下:

public class MainActivity extends Activity implements OnClickListener{
    private TextView tvSender,tvContent;
    private IntentFilter filter,sendFilter;
    private MessageReceiver receiver;
    private SendStatusReceiver sendReceiver;
    private EditText etTo,etMsg;
    private Button btnSend;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //动态注册接收短信的广播
        filter=new IntentFilter();
        filter.addAction("android.provider.Telephony.SMS_RECEIVED");
        filter.setPriority(100);
        receiver=new MessageReceiver();
        registerReceiver(receiver, filter);
        //动态注册发送短信的广播
        sendFilter=new IntentFilter();
        sendFilter.addAction("SENT_SMS_ACTION");
        sendReceiver =new SendStatusReceiver();
        registerReceiver(sendReceiver, sendFilter);
        //各个控件的实例化
        tvSender=(TextView) findViewById(R.id.sender);
        tvContent=(TextView) findViewById(R.id.content);
        etTo=(EditText) findViewById(R.id.to);
        etMsg=(EditText) findViewById(R.id.msg_input);
        btnSend=(Button) findViewById(R.id.send);
        btnSend.setOnClickListener(this);
    }
    //发送短信按钮的点击事件
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.send:
            SmsManager manager =SmsManager.getDefault();
            //这里使用PendingIntent的目的就是为了验证短信发送成功了。
            Intent sendIntent=new Intent("SENT_SMS_ACTION");
            PendingIntent pendingIntent=PendingIntent.getBroadcast(MainActivity.this, 0, sendIntent, 0);
            manager.sendTextMessage(etTo.getText().toString(), null, etMsg.getText().toString(), pendingIntent, null);
            break;

        default:
            break;
        }
    }
    /**
     * 接收短信的内部类
     *
     */
    class MessageReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            Bundle bundle =intent.getExtras();
            //提取短信消息
            Object [] pdus =(Object[]) bundle.get("pdus");
            SmsMessage [] messages =new SmsMessage[pdus.length];
            for (int i = 0; i < messages.length; i++) {
                messages[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
            }
            //获取发送方号码
            String address =messages[0].getOriginatingAddress();
            String fullMessage="";
            for (SmsMessage message : messages) {
                //获取短信内容
                fullMessage += message.getMessageBody();
            }
            tvSender.setText(address);
            tvContent.setText(fullMessage);
            abortBroadcast();
        }
    }
    /**
     * 发送短信的内部类
     *
     */
    class SendStatusReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context arg0, Intent arg1) {
            if (getResultCode()==RESULT_OK) {
                Toast.makeText(MainActivity.this, "Send succeeded", Toast.LENGTH_SHORT).show();
            }else {
                Toast.makeText(MainActivity.this, "Send failed", Toast.LENGTH_SHORT).show();
            }
        }

    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        //注销接收短信的receiver
        unregisterReceiver(receiver);
        //注销发送短信的receiver
        unregisterReceiver(sendReceiver);
    }   
}

3、最后,别让了发送短信也是需要权限的:

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

这里我们通过SmsManager的getDefault()方法获取到SmsManager的实例,然后调用sendTextMessage()方法发送短信。根据国际标准,每条短信的长度不得超过160个字符,如果想要发送超出这个长度的短信,则需要将这条短信分割成多条短信来发送。使用SmsManager的sendMultipartTextMessage()方法就可以实现上述的功能。

ArrayList<String> messages=manager.divideMessage(etMsg.getText().toString());
            manager.sendMultipartTextMessage(etTo.getText().toString(), null, messages, null, null);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值