新思想

发送短信

通过Android提供的发送短信API来实现。

因为 Android 6.0 改变了它的授权机制,故而程序比以前复杂。

SMS

activity_main.xml布局文件:

<?xml version="1.0" encoding="utf-8"?>
<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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context="com.xiesir.example03sendsms.MainActivity">

    <EditText
        android:id="@+id/etPhone"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入电话号码"
        android:inputType="phone" />

    <EditText
        android:id="@+id/etContent"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:lines="6"
        android:hint="请输入短信内容"
        android:gravity="top" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="发送"
        android:onClick="send"
        android:layout_gravity="center" />
</LinearLayout>

 

MainActivity.java文件:

package com.xiesir.example03sendsms;

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    String phone, content;
    final public static int SEND_SMS = 101;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    // 参考 https://developer.android.com/training/permissions/requesting.html
    // 参考 https://developer.android.com/intl/zh-cn/training/permissions/requesting.html

    public void send(View v) {
        EditText etPhone = (EditText) findViewById(R.id.etPhone);
        EditText etContent = (EditText) findViewById(R.id.etContent);
        phone = etPhone.getText().toString();
        content = etContent.getText().toString();

//        // 适用于 Android 6.0 以前的版本
//        // 获取发送短信API
//        SmsManager sm = SmsManager.getDefault();
//
//        // 将长短信分割成短短信,如果多于 36个中文字符 分条发送
//        ArrayList<String> sms = sm.divideMessage(content);
//        for (String string : sms)
//            // 参数:目标号码,短信中心地址,短信正文,发送状态,对方是否收到状态
//            sm.sendTextMessage(phone, null, string, null, null);
//
//        // 短信发送完毕,通知用户
//        Toast.makeText(getApplicationContext(), R.string.success, Toast.LENGTH_LONG).show();

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {       // Build.VERSION_CODES.M == 23,即 Android 6.0 ,也即 API 23
            // checkSelfPermission() 检查是否有权限
            // 如果用户同意授权,该方法返回PackageManager.PERMISSION_GRANTED(一个值为0的常量)。如果用户拒绝授权,该方法返回PackageManager.PERMISSION_DENIED(一个值为-1的常量)
            int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS);
            // 请求权限
            if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
                // 当应用程序调用requestPermissions(),系统会显示一个标准的对话框(该对话框无法定制)给用户。
                // 当应用程序请求权限,系统向用户提供了一个对话框。当用户响应,系统调用应用程序的onRequestPermissionsResult()方法,并传递相应参数。你可以重写该方法,在该方法中,查看是否请求授权成功。
                ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.SEND_SMS}, SEND_SMS);
                return;
            } else {
                sendSms(phone, content);
            }
        } else {
            sendSms(phone, content);
        }
    }

    public void sendSms(String phoneNo, String content)
    {
        try {
            SmsManager sm = SmsManager.getDefault();

            // 将长短信分割成短短信,如果多于 36个中文字符 分条发送
            ArrayList<String> sms = sm.divideMessage(content);
            for (String string : sms)
                // 参数:目标号码,短信中心地址,短信正文,发送状态,对方是否收到状态
                sm.sendTextMessage(phoneNo, null, string, null, null);

            // 短信发送完毕,通知用户
            Toast.makeText(getApplicationContext(), "短信发送成功", Toast.LENGTH_LONG).show();
        } catch (Exception ex) {
            Toast.makeText(getApplicationContext(), "短信发送失败...", Toast.LENGTH_LONG).show();
            ex.printStackTrace();
        }
    }

    // 当应用程序请求权限,系统向用户提供了一个对话框。当用户响应,系统调用应用程序的onRequestPermissionsResult()方法,并传递相应参数。你可以重写该方法,在该方法中,查看是否请求授权成功。
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case SEND_SMS:
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED)
                    sendSms(phone, content);
                else
                    Toast.makeText(getApplicationContext(), "拒绝发送短信", Toast.LENGTH_SHORT).show();
                break;
            default:
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }

}

 


源程序下载

参考:

Android 6.0 后的新授权机制
https://developer.android.com/training/permissions/requesting.html
https://developer.android.com/intl/zh-cn/training/permissions/requesting.html
http://gold.xitu.io/entry/55e2fa1a00b075a5f29a261c
http://timmy6.github.io/2016/03/15/requestPermission/
http://wuxiaolong.me/2016/02/04/RuntimePermission/

 

posted on 2016-05-02 17:41  新思想  阅读(382)  评论(0)    收藏  举报

导航