美文网首页
Detected problems with API 弹窗

Detected problems with API 弹窗

作者: baby_honour | 来源:发表于2019-03-27 15:55 被阅读0次

    Android P 也就是android9.0 谷歌限制开发者调用非官方公开API 方法或接口(使用@hide注解的系统源码),当开发者用反射直接调用源码时就会出现上述提示框。谷歌旨在提示开发者尽量少使用反射只用调用系统api,以免造成不必要的麻烦。但是项目中,有些功能实现要用到怎么办?即使咱们不用,依赖的第三方类库,用到怎么办?

    //在app初始化时调用即可
    public class MyApplication extends Application {
     
        public JoyApplication() {
        }
     
        @Override
        public void onCreate() {
            super.onCreate();
            disableAPIDialog();
        } 
         /**
          * 反射 禁止弹窗
         */
        private void disableAPIDialog(){
           if (Build.VERSION.SDK_INT < 28)return;
           try {
             Class clazz = Class.forName("android.app.ActivityThread");
             Method currentActivityThread = clazz.getDeclaredMethod("currentActivityThread");
             currentActivityThread.setAccessible(true);
             Object activityThread = currentActivityThread.invoke(null);
             Field mHiddenApiWarningShown = clazz.getDeclaredField("mHiddenApiWarningShown");
             mHiddenApiWarningShown.setAccessible(true);
             mHiddenApiWarningShown.setBoolean(activityThread, true);
           } catch (Exception e) {
               e.printStackTrace();
           }
       }
     
    }
    
    
       private void closeAndroidPDialog(){
            if (Build.VERSION.SDK_INT < 28)return;
            try {
                Class aClass = Class.forName("android.content.pm.PackageParser$Package");
                Constructor declaredConstructor = aClass.getDeclaredConstructor(String.class);
                declaredConstructor.setAccessible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
            try {
                Class cls = Class.forName("android.app.ActivityThread");
                Method declaredMethod = cls.getDeclaredMethod("currentActivityThread");
                declaredMethod.setAccessible(true);
                Object activityThread = declaredMethod.invoke(null);
                Field mHiddenApiWarningShown = cls.getDeclaredField("mHiddenApiWarningShown");
                mHiddenApiWarningShown.setAccessible(true);
                mHiddenApiWarningShown.setBoolean(activityThread, true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    

    原文:https://blog.csdn.net/zpjsmalltime/article/details/86577058

    相关文章

      网友评论

          本文标题:Detected problems with API 弹窗

          本文链接:https://www.haomeiwen.com/subject/sigzvqtx.html