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
相关产品推荐
相关产品推荐

