整理一下使用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 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卡的原因?

更多相关文章

  1. JavaCV & Android
  2. Android的权限机制之—— “沙箱”机制sharedUserId跟签名
  3. 通俗易懂的Android(安卓)root 原理
  4. (Android集成支付宝支付)react-native实现支付宝支付
  5. Android(安卓)Manifest.permission权限
  6. Android我还可以相信你多少系列文章四之悬浮窗
  7. Android数据库ORMlite框架翻译系列(第一章)
  8. Android开发手记一 NDK编程实例
  9. Android(安卓)系统下模拟触点击的功能与权限

随机推荐

  1. 如何在IDEA中使用Hibernate框架
  2. Web页面或URL转换为PDF的在线工具
  3. 实例演示flex容器中的四个属性的功能,参数
  4. C语言基础知识点有哪些(最全大总结)
  5. SQL Server简单恢复模型
  6. NAO机器人opencv版本问题解决
  7. 93%企业使用多云环境!企业数据安全当如何
  8. NAO机器人py文件植入
  9. 数据安全也要加把“保护锁”
  10. 为什么要学习Take Command?