android 获取系统版本和芯片版本_【Android初级】如何让APP无法在指定的系统版本上运行...

19a8aef18cb42350628be1ae5a9f6b13.png

点击上方蓝字关注

随着市面上越来越多三方APP的出现,某些手机厂商也开始对这些APP进行了安装限制或者运行限制,或者三方APP自身的版本过低,无法被特定的系统版本所支持。

今天我将要模拟实现一个“由于APP自身版本过低、导致无法在当前的系统版本上运行”的功能效果。实现思路如下

  1. 要获得APP的目标运行版本,也要知道系统的编译版本

  2. 通过版本比较,在进入该APP时,给用户做出“不支持运行”的提示

  3. 用户确认提示后,直接退出该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中的值,源码中有说明:

ce6f98a688eb665af41e7d969c6a823c.png

3、效果图如下:

2e6d8a96b909ac64e932cf841c941649.gif

我们注意到程序中使用的是 getApplicationInfo().targetSdkVersion,说明这个变量是 ApplicationInfo.java 的成员变量,这个值是在安装APK的过程中、由系统服务 PackageManagerService 解析赋值的,解析的源码位于 frameworks\base\core\java\android\content\pm\PackageParser.java 中:

39f981e9b3d33ae77b312ae567f72481.png

可以看到:

  • 先解析 TAG_USES_SDK(uses-sdk)

  • 再解析属性名 targetSdkVersion 以及 minSdkVersion 的值

最后再赋值给 applicationInfo对象的:

pkg.applicationInfo.targetSdkVersion = targetSdkVersion

往期推荐

【Android初级】教你用两行代码实现“显示/隐藏密码”的效果

【Android初级】如何实现一个具有选择功能的对话框效果

【Android初级】如何实现一个“模拟后台下载”的加载效果

【Android初级】如何动态添加菜单项(附源码+避坑)

分享一个口语中可以替代“deceive”的地道表达

使用TypeFace设置TextView的文字字体(附源码)

利用startActivityForResult返回数据到前一个Activity(附源码+解析)

“Old school”除了指“旧学校”,还有...

使用setContentView实现页面的转换效果

为什么我们经常听到的是"Merry Christmas"而不是"Happy Christmas"?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值