SEND_SMS
权限,Android 6.0+需动态申请,涉及隐私操作需谨慎处理,避免滥用 权限在安卓应用中发送短信需要以下权限:
权限名称 | 作用 | 适用场景 |
---|---|---|
SEND_SMS | 允许应用发送短信 | 发送短信时必须声明 |
READ_PHONE_STATE | 读取手机状态(可选) | 部分设备可能需要 |
RECEIVE_SMS (可选) | 接收短信(若需监听) | 广播接收器场景 |
注意:
SEND_SMS
是危险权限,需在运行时动态申请。AndroidManifest.xml
)中仍需声明权限,但仅声明不会自动授权。<manifest> <uses-permission android:name="android.permission.SEND_SMS" /> <!-可选权限 --> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> </manifest>
// 检查是否已授予权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) { // 请求权限 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.SEND_SMS}, REQUEST_SEND_SMS_CODE); } else { // 已有权限,直接发送短信 sendSMS("123456789", "Test message"); } // 处理权限请求结果 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == REQUEST_SEND_SMS_CODE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 权限被授予,发送短信 sendSMS("123456789", "Test message"); } else { // 权限被拒绝,提示用户 Toast.makeText(this, "无发送短信权限", Toast.LENGTH_SHORT).show(); } } }
private void sendSMS(String phoneNumber, String message) { // 创建短信管理器 SmsManager smsManager = SmsManager.getDefault(); // 拆分长短信(可选) ArrayList<String> messageParts = smsManager.divideMessage(message); // 发送短信(需处理回调) smsManager.sendMultipartTextMessage(phoneNumber, null, messageParts, null, null); }
SecurityException
。解答:
可通过 PendingIntent
获取发送状态。
// 创建用于接收状态的 PendingIntent PendingIntent sentIntent = PendingIntent.getBroadcast(this, 0, new Intent("SMS_SENT_ACTION"), PendingIntent.FLAG_UPDATE_CURRENT); // 注册广播接收器 registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if ("SMS_SENT_ACTION".equals(intent.getAction())) { switch (getResultCode()) { case Activity.RESULT_OK: Toast.makeText(context, "短信发送成功", Toast.LENGTH_SHORT).show(); break; default: Toast.makeText(context, "短信发送失败", Toast.LENGTH_SHORT).show(); break; } } } }, new IntentFilter("SMS_SENT_ACTION")); // 发送短信时传入 sentIntent smsManager.sendTextMessage(phoneNumber, null, message, sentIntent, null);
SEND_SMS
权限,如何处理?解答:
应提供友好的提示,并禁用相关功能。
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == REQUEST_SEND_SMS_CODE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 权限授予,启用发送按钮 sendButton.setEnabled(true); } else { // 权限拒绝,提示并禁用功能 Toast.makeText(this, "需要短信权限才能发送", Toast.LENGTH_SHORT).show(); sendButton.setEnabled(false); } } }