当前位置:首页 > 行业动态 > 正文

安卓发送短信完整代码

需添加SEND_SMS权限,使用SmsManager.getDefault().sendTextMessage()方法,配合PendingIntent处理发送状态,注意捕获ActivityNotFoundException异常

安卓发送短信完整实现

核心步骤说明

步骤 说明
配置权限 在AndroidManifest.xml声明SEND_SMS权限
布局设计 创建包含电话号码、短信内容输入框及发送按钮的界面
权限申请 动态申请危险权限(Android 6.0+)
短信发送 使用SmsManager发送文本短信
结果处理 接收发送状态回调

完整代码实现

AndroidManifest配置

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.smssender">
    <uses-permission android:name="android.permission.SEND_SMS" />
    <application
        android:allowBackup="true"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/Theme.SMSDemo">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

活动布局文件(activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">
    <EditText
        android:id="@+id/et_phone"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="收件人号码"
        android:inputType="phone" />
    <EditText
        android:id="@+id/et_content"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:gravity="top"
        android:hint="短信内容" />
    <Button
        android:id="@+id/btn_send"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="发送短信" />
</LinearLayout>

主活动代码(MainActivity.java)

package com.example.smssender;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
public class MainActivity extends AppCompatActivity {
    private static final int SMS_PERMISSION_CODE = 100;
    private EditText etPhone, etContent;
    private Button btnSend;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        etPhone = findViewById(R.id.et_phone);
        etContent = findViewById(R.id.et_content);
        btnSend = findViewById(R.id.btn_send);
        // 检查并申请权限
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS) 
                != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, 
                    new String[]{Manifest.permission.SEND_SMS}, SMS_PERMISSION_CODE);
        }
        btnSend.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sendSMS();
            }
        });
    }
    private void sendSMS() {
        String phone = etPhone.getText().toString().trim();
        String content = etContent.getText().toString().trim();
        if (TextUtils.isEmpty(phone) || TextUtils.isEmpty(content)) {
            Toast.makeText(this, "请填写完整信息", Toast.LENGTH_SHORT).show();
            return;
        }
        SmsManager smsManager = SmsManager.getDefault();
        // 拆分长短信(超过70字符自动分割)
        ArrayList<String> messageList = smsManager.divideMessage(content);
        // 发送多条分割后的短信
        for (String msg : messageList) {
            smsManager.sendTextMessage(phone, null, msg, null, null);
        }
        Toast.makeText(this, "短信发送中...", Toast.LENGTH_SHORT).show();
    }
    // 处理权限申请结果
    @Override
    public void onRequestPermissionsResult(int requestCode, 
                                          @NonNull String[] permissions, 
                                          @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == SMS_PERMISSION_CODE) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(this, "短信权限已授权", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(this, "未获得短信权限,无法发送短信", Toast.LENGTH_LONG).show();
                btnSend.setEnabled(false); // 禁用发送按钮
            }
        }
    }
}

注意事项

  1. 权限管理:Android 6.0+需要动态申请SEND_SMS权限,否则会抛出安全异常
  2. 短信长度限制:单条短信最多70字符(中文按140字节计算),超过会自动分割
  3. 设备兼容性:需在真机或支持短信功能的模拟器上测试,部分模拟器可能无法发送短信
  4. 隐私合规:发送短信前应明确告知用户并获得同意,遵守当地法律法规

相关问题与解答

Q1:如果用户拒绝授予短信权限怎么办?

A:应当:

安卓发送短信完整代码  第1张

  1. onRequestPermissionsResult中检测权限状态
  2. 当权限被拒绝时,禁用发送按钮并提示用户
  3. 可提供设置入口引导用户手动开启权限(需谨慎处理,避免被系统判定为过度打扰)

Q2:如何发送包含图片的彩信?

A:标准做法:

  1. 使用SmsManager只能发送普通文本短信
  2. 发送彩信需使用MmsManager(需系统级权限)或集成第三方SDK
  3. 实际开发中通常调用系统默认短信应用进行彩信发送:
    Intent intent = new Intent(Intent.ACTION_SENDTO);
    intent.setData(Uri.parse("smsto:" + phoneNumber));  // 替换为实际号码
    intent.putExtra("sms_body", messageContent); // 可选文本内容
    intent.putExtra(Intent.EXTRA_STREAM, imageUri); // 附件图片URI
    startActivity(intent);
SMS
0