Android6.0下的短信接收与发送功能的实现

   最近学习了android6.0下的短信功能,发现《第一行代码》一书中的实现代码中使用的createFromPdu(byte[] pdu)函数,在API23中已经被弃用,取而代之的是createFromPdu(byte[] pdu, String format)(查看)。看起来区别不大,但是为了找这个format参数的使用方法,还是费了挺大功夫的。接下来介绍具体用法。

  当我们需要使用createFromPdu函数时,其中的format参数可以使用以下方法赋值:

    String format = intent.getStringExtra("format");


下面是完整代码(已通过测试,已上传github)

MainActivity.java:

package com.example.administrator.smstest;

import android.Manifest;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.telephony.SmsManager;
import android.telephony.SmsMessage;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    private TextView sender;
    private TextView content;
    private IntentFilter receiveFilter;
    private MessageReceiver messageReceiver;
    private EditText to;
    private EditText msgInput;
    private Button send;
    final private int REQUEST_CODE_ASK_PERMISSIONS = 123;
    private static final String TAG = "MainActivity";
    //测试github
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        sender = (TextView) findViewById(R.id.sender);
        content = (TextView) findViewById(R.id.content);
        to = (EditText) findViewById(R.id.to);
        msgInput = (EditText) findViewById(R.id.msg_input);
        //发送短信
        send = (Button) findViewById(R.id.send);
        send.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                SmsManager smsManager = SmsManager.getDefault();
                smsManager.sendTextMessage(to.getText().toString(),null,msgInput.getText().toString(),null,null);
                to.setText("");
                msgInput.setText("");
            }
        });
        //查询权限,包含了接收短信
        queryAuthority();
        //监控短信发送状态的监听器

    }

    protected void onDestroy(){
        super.onDestroy();
        //取消注册
        unregisterReceiver(messageReceiver);
    }

    //查询权限
    private void queryAuthority() {
        int hasReadContactsPermission = 0;
        //Android Marshmallow
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            hasReadContactsPermission = checkSelfPermission(Manifest.permission.RECEIVE_SMS);
        }

        if (hasReadContactsPermission != PackageManager.PERMISSION_GRANTED) {

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
//                请求授权对话框
                requestPermissions(new String[] {Manifest.permission.RECEIVE_SMS},
                        REQUEST_CODE_ASK_PERMISSIONS);
            }
            return;
        }
        //执行查询操作
        registerReceiver();
    }
    //为短信监听器注册(动态)
    public void registerReceiver(){
        receiveFilter = new IntentFilter();
        receiveFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
        messageReceiver = new MessageReceiver();
        registerReceiver(messageReceiver,receiveFilter);
    }

    //回调函数,不论用户在授权对话框同意还是拒绝,activity的onRequestPermissionsResult会被回调来通知结果(通过第三个参数)
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case REQUEST_CODE_ASK_PERMISSIONS:
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // Permission Granted
                    //git  test >>>>>>>>>>>>>>>>>
                    queryAuthority();
                } else {
                    // Permission Denied
                    Toast.makeText(MainActivity.this, "READ_MESSAGE Denied", Toast.LENGTH_SHORT).show();
                }
                break;
            default:
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }

//监听收到的短信
    class MessageReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            Bundle bundle = intent.getExtras();
            Object []pdus = (Object[]) bundle.get("pdus");
            String format = intent.getStringExtra("format");
            SmsMessage[]messages = new SmsMessage[pdus.length];
            Log.d(TAG, "onReceive format is "+format+" !!!!!! ");
            for(int i=0;i

activity_main.xml




    



    

你可能感兴趣的:(android,studio)