targetSdkVersion 23升级到 27所遇到的问题记录

本文解决了升级targetSdkVersion到27后,使用OkHttp下载文件出现的异常问题,并详细阐述了如何处理安装过程中遇到的错误,包括配置清单文件、添加权限、创建XML文件以及针对特定手机型号的解决方案。

由于XXX原因, 把APP的

targetSdkVersion升级到了27, 

首先第一个问题, app下载文件(自动升级) 使用okhttp下载文件就抛了异常:

也不知道什么原因, 咱也不敢问!!!

因此, 百度, Google, 查到需要添加这一句代码:

OkHttpClient mHttpClient = new OkHttpClient();
mHttpClient.setProtocols(Collections.singletonList(Protocol.HTTP_1_1));//就是这句

然后就正常下载了, 下载完成之后就要安装了, 但是有报错了, 上图:

这个就比较麻烦, 我们一步一步来:

1. 在清单配置文件添加:

<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="包名.provider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths" /> <!-- xml文件下文件的名称 -->
</provider>

 添加一个权限

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

第二步创建文件:

在res的文件下创建xml文件夹, 并创建file_paths.xml文件

文件里:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <paths>
        <external-path
            name="download"
            path="" />
    </paths>
</resources>

第三步:

首先要判断版本了, 从24开始安装时有区别的, 说明现在android对权限和隐私要求越来越高了, 这个还是不错的.

这里面还有几个点不是很明白, 就不详细解释了, 大家自行Google

 

发现一个问题:

OPPO和VIVO机型 apk自动更新完成后没有进入到打开界面, 而是直接退出了, 这很不友好.

华为, 小米手机没有这个问题.

是因为:

这里, 要用addFlags(), 去添加, 而不是去set. !!!

 

<think>嗯,用户的问题聚焦在Android 15上获取附近设备权限时为何仍需定位权限,特别关注targetSDK版本的影响。这显然是个深度技术问题,用户应该是有Android开发经验的人,可能正在处理权限适配的兼容性问题。 从用户引用我之前的回答来看,ta对Android权限机制已有基础认知,但更关心新版本的变化。需要重点解释Android 15的权限策略延续性,以及targetSDK版本如何影响权限逻辑。 用户特别提到“是否因targetSDK版本过低导致”,说明ta可能遇到了实际开发中的权限被拒问题。需要明确三点核心:1) Android 15权限策略本质是延续13的设计;2) targetSDK版本决定系统启用哪种权限检查逻辑;3) 新权限模型对隐私保护的具体实现。 关于技术细节,要强调NEARBY_WIFI_DEVICES权限的neverForLocation标志机制,这是解决用户疑惑的关键。如果应用声明该标志,系统会阻止位置推导,此时就不应再要求定位权限。但若targetSDK<33,系统会回退到旧模型,强制要求定位权限——这正是用户可能遇到的坑。 蓝牙权限部分需要区分说明,因为Android 12和13的规则不同:12强制位置权限,13则拆分为BLUETOOTH_SCAN+位置权限。在Android 15上,如果targetSDK>=31但<33,会出现混合权限要求,这种版本碎片化问题正是开发者的痛点。 最后补充的Wi-Fi RTT限制是延伸知识点,因为即使用户没问,但和附近设备权限紧密相关。拒绝位置权限时RTT测距会失败,这反证了位置权限在底层的数据保护作用。 用户应该需要具体解决方案而不仅是理论,所以给出适配建议时要突出两点:1) 提升targetSDK到33+的必须性;2) 正确声明neverForLocation标志的代码示例。XML和Java的示例都要给,因为有些开发者可能用旧项目结构。 生成的问题要覆盖用户可能遇到的延伸场景:权限拒绝时的处理、蓝牙适配的兼容方案、以及新API的使用方式。特别是第三个问题,很多开发者不知道Android 14新增的NEARBY_DEVICES权限组,这能帮助ta面向未来开发。</think>在 Android 15 中,应用获取附近设备权限时仍需申请定位权限,主要涉及 **技术原理限制** 和 **隐私保护机制**,同时 **`targetSDK` 版本会直接影响权限要求**。以下是具体分析: --- ### 一、核心原因:技术原理与隐私保护 #### 1. **位置计算的底层依赖** - **无线信号 = 位置锚点** Wi-Fi/蓝牙设备的 **MAC 地址** 和 **信号强度(RSSI)** 是位置计算的关键输入。系统通过公式计算设备与信号源的相对距离: $$ d = 10^{\frac{(P_0 - P_r)}{10n}} $$ 其中 $P_0$ 为信号源强度,$P_r$ 为接收强度,$n$ 为环境衰减因子[^1]。 - **位置数据库匹配** 扫描到的设备 MAC 地址会与谷歌的全球位置数据库匹配,直接推导出经纬度坐标[^2]。 #### 2. **隐私泄露风险控制** 即使应用声明“仅用于设备连接”,原始扫描数据(MAC + RSSI)仍可被用于: - 通过三角定位推导位置 - 构建用户活动轨迹(如通过固定位置的蓝牙信标) 因此 Android 15 **强制要求位置权限**,防止绕过隐私控制[^3]。 --- ### 二、`targetSDK` 版本的关键影响 #### 权限规则对比(以 Wi-Fi 扫描为例) | `targetSDK` 版本 | 所需权限 | 系统行为 | |------------------|----------------------------------------|----------| | **≤ 32 (Android 12L)** | `ACCESS_FINE_LOCATION` | 旧模型:强制位置权限 | | **≥ 33 (Android 13+)** | `NEARBY_WIFI_DEVICES` + **可选**位置权限 | 新模型:可声明非定位用途 | #### 具体机制解析: 1. **`targetSDK < 33` (旧模型)** - 系统**强制要求位置权限**(`ACCESS_FINE_LOCATION`) - 即使应用仅需设备连接,仍需申请定位权限 - **原因**:兼容旧版权限模型,未启用 Android 13+ 的新隔离机制 2. **`targetSDK ≥ 33` (新模型)** - 可通过 `NEARBY_WIFI_DEVICES` + `neverForLocation` 标志声明非定位用途: ```xml <uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES" android:usesPermissionFlags="neverForLocation" /> ``` - 此时**无需位置权限**,但系统会限制扫描数据: - 屏蔽 MAC 地址(返回随机化标识) - 禁止访问信号强度历史记录 - 阻止位置推导[^3] --- ### 三、Android 15 的增强限制 即使 `targetSDK ≥ 33`,以下场景仍需位置权限: 1. **蓝牙扫描** - 若需获取 **蓝牙设备名称** 或 **原始 MAC 地址**(非随机化标识) - 仍需 `ACCESS_FINE_LOCATION`(Android 12+ 要求) 2. **Wi-Fi RTT 测距** - 高精度测距 API (`WifiRttManager`) 强制要求位置权限 - 因 $$ \text{距离} = \frac{\text{RTT} \times c}{2} $$ ($c$ 为光速,结果直接对应物理位置)[^1] 3. **后台扫描** 任何后台设备扫描行为均触发位置权限检查 --- ### 四、适配建议:解决权限问题 #### 1. 升级 `targetSdkVersion` 至 33+ ```gradle android { compileSdk 34 defaultConfig { targetSdk 34 // 必须 ≥33 } } ``` #### 2. 正确声明权限用途 **非定位场景(如设备连接)**: ```xml <uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES" android:usesPermissionFlags="neverForLocation" /> <!-- 关键声明 --> ``` **定位场景(如室内导航)**: ```xml <uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> ``` #### 3. 动态权限请求代码 ```java if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { // Android 13+ 用新权限 requestPermissions(new String[]{Manifest.permission.NEARBY_WIFI_DEVICES}, REQ_CODE); } else { // 旧版本回退到位置权限 requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQ_CODE); } ``` --- ### 总结 | 关键因素 | 是否需定位权限 | 解决方案 | |-------------------------|------------------------------|------------------------------| | **`targetSDK < 33`** | ✅ 强制要求 | 升级 targetSDK 至 33+ | | **`targetSDK ≥ 33` + 声明 `neverForLocation`** | ❌ 不需要 | 正确配置权限标志 | | **使用蓝牙名称/MAC** | ✅ 需要 | 申请位置权限 | | **Wi-Fi RTT 测距** | ✅ 需要 | 无法绕过 | **根本原因**: Android 15 延续了设备扫描与位置权限的绑定策略,这是为防止通过无线信号**间接获取位置信息**的隐私泄露风险。`targetSDK` 版本过低会导致系统无法启用新权限模型,从而强制要求位置权限[^2][^3]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值