地理围栏应用: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
相关产品推荐
相关产品推荐

