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
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Android结合xml实现帧动画
![](https://img.aspxhome.com/file/2023/4/110674_0s.png)
LINQ基础之Intersect、Except和Distinct子句
Java递归实现斐波那契数列
Java中的Struts2框架拦截 器之实例代码
![](https://img.aspxhome.com/file/2023/8/78238_0s.jpg)
Java实现将txt文件转成xls文件的方法
C# 填充Excel图表、图例背景色的实例代码
![](https://img.aspxhome.com/file/2023/1/79041_0s.png)
Java之SpringBean生命周期问题理解
Springboot下swagger-ui.html访问不到的解决方案
![](https://img.aspxhome.com/file/2023/8/64168_0s.png)
C#构建树形结构数据(全部构建,查找构建)
![](https://img.aspxhome.com/file/2023/3/81133_0s.png)
Java面试基础之TCP连接以及其优化
![](https://img.aspxhome.com/file/2023/7/66967_0s.jpg)
Android中执行java命令的方法及java代码执行并解析shell命令
Java利用MessageFormat实现短信模板的匹配
Java操作Redis详细介绍
Android实现随手指移动小球
![](https://img.aspxhome.com/file/2023/9/138369_0s.jpg)
Spring Cloud Alibaba Nacos Config进阶使用
![](https://img.aspxhome.com/file/2023/7/125627_0s.png)
Unity实现仿3D轮转图效果
![](https://img.aspxhome.com/file/2023/7/83247_0s.gif)
Android Dispatchers.IO线程池深入刨析
![](https://img.aspxhome.com/file/2023/8/138198_0s.png)
c#调用存储过程实现登录界面详解
![](https://img.aspxhome.com/file/2023/5/80125_0s.gif)
C#纯技术之Class写入Json
![](https://img.aspxhome.com/file/2023/0/88330_0s.png)
关于Spring事务隔离、传播属性与@Transactional注解
![](https://img.aspxhome.com/file/2023/7/76227_0s.png)