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

地理围栏应用:Android 6前版本如何获取永久SEND_SMS权限?

解决Android 6之前版本的永久SMS权限获取问题

这个问题的核心是Android权限机制的版本差异:Android 6.0(API 23)引入了运行时权限体系,而更早的版本(比如KitKat)采用安装时权限申请机制。你遇到的旧版本发送短信时才弹窗请求权限,大概率是因为没在Manifest中声明必要权限,导致系统在运行时才触发权限检查。下面是具体的解决方案:

1. 先在AndroidManifest.xml中声明SEND_SMS权限

对于Android 6之前的系统,危险权限(比如SEND_SMS)是在应用安装阶段就向用户请求授权的,授权后权限会永久生效(直到用户卸载应用)。如果没有在Manifest中声明该权限,系统会在你调用短信发送API时才弹出权限请求弹窗,这正是你遇到的问题。

在Manifest的<manifest>标签内添加:

<uses-permission android:name="android.permission.SEND_SMS" />

2. 适配不同API等级的权限逻辑

你需要调整代码,区分Android 6+和旧版本的权限处理流程:

修改设置选项激活时的逻辑

if (key.equals(getString(R.string.pref_sms_alert))) {
    boolean isUserEnabled = Prefs.getBoolean(R.string.pref_sms_alert, false);
    if (isUserEnabled) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            // Android 6+ 走运行时权限请求流程,保留你原有的逻辑
            int permissionStatus = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.SEND_SMS);
            if (permissionStatus != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.SEND_SMS}, 1);
            } else {
                // 已拥有权限,直接保存启用状态
                Prefs.put(R.string.pref_sms_alert, true);
            }
        } else {
            // Android 6之前版本,检查是否已获得安装时授权的权限
            int permissionStatus = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.SEND_SMS);
            if (permissionStatus == PackageManager.PERMISSION_GRANTED) {
                Prefs.put(R.string.pref_sms_alert, true);
            } else {
                // 极端情况:用户安装时拒绝了权限,引导去应用设置开启
                Toast.makeText(getActivity(), "请前往应用设置页面开启发送短信权限", Toast.LENGTH_LONG).show();
                // 关闭功能选项,因为无权限无法使用
                Prefs.put(R.string.pref_sms_alert, false);
            }
        }
    } else {
        // 用户主动关闭选项,直接保存设置
        Prefs.put(R.string.pref_sms_alert, false);
    }
}

优化权限请求结果处理(可选)

你原有的onRequestPermissionsResult逻辑可以保留,建议添加提示信息让用户更清楚状态:

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode) {
        case 1:
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Prefs.put(R.string.pref_sms_alert, true);
                Toast.makeText(getActivity(), "短信权限已授予,功能已启用", Toast.LENGTH_SHORT).show();
            } else {
                Prefs.put(R.string.pref_sms_alert, false);
                Toast.makeText(getActivity(), "未授予短信权限,该功能无法使用", Toast.LENGTH_SHORT).show();
            }
            break;
    }
}

3. 关键说明

  • 对于Android 6之前的版本,只要你在Manifest中声明了SEND_SMS权限,用户安装应用时系统会弹出权限申请弹窗,用户授权后,应用就永久拥有该权限,后续发送短信不会再触发权限请求。
  • 如果用户安装时拒绝了权限,旧版本系统不会再主动请求,此时只能引导用户前往应用详情的权限设置页面手动开启(大部分旧版本系统支持这个操作)。

内容的提问来源于stack exchange,提问作者Michael Konz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:44:08