通过 Provider 进行冻结解冻以及数据查询等操作
版本要求
- 自冻(FreezeYou) 版本不小于 9.0 。
- 部分需要更高版本(已标注)。
授权范围
- 获取当前 自冻(FreezeYou) 的运行模式、获取已冻结应用列表、获取是否可通过 自冻(FreezeYou) 安装应用9.2+ 、进行冻结应用操作、进行解冻应用操作。
声明权限
按需在 AndroidManifest.xml 中声明权限,并适时请求授予权限。
普通权限
无需额外请求授予权限。
查询各项状态数据
包括获取应用是否被冻结、获取当前运行模式。
<uses-permission android:name="cf.playhi.freezeyou.permission.QUERY_STATUS" />
危险权限
需要适时额外请求授予权限。
进行解冻应用操作
<uses-permission android:name="cf.playhi.freezeyou.permission.ENABLE_APPLICATIONS" />
进行冻结应用操作
<uses-permission android:name="cf.playhi.freezeyou.permission.DISABLE_APPLICATIONS" />
代码示例
获取当前运行模式
Bundle resultBundle = getContentResolver().call(
Uri.parse("content://cf.playhi.freezeyou.export.QUERY"),
"QUERY_MODE", null, new Bundle()
);
String currentMode = resultBundle.getString("currentMode", "Failed");
获取应用是否被冻结
Bundle willBeSend = new Bundle();
willBeSend.putString("packageName", packageName);
Bundle resultBundle = getContentResolver().call(
Uri.parse("content://cf.playhi.freezeyou.export.QUERY"),
"QUERY_FREEZE_STATUS", null, willBeSend
);
int resultStatusCode = resultBundle.getInt("status", 123456);
进行解冻应用操作
Bundle willBeSend = new Bundle();
willBeSend.putString("packageName", pkgName);
Bundle resultBundle = getContentResolver().call(
Uri.parse("content://cf.playhi.freezeyou.export.UNFREEZE"),
"MODE_AUTO", null, willBeSend
);
int resultCode = resultBundle.getInt("result", 123456);
进行冻结应用操作
Bundle willBeSend = new Bundle();
willBeSend.putString("packageName", pkgName);
Bundle resultBundle = getContentResolver().call(
Uri.parse("content://cf.playhi.freezeyou.export.FREEZE"),
"MODE_AUTO", null, willBeSend
);
int resultCode = resultBundle.getInt("result", 123456);
参数细节
获取当前运行模式
请求
| 参数 | 值 |
|---|
| Uri | Uri.parse("content://cf.playhi.freezeyou.export.QUERY") |
| Method | QUERY_MODE |
| Extras | 空 Bundle |
返回
如果对应键值为 null,则检查请求时的 Method 以及 Extras 是否为 null 。
数据存于 Bundle 中的键 currentMode,类型为 String。
| 取得值 | 意义 |
|---|
| dpm | DPM(免ROOT)模式(ROOT模式可能可用) |
| root | ROOT模式(DPM模式不可用) |
| unavailable | DPM 与 ROOT 模式均不可用 |
获取当前运行模式 V210.11+
请求
| 参数 | 值 |
|---|
| Uri | Uri.parse("content://cf.playhi.freezeyou.export.QUERY") |
| Method | QUERY_MODE_V2 |
| Extras | 空 Bundle |
返回
如果对应键值为 null,则检查请求时的 Method 以及 Extras 是否为 null 。
数据存于 Bundle 中的键 currentMode,类型为 String。
| 取得值 | 意义 |
|---|
| MODE_DPM | 当前运行于 DPM 模式 |
| MODE_ROOT_DISABLE_ENABLE | 当前运行于 ROOT DISABLE 模式 |
| MODE_ROOT_HIDE_UNHIDE | 当前运行于 ROOT HIDE 模式 |
| MODE_LEGACY_AUTO | 当前运行于 遗留的 DPM 与 ROOT DISABLE 自动选择模式 |
| MODE_SYSTEM_APP_ENABLE_DISABLE_UNTIL_USED | 当前运行于 系统应用 DISABLE_UNTIL_USED 模式 |
| MODE_SYSTEM_APP_ENABLE_DISABLE_USER | 当前运行于 系统应用 DISABLE_USER 模式 |
| MODE_SYSTEM_APP_ENABLE_DISABLE | 当前运行于 系统应用 DISABLE 模式 |
| MODE_PROFILE_OWNER11.3+ | 当前运行于 配置文件所有者(Profile Owner)模式 |
| MODE_UNKNOWN | 当前运行于 未知模式 |
获取应用是否被冻结
请求
| 参数 | 值 |
|---|
| Uri | Uri.parse("content://cf.playhi.freezeyou.export.QUERY") |
| Method | QUERY_FREEZE_STATUS |
| Extras | Bundle,键 packageName 必须包含被查询的应用包名 |
返回
如果对应键值为 null,则检查请求时的 Method 以及 Extras 是否为 null 。
数据存于 Bundle 中的键 status,类型为 int。
| 取得值 | 意义 |
|---|
| -2 | Bundle 中的键 packageName 的值为 null |
| -1 | 自冻 内部错误 |
| 0 | 未冻结 |
| 1 | ROOT 模式冻结 |
| 2 | DPM 模式冻结 |
| 3 | DPM + ROOT 双模式冻结 |
| 998 | 没有找到对应应用 |
进行解冻应用操作
请求
| 参数 | 值 |
|---|
| Uri | Uri.parse("content://cf.playhi.freezeyou.export.UNFREEZE") |
| Method | MODE_AUTO 或 MODE_ROOT 或 MODE_MROOT |
| Extras | Bundle,键 packageName 必须包含被解冻的应用包名 |
返回
如果对应键值为 null,则检查请求时的 Method 以及 Extras 是否为 null 。
数据存于 Bundle 中的键 result,类型为 int。
| 取得值 | 意义 |
|---|
| -4 | ROOT 模式解冻失败 |
| -3 | DPM 模式解冻失败 |
| -2 | Bundle 中的键 packageName 的值为 null |
| -1 | 自冻 内部错误 |
| 0 | 解冻成功 |
| 998 | 没有找到对应应用 |
| 999 | 检查发现未冻结,无需解冻 |
进行解冻应用操作 V210.11+
请求
| 参数 | 值 |
|---|
| Uri | Uri.parse("content://cf.playhi.freezeyou.export.UNFREEZE") |
| Method | MODE_DPM、MODE_ROOT_DISABLE_ENABLE、MODE_ROOT_HIDE_UNHIDE、MODE_LEGACY_AUTO、MODE_SYSTEM_APP_ENABLE_DISABLE、MODE_SYSTEM_APP_ENABLE_DISABLE_USER、MODE_SYSTEM_APP_ENABLE_DISABLE_UNTIL_USED、MODE_PROFILE_OWNER11.3+ |
| Extras | Bundle,键 packageName 必须包含被解冻的应用包名 |
返回
如果对应键值为 null,则检查请求时的 Method 以及 Extras 是否为 null 。
数据存于 Bundle 中的键 result,类型为 int。
| 取得值 | 意义 |
|---|
| -10 | 配置文件所有者(Profile Owner)模式系统内部错误 |
| -9 | 不是配置文件所有者(Profile Owner) |
| -8 | 不是系统应用 |
| -7 | 没有该冻结解冻模式 |
| -6 | 无 DPM 权限 |
| -5 | DPM 模式系统内部错误 |
| -4 | 无 ROOT 权限 |
| -3 | 设备 Android 版本过低,不支持该 Method |
| -2 | Bundle 中的键 packageName 的值为 null |
| -1 | 自冻 内部错误 |
| 0 | 解冻成功 |
| 1 | 没有发生异常,一般情况下为成功 |
进行冻结应用操作
请求
| 参数 | 值 |
|---|
| Uri | Uri.parse("content://cf.playhi.freezeyou.export.FREEZE") |
| Method | MODE_AUTO 或 MODE_ROOT 或 MODE_MROOT |
| Extras | Bundle,键 packageName 必须包含被解冻的应用包名 |
返回
如果对应键值为 null,则检查请求时的 Method 以及 Extras 是否为 null 。
数据存于 Bundle 中的键 result,类型为 int。
| 取得值 | 意义 |
|---|
| -2 | Bundle 中的键 packageName 的值为 null |
| -1 | 自冻 内部错误 |
| 0 | 冻结成功 |
| 998 | 没有找到对应应用 |
| 999 | 检查发现未解冻,无需冻结 |
进行冻结应用操作 V210.11+
请求
| 参数 | 值 |
|---|
| Uri | Uri.parse("content://cf.playhi.freezeyou.export.FREEZE") |
| Method | MODE_DPM、MODE_ROOT_DISABLE_ENABLE、MODE_ROOT_HIDE_UNHIDE、MODE_LEGACY_AUTO、MODE_SYSTEM_APP_ENABLE_DISABLE、MODE_SYSTEM_APP_ENABLE_DISABLE_USER、MODE_SYSTEM_APP_ENABLE_DISABLE_UNTIL_USED、MODE_PROFILE_OWNER11.3+ |
| Extras | Bundle,键 packageName 必须包含被解冻的应用包名 |
返回
如果对应键值为 null,则检查请求时的 Method 以及 Extras 是否为 null 。
数据存于 Bundle 中的键 result,类型为 int。
| 取得值 | 意义 |
|---|
| -10 | 配置文件所有者(Profile Owner)模式系统内部错误 |
| -9 | 不是配置文件所有者(Profile Owner) |
| -8 | 不是系统应用 |
| -7 | 没有该冻结解冻模式 |
| -6 | 无 DPM 权限 |
| -5 | DPM 模式系统内部错误 |
| -4 | 无 ROOT 权限 |
| -3 | 设备 Android 版本过低,不支持该 Method |
| -2 | Bundle 中的键 packageName 的值为 null |
| -1 | 自冻 内部错误 |
| 0 | 冻结成功 |
| 1 | 没有发生异常,一般情况下为成功 |
获取是否可通过自冻安装应用9.2+
请求
| 参数 | 值 |
|---|
| Uri | Uri.parse("content://cf.playhi.freezeyou.export.QUERY") |
| Method | QUERY_IF_CAN_INSTALL_APPLICATIONS_STATUS |
| Extras | 空 Bundle |
返回
如果对应键值为 null,则检查请求时的 Method 以及 Extras 是否为 null 。
数据存于 Bundle 中的键 status,类型为 boolean 数组。
| 取得值 | 意义 |
|---|
| boolean 数组 | boolean[]{预估功能可用, 安装通道可用, 有ROOT权限, 有DPM权限} |
Sample
FAQ
SecurityException
- 是否已经在 Manifest 中声明了权限呢(
冻结\解冻应用还需要类似请求敏感权限一样进行 requestPermissions )。
Failed to find provider info for ...
<manifest>
...
<queries>
<provider
android:authorities="cf.playhi.freezeyou.export.ExampleAuthority"
android:exported="false" />
</queries>
...
</manifest>
Current Limitation
- 需要在安装自冻 FreezeYou后再安装或更新(覆盖安装)使用相关权限的应用,否则可能会报 Exception (在 Android Google 的文档中有提及需要在请求前安装)。
Need Help