Android如何让APP无法在指定的系统版本上运行(实现方法)
作者:snowyeti 发布时间:2022-10-16 03:24:46
随着市面上越来越多三方APP的出现,某些手机厂商也开始对这些APP进行了安装限制或者运行限制,或者三方APP自身的版本过低,无法被特定的系统版本所支持。
今天我将要模拟实现一个“由于APP自身版本过低、导致无法在当前的系统版本上运行”的功能效果。
实现思路如下:
要获得APP的目标运行版本,也要知道系统的编译版本
通过版本比较,在进入该APP时,给用户做出“不支持运行”的提示
用户确认提示后,直接退出该APP
关键点是 targetSdkVersion 的使用,源码如下:
1、主Activity
public class TargetSdkVersionDemo extends Activity {
@Override
protected void onCreate(Bundle onSavedInstance) {
super.onCreate(onSavedInstance);
setContentView(R.layout.target_sdk_version_demo);
int appTargetSdkVersion = getApplicationInfo().targetSdkVersion;
Log.i("TargetSdkVersionDemo", "targetsdkversion " + appTargetSdkVersion);
// 我们假设这个APP的目标运行版本不高于 API Level 26
if (appTargetSdkVersion <= Build.VERSION_CODES.O) {
showNotSupportDialog(appTargetSdkVersion);
}
}
private void showNotSupportDialog(int version) {
new AlertDialog.Builder(this)
.setMessage("该APP的目标运行版本是 " + version + ",低于手机当前的版本,不支持运行!")
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 退出程序
finish();
}
})
.create()
.show();
}
}
2、在AndroidManifest.xml中需要定义 uses-sdk 这个标签的 targetSdkVersion 属性:
<uses-sdk android:targetSdkVersion="25" />
注意:
如果在 app 目录下的 build.gradle 文件中定义了 targetSdkVersion,则会覆盖 AndroidManifest中的值,源码中有说明:
3、效果图如下:
我们注意到程序中使用的是 getApplicationInfo().targetSdkVersion,说明这个变量是 ApplicationInfo.java 的成员变量,这个值是在安装APK的过程中、由系统服务 PackageManagerService 解析赋值的,解析的源码位于 frameworks\base\core\java\android\content\pm\PackageParser.java 中:
可以看到:
先解析 TAG_USES_SDK(uses-sdk)
再解析属性名 targetSdkVersion 以及 minSdkVersion 的值
最后再赋值给 applicationInfo对象的:
pkg.applicationInfo.targetSdkVersion = targetSdkVersion
来源:https://www.cnblogs.com/snowyeti/archive/2021/01/31/14354670.html


猜你喜欢
- Spring 注入static属性值本文介绍Spring中如何从属性文件给static字段注入值。实际应用中一些工具类中static属性值需
- 本文实例为大家分享了java实现饮料自助售货机的具体代码,供大家参考,具体内容如下①用户类import java.util.Scanner;
- /* * 绘制0°到360°的正弦曲线 * 分两种情形,y>0和y<=0进行绘制 * 每种情形中要
- 导入redis的jar包<!-- redis --> <dependency>  
- Console.WriteLine("This is a Client, host name is {0}", Dns.
- iText下载页面: http://sourceforge.net/projects/itext/files/1.创建简单的PDF文件pac
- 本文实例讲述了C#多线程中的异常处理操作。分享给大家供大家参考,具体如下:常规Thread中处理异常使用Thread创建的子线程,需要在委托
- 一、问题重现1.配置文件spring: #DataSource数据源 datasource: &nbs
- 相信大家在系统学习jvm的时候都会有遇到过这样的问题,散落的jvm知识点知道很多,但是真正在线上环境遇到一些莫名其妙的gc异常时候却无从下手
- 一、概述定义一个值类型,其中包含固定值集合。枚举类型变量可以是此集合中的任意一个或多个值。枚举使用enum关键字来声明,与类同级。枚举本身可
- 实现常驻通知栏时遇到的问题:无论如何就是不显示通知,查看日志发现貌似报错了:2020-06-28 14:11:34.923 6387-638
- 本文实例讲述了C#非矩形窗体实现方法。分享给大家供大家参考。具体实现方法如下:using System;using System.Colle
- 项目中肯定会遇到需要用户自己绘制地形的需求,然后根据地形自动生成房间。下面说说我在绘制地形的实现方法。我们百度可以看到很多关于自己创建mes
- 简单介绍 多个线程可以通过调用ManualResetEvent对象的WaitOne方法进入等
- 一、图示二、MapStructpom文件 <dependency> &n
- 页面元素定位是自动化中最重要的事情, selenium Webdriver 提供了很多种元素定位的方法。 测试人员应该熟练掌握各
- 今天同事写一个查询接口的时候,出错:元素内容必须由格式正确的字符数据或标记组成。错误原因:mybatis查询的时候,需要用到运算符 小于号:
- 大家在使用APP的时候,有的APP在点击语音搜索界面后,会出现一个小话筒,小话筒会类似雷达似得在闪烁,表示正在倾听你说话的内容(这个大家可以
- 项目中很多时候需要读取自定义配置文件,本地开发工具怎么写都成功但是部署到服务其上就出现问题,异常BOOT-INF/classes!/conf
- 算法介绍概念 TF-IDF(term frequency–inverse document