上一篇
安卓发送短信完整代码
- 行业动态
- 2025-04-22
- 5
需添加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); // 禁用发送按钮 } } } }
注意事项
- 权限管理:Android 6.0+需要动态申请
SEND_SMS
权限,否则会抛出安全异常 - 短信长度限制:单条短信最多70字符(中文按140字节计算),超过会自动分割
- 设备兼容性:需在真机或支持短信功能的模拟器上测试,部分模拟器可能无法发送短信
- 隐私合规:发送短信前应明确告知用户并获得同意,遵守当地法律法规
相关问题与解答
Q1:如果用户拒绝授予短信权限怎么办?
A:应当:
- 在
onRequestPermissionsResult
中检测权限状态 - 当权限被拒绝时,禁用发送按钮并提示用户
- 可提供设置入口引导用户手动开启权限(需谨慎处理,避免被系统判定为过度打扰)
Q2:如何发送包含图片的彩信?
A:标准做法:
- 使用
SmsManager
只能发送普通文本短信 - 发送彩信需使用
MmsManager
(需系统级权限)或集成第三方SDK - 实际开发中通常调用系统默认短信应用进行彩信发送:
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);