zoukankan      html  css  js  c++  java
  • 【Android】Android6.0发送短信Demo

    整理一下使用SmsManager类发送短信的方法。
    https://developer.android.com/reference/android/telephony/SmsManager.html

    SmsManager类的描述如下图:
    这里写图片描述

    使用的关键方法是sendTextMessage()发短信。
    https://developer.android.com/reference/android/telephony/SmsManager.html#sendTextMessage(java.lang.String,%20java.lang.String,%20java.lang.String,%20android.app.PendingIntent,%20android.app.PendingIntent)
    该方法的使用说明如下图:
    这里写图片描述


    根据以上资料,结合Andriod6.0的运行时权限,发短信Demo如下:

    public class MainActivity extends AppCompatActivity {
    
        private static final int MY_PERMISSIONS_REQUEST_SEND_SMS = 1;
        private EditText et_number;
        private EditText et_content;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            // 获取控件
            et_number = (EditText) findViewById(R.id.et_number);
            et_content = (EditText) findViewById(R.id.et_content);
        }
    
        // 在XML中指定的按钮回调方法
        public void Send(View v){
            // 检查是否获得了权限(Android6.0运行时权限)
            if (ContextCompat.checkSelfPermission(this,
                    Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED){
                // 没有获得授权,申请授权
                if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                        Manifest.permission.SEND_SMS)) {
                    // 返回值:
    //                     如果app之前请求过该权限,被用户拒绝, 这个方法就会返回true.
    //                     如果用户之前拒绝权限的时候勾选了对话框中”Don’t ask again”的选项,那么这个方法会返回false.
    //                     如果设备策略禁止应用拥有这条权限, 这个方法也返回false.
                    // 弹窗需要解释为何需要该权限,再次请求授权
                    Toast.makeText(this, "请授权!", Toast.LENGTH_LONG).show();
    
                    // 帮跳转到该应用的设置界面,让用户手动授权
                    Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                    Uri uri = Uri.fromParts("package", getPackageName(), null);
                    intent.setData(uri);
                    startActivity(intent);
                }else{
                    // 不需要解释为何需要该权限,直接请求授权
                    ActivityCompat.requestPermissions(MainActivity.this,
                            new String[]{Manifest.permission.SEND_SMS},
                            MY_PERMISSIONS_REQUEST_SEND_SMS);
                }
            }else {
                // 已经获得授权,可以发短信
                SendSms();
            }
        }
    
        private void SendSms() {
            // 获取数据内容
            String number = et_number.getText().toString();
            String content = et_content.getText().toString();
            // 为空判断
            if (TextUtils.isEmpty(number)||TextUtils.isEmpty(content)) {
                // 提醒用户
                Toast.makeText(this, "号码或内容不能为空!", Toast.LENGTH_SHORT).show();
            } else {
                // 使用SmsManager类
                SmsManager smsManager = SmsManager.getDefault();
                // 短信内容可能很长,需要分发
                ArrayList<String> parts = smsManager.divideMessage(content);
                // 发送短信,需要权限
    //          smsManager.sendMultipartTextMessage(number, null, parts, null, null);
                for(String text : parts) {
                    smsManager.sendTextMessage(number, null, text, null, null);
                }
                 // 发送完成后弹窗提示
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setMessage("已发送!")
                        .setNegativeButton("好!", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            // 关闭当前弹窗
                            dialog.dismiss();
                        }
                    });
                AlertDialog dialog = builder.show();
            }
        }
    
        // 处理权限申请的回调
        @Override
        public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
            switch (requestCode){
                case MY_PERMISSIONS_REQUEST_SEND_SMS: {
                    if (grantResults.length > 0
                            && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                        // 授权成功,继续发短信
                        SendSms();
                    } else {
                        // 授权失败!
                        Toast.makeText(this, "授权失败!", Toast.LENGTH_LONG).show();
                    }
                    break;
                }
            }
    
        }
    
    }

    要点小结:

    • 使用SmsManager类发送短信。
    • 使用SmsManager.getDefault()来获得SmsManager类实例。
    • 短信内容过长时,需要使用divideMessage()方法来分割。
    • 号码和短信内容需要加上为空判断,否则报错非法参数异常。
    • 【重要】只在真机上可行,也许是模拟器没有SIM卡的原因?
  • 相关阅读:
    面向对象三大特性:封装,继承,多态(三、多态的进一步讲解)
    面向对象三大特性:封装,继承,多态(二、多态)
    面向对象三大特性:封装,继承,多态(一,封装和继承)
    zookeeper+dubbo+demo
    Eclipse常见版本和JDK常用版本对应关系
    Navicat 连接MySQL 8.0.11 出现2059错误
    Neo4j elk Elasticsearch kibana kettle
    jvm垃圾回收机制GC
    jvm 这我就能会了 擦
    spring的4种事务特性,4种隔离级别,7种传播行为
  • 原文地址:https://www.cnblogs.com/guxin/p/android-how-to-send-sms.html
Copyright © 2011-2022 走看看