关于java.lang.NoSuchMethodError: No static method checkSelfPermission的问题

最近在做SDK的接入的工作,之前的项目面向的是低端机型,给的compileSdkVersion和TargetSdkVersion的版本比较低,而现在接入这个SDK后通过运行,在Android6.0一下版本还是可以运行,但是高于android6.0的机型中就会报错报错信息是:

2018-12-27 09:27:03.086 3456-3456/com.ayx.dwhgz.baidu E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.ayx.dwhgz.baidu, PID: 3456
    java.lang.NoSuchMethodError: No static method checkSelfPermission(Landroid/content/Context;Ljava/lang/String;)I in class Landroid/support/v4/content/ContextCompat; or its super classes (declaration of 'android.support.v4.content.ContextCompat' appears in /data/app/com.ayx.dwhgz.baidu-1/split_lib_dependencies_apk.apk)
        at com.duoku.platform.single.util.R.d(Unknown Source)
        at com.duoku.platform.single.util.R.a(Unknown Source)
        at com.duoku.platform.single.g.b.a(Unknown Source)
        at com.duoku.platform.single.DKPlatform.init(Unknown Source)
        at org.cocos2dx.javascript.AppActivity.initSDK(AppActivity.java:189)
        at org.cocos2dx.javascript.AppActivity.onCreate(AppActivity.java:81)
        at android.app.Activity.performCreate(Activity.java:6692)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
        at com.sik.bat.virtualapk.internal.VAInstrumentation.callActivityOnCreate(SourceFile:121)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2621)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2729)
        at android.app.ActivityThread.-wrap12(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1480)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6169)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:891)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:781)
这个报错信息是v4包的版本有些低了,根据这个信息我重新导入了一个新的v4包,通过依赖查看还是相同的版本,无奈自己下载了一个新包,添加到依赖,结果运行的时候v4包依赖重复,再一次查看代码,并没有明显的添加v4包的依赖,很奇怪,原来添加了V7包的依赖,那就删除之前添加的依赖,在更新v7包的依赖,结果还是一样。

最后想到我自己设置的compileSdkVersion 的版本比较低,重新设置了compileSdkVersion的版本,跑起来,耶耶耶,可以了,奈斯啊。这里说明下Android Studio中的compileSdkVersion、targetSdkVersion和minSdkVersion的区别:

 1、compileSdkVersion:这个主要是我们编译app时候用的sdk版本,就我们在AndroidStudio上面点击运行时候的编译时候的环境。记住这个只是在编译时候选择的版本,不涉及到运行时候的行为。由于androidStudio有预编译的功能所以会提示一些警告,提前了解新的sdk api。修改compileSdkVersion并不会影响我们的我们生成的app在手机先的行为。例如在android6.0之前的系统是不需要动态申请权限的,在6.0之后的系统需要动态申请权限。这个和你的compileSdkVersion的版本选择是完全没有任何关系的。也就是说你app运行时需不需要动态申请权限和你complieSdk是否设置的6.0,没有半毛钱关系,记住compileSDK只是关系到你编译出来的包。不是运行的表现行为。所以修改compileSdkVersion是不会改变你app在手机上运行的表现行为的。但是我们一般情况,也是最理想的情况就是把compileSdkVersion设置到最高,因为使用新的编译检查可以获得很多好处,可以避免弃用的API,并且为使用新的API做好准备。

 2、minSdkVersion:这个就是程序运行的最低的要求的Sdk,就是给说如果我设置的minSdkVersion是15的话那么如果你系统低于这个SdkVersion是安装不上的。还有一个好处就是。例如你设置miniSdk是3.0的话,你写的方法只有在4.0后才有的方法,这个时候就会提示你在3.0的时候是没有这个方法的。

3、targetSdkVersion:targetSdk主要是提供向前兼容的作用,什么意思呢?手机系统4.0的,或者 5.0或者更高,但是编译包的时候用的compileSdk是6.0,但是表现形式得按照targetSdk。1.提供向下兼容。2.确定app的表现行为。3.这允许你在适应新的行为变化之前就可以使用新的 API (因为你已经更新了 compileSdkVersion 打出来的包就是在compileSdkVersion上打出来的)。

       A.当系统版本高于targetSdkVersion时候:

       假设我们的targetSdkVersion是22(就是5.0)不需要动态申请权限,但是我们的系统是6.0的。现在程序运行到了需要某个需要权限的地方了。此时想想我们的手机该怎么办。

系统逻辑是这样的。系统源码,只是说处理逻辑。

              finalint sdkVersion = ctx.getApplicationInfo().targetSdkVersion;

              if(sdkVersion<Build.VERSION_CODES.M){

                     //这里的M就是level 23也就是6.0的系统

                     //这里的判断是如果当前的打包的targetSdkVersion小于23

                     那么这里就不需要动态申请权限直接可以调取开放的权限

              }else{

              //否则系统认为你需要动态申请权限

              }

注意这里是系统处理。不需要你显式的写这些代码。是系统内部的代码和自动处理。所以targetSdkVersion是确定表现形式的。并且也做到了向下兼容。

             B.当系统版本等于targetSdkVersion时候

当安装app的时候targetSdkVersion刚好等需系统的level,这个时候Andorid平台会认为这个程序在此版本上已经经过了充分的测试。不必为此程序开启兼容性检查判断的工作了。也就是说,如果targetSdkVersion与目标设备的API版本相同时,运行效率可能会高一些。

       C.当系统版本小于targetSdkVersion的时候

       还是举栗子把:targetSdkVersion=23的时候,但是系统版本是22很明显你代码里面做了动态权限分配。但是系统版本不支持。怎么办呢?我们ninSdk不就是处理这个情况的吗?

从这里看出targetSdkVersion的设置主要是当系统版本高于设置的target的时候。

       http://www.race604.com/android-targetsdkversion/讲targetSdkVersion作用的。

      总的来说你的app的表现行为和你是否修改过targetSdkVersion是有关系的。当我们修改他的时候要做足够的测试。

       minSdkVersion<=targetSdkVersion<=compileSdkVersion

       minSDKVersion查看创建项目的时候的版本分部图表确定,然后targetSdkVersion最好和compileSdkVersion一样。CompileSdk选最新的,因为你更新了 compileSdkVersion 打出来的包就是在compileSdkVersion上打出来的
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值