You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio开发SOS应用:配置短信权限后6.0+版本仍无法发送短信

解决Android 6.0+无法发送SOS短信的问题

嘿,作为Android开发新手碰到这种跨版本权限兼容问题真的很常见,我来帮你一步步排查解决!

1. 先确认权限申请的完整流程

你提到加了checkSelfPermission的检查,但很可能漏掉了主动请求用户授权的关键步骤。Android 6.0+把短信权限归为「危险权限」,光在清单里声明还不够,必须在代码里主动向用户申请:

  • 第一步:先在AndroidManifest.xml里补全权限声明(别漏了位置权限,毕竟要发位置信息):
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  • 第二步:检查权限后,若未授权就发起请求:
// 检查短信权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) {
    // 没权限就弹框请求用户授权
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.SEND_SMS}, 100);
} else {
    // 权限已拿到,直接执行发送逻辑
    sendSosWithLocation();
}
  • 第三步:一定要处理权限请求的结果,重写onRequestPermissionsResult方法:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == 100) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // 用户同意了权限,赶紧发送SOS短信
            sendSosWithLocation();
        } else {
            // 用户拒绝了,得提示一下权限的重要性
            Toast.makeText(this, "没有短信权限的话,没法发送SOS紧急消息哦", Toast.LENGTH_SHORT).show();
        }
    }
}

2. 检查短信发送的代码逻辑是否正确

权限搞定后,看看发送短信的代码有没有问题。推荐用SmsManager直接发送,而不是跳转到系统短信应用,这样更符合SOS应用的后台发送需求:

private void sendSosWithLocation() {
    String emergencyContact = "13XXXXXXXXX"; // 替换成你的紧急联系人号码
    // 这里要确保已经成功获取到位置信息,比如用LocationManager或FusedLocationProviderClient
    String locationContent = "紧急求助!我的位置:纬度" + latitude + ",经度" + longitude;
    
    SmsManager smsManager = SmsManager.getDefault();
    // 短信内容过长的话,自动拆分发送
    ArrayList<String> smsParts = smsManager.divideMessage(locationContent);
    for (String part : smsParts) {
        smsManager.sendTextMessage(emergencyContact, null, part, null, null);
    }
    
    Toast.makeText(this, "SOS短信已发送!", Toast.LENGTH_SHORT).show();
}

这里要注意两个点:

  • 紧急联系人号码格式要正确,最好带上国家区号(比如+86),避免发送失败
  • 一定要确认位置信息已经成功获取!如果位置为空,短信内容可能无效,也会导致发送失败,可以先打Log或者Toast确认latitude和longitude的值是否正常

3. 排查设备的系统限制

有些Android 6.0+的设备会有额外的权限限制:

  • 去设备的「设置-应用-你的SOS应用-权限」里,确认短信权限确实是开启状态
  • 检查设备有没有信号、是不是飞行模式,没信号的话肯定发不出短信

4. 再去Logcat里找具体错误

你之前通过Logcat发现了权限问题,现在可以再仔细搜Logcat里的关键词,比如sms、sendTextMessage、Exception,找到具体的错误提示(比如有没有SecurityException或者其他异常),这能帮你更快定位问题。

按照上面的步骤一步步来,应该就能解决6.0+无法发送短信的问题啦!如果还是不行,把Logcat里的错误日志贴出来,我再帮你分析~

内容的提问来源于stack exchange,提问作者LJ Ca-ong

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:39:43