【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卡的原因?
【Android】Android6.0发送短信Demo的更多相关文章
- android: 接收和发送短信
		8.2 接收和发送短信 收发短信应该是每个手机最基本的功能之一了,即使是许多年前的老手机也都会具备这 项功能,而 Android 作为出色的智能手机操作系统,自然也少不了在这方面的支持.每个 A ... 
- android 几种发送短信的方法
		android中发送短信很简单, 首先要在Mainfest.xml中加入所需要的权限: ? 1 2 3 <uses-permission android:name="android.p ... 
- Android开发之发送短信
		本实例通过SmsManager的sendTextMessage方法实现发送短信关于SmsManager的具体解释大家能够參照:Android开发之SmsManager具体解释 实例执行效果图: 程序代 ... 
- Android 中发送短信
		import android.net.Uri; //调用Android系统API发送短信 Uri uri = Uri.parse("smsto:" + strSmsPhone_va ... 
- MonkeyRunner执行Python脚本实例——发送短信增强版
		很久之前就写好的了,准备写个自动执行Monkey的脚本时才想到去找它,还是写在博客里找起来方便. 这次更新了批处理自动连接设备后执行Py脚本,结构如下图: 其中shotscreen为存放截图文件夹,s ... 
- android发送短信验证码并自动获取验证码填充文本框
		android注册发送短信验证码并自动获取短信,截取数字验证码填充文本框. 一.接入短信平台 首先需要选择短信平台接入,这里使用的是榛子云短信平台(http://smsow.zhenzikj.com) ... 
- android 中调用接口发送短信
		android中可以通过两种方式发送短信 第一:调用系统短信接口直接发送短信:主要代码如下: //直接调用短信接口发短信 SmsManager smsManager = SmsManager.getD ... 
- Android 学习第13课,android 实现发送短信的功能
		1. 界面布局 界面代码: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" ... 
- java攻城师之路(Android篇)--搭建开发环境、拨打电话、发送短信、布局例子
		一.搭建开发环境 1.所需资源 JDK6以上 Eclipse3.6以上 SDK17, 2.3.3 ADT17 2.安装注意事项 不要使用中文路径 如果模拟器默认路径包含中文, 可以设置android_ ... 
随机推荐
- Oracle 12C -- purge dba_recyclebin
			SQL> create user abce identified by abce; User created. SQL> grant resource,connect to abce; G ... 
- 【iOS开发-36】Bundle Identifier的中文字符变成-的问题
			在创建新项目时,Bundle Identifier=Organization Identifier+Product Name.可是它们对中文的识别统一变成短横线 - . 所以在创建多个项目的时候,须要 ... 
- MFC添加自定义窗口消息
			原文链接: http://www.cnblogs.com/smartvessel/archive/2011/07/18/2109472.html 1. 在头文件stdafx.h中增加一个自定义消息宏 ... 
- python 字符串编码 ,区别 utf-8 和utf-8-sig
			Python 读取文件首行多了"\ufeff"字符串 python读取B.txt文件时,控制台打印首行正常,但是若是用首行内容打开文本的话,就会报错: Traceback (mos ... 
- MSSQL2005:“超时时间已到。在操作完成之前超时时间已过或服务器未响应”
			1.今天在整合项目中有这样一个需求,就是要改变以存在表字段的文本的大小,如把char(15)改成varchar(50). 2.此时以存在表已有1885742条数据,在直接下面进行调用 ALTER TA ... 
- 各Spring-Boot-Starters介绍(转)
			原文传送门:Spring Boot application starters ↑传送门里有各Spring-Boot-Starters的依赖pom.xml(一般人我不告诉他) 注意:此为初订版,博主渣翻 ... 
- vs 2017打包安装包(印象深刻)
			Visual Studio Install 打包安装项目2017 以下是具体步骤 一.安装环境 1.下载:链接地址 2.安装vs2017的时候需要安装依赖 .NET framework 4.6 .下载 ... 
- 简单理解MapView 以及 设置  MKAnnotationView
			MKMapView 相当于一个容器 .可以展示 MKAnnotationView.. 要使用它需要设置 数据源代理 _mapView.delegate = self; 它的数据源对象就是 符合 ... 
- c# vs2010 excel 上传oracle数据
			excel 数据表上传到oracle数据库.过程例如以下: 1.打开本地excel文件 2.用OleDb连接excel文件 3.将来excel的数据读取到dataset中 4.把dataset 中数据 ... 
- Android build.gradle
			apply plugin: 'com.android.application' android { /*编译版本 , 因此我们强烈推荐总是使用最新的 SDK 进行编译 targetSdkVersion ... 
