完美解决Android 9.0以上HTTP网络请求被限制问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了完美解决Android 9.0以上HTTP网络请求被限制问题相关的知识,希望对你有一定的参考价值。

参考技术A android P 9.0以上系统,HTTP网络被限制。HTTPS无影响。
Android 10系统同样的问题。
Android P以上要求网络请求必须为Https,Http请求会抛异常。

  Android P以上的应用默认都被限制了明文流量的网络请求,非加密的流量请求都会被系统禁止掉。同时,目标API级别为27或更低的应用程序的默认值为“ true”。面向API级别28或更高级别的应用默认为“ false”。

需要在AndroidManifest.xml文件中设置:

  android:usesCleartextTraffic 指示应用程序是否打算使用明文网络流量,例如明文HTTP。

忽略证书,可以使用明文流量访问,https&http都可以访问。

  避免明文通信的主要原因是缺乏机密性,真实性和防篡改保护;网络攻击者可以窃听所传输的数据,并且还可以对其进行修改而不会被检测到。

别忘记在Android.Manifest.xml文件中添加网络访问权限哦!

完美解决android软键盘监听1

最近在做应用性能调优,发现在一个包含有输入框的Activity中,当软键盘弹出的时候,如果直接finish掉此Activity,那么在返回到上一个Activity时,界面的渲染会由于软键盘没有及时的收起而出现卡顿的情况。
很不友好。
于是,本着geek的精神,做就做到极致,就尝试着对这一块做优化。
借助网上一些知识的分享,同时结合自己的理解,最终应用到项目中。
直接上代码。。
首先,在manifest文件中声明此Activity的windowSoftInputMode属性,
     android:windowSoftInputMode="stateVisible|adjustResize"
在Activity中 声明所需用到的变量以及布局的事件监听,
    private boolean mBackEnable = false;
    private boolean mIsBtnBack = false;
    private int rootBottom = Integer.MIN_VALUE;
    private OnGlobalLayoutListener mOnGlobalLayoutListener = new OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            Rect r = new Rect();
            mSearchLayout.getGlobalVisibleRect(r);
            // 进入Activity时会布局,第一次调用onGlobalLayout,先记录开始软键盘没有弹出时底部的位置
            if (rootBottom == Integer.MIN_VALUE) {
                rootBottom = r.bottom;
                return;
            }
            // adjustResize,软键盘弹出后高度会变小
            if (r.bottom < rootBottom) {
                mBackEnable = false;
            } else {
                mBackEnable = true;
                if (mIsBtnBack) {
                    finish();
                }
            }
        }
    };
然后在onCreat方法中去注册事件监听
    mSearchLayout.getViewTreeObserver().addOnGlobalLayoutListener(mOnGlobalLayoutListener);
注意:这个mSearchlayout是你整个Activity的布局引用
最后,别忘了,在onDestroy方法中回收掉事件的监听
    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    @Override
    protected void onDestroy() {
        if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.JELLY_BEAN) {
            mSearchLayout.getViewTreeObserver().removeGlobalOnLayoutListener(mOnGlobalLayoutListener);
        } else {
            mSearchLayout.getViewTreeObserver().removeOnGlobalLayoutListener(mOnGlobalLayoutListener);
        }
        super.onDestroy();
    }
到这里,android软键盘的监听就结束了。
**什么?你说全屏的时候,没有效果???**
好吧,我也遇到了。。。
我在项目中实现了所有界面的沉浸式效果,本以为Activity设置了adjustResize,OnGlobalLayoutListener仍然能监听软键盘的变化,结果却是屡试不行。。。
无奈,只能求助。查了一些资料,发现这原来是android的一个bug。下面是具体的bug修复代码片段
    public class AndroidAdjustResizeBugFix {
    private View mChildOfContent;
    private int usableHeightPrevious;
    private int statusBarHeight;
    private FrameLayout.LayoutParams frameLayoutParams;
    private Activity mActivity;
    private AndroidAdjustResizeBugFix(Activity activity) {
        mActivity = activity;
        FrameLayout content = (FrameLayout) activity.findViewById(android.R.id.content);
        mChildOfContent = content.getChildAt(0);
        statusBarHeight = getStatusBarHeight();
        mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            public void onGlobalLayout() {
                possiblyResizeChildOfContent();
            }
        });
        frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams();
    }
    public static void assistActivity(Activity activity) {
        new AndroidAdjustResizeBugFix(activity);
    }
    private void possiblyResizeChildOfContent() {
        int usableHeightNow = computeUsableHeight();
        if (usableHeightNow != usableHeightPrevious) {
            int usableHeightSansKeyboard = mChildOfContent.getRootView().getHeight();
            int heightDifference = usableHeightSansKeyboard - usableHeightNow;
            if (heightDifference > (usableHeightSansKeyboard / 4)) {
                // keyboard probably just became visible
                // 如果有高度变化,mChildOfContent.requestLayout()之后界面才会重新测量
                // 这里就随便让原来的高度减去了1
                frameLayoutParams.height = usableHeightSansKeyboard - 1;
            } else {
                // keyboard probably just became hidden
                frameLayoutParams.height = usableHeightSansKeyboard;
            }
            mChildOfContent.requestLayout();
            usableHeightPrevious = usableHeightNow;
        }
    }
    private int computeUsableHeight() {
        Rect r = new Rect();
        mChildOfContent.getWindowVisibleDisplayFrame(r);
        return r.bottom - r.top + statusBarHeight;
    }
    private int getStatusBarHeight() {
        try {
            Class<?> c = Class.forName("com.android.internal.R$dimen");
            Object obj = c.newInstance();
            Field field = c.getField("status_bar_height");
            int x = Integer.parseInt(field.get(obj).toString());
            int dimensionPixelSize = mActivity.getResources().getDimensionPixelSize(x);
            return dimensionPixelSize;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return 0;
    }}
把这个类作为一个工具类,添加到项目中,然后,在需要做优化的Activity的onCreate方法中注册activity即可,如:
    AndroidAdjustResizeBugFix.assistActivity(this);
以上,就是关于监听软键盘弹出和收起的所有内容。

以上是关于完美解决Android 9.0以上HTTP网络请求被限制问题的主要内容,如果未能解决你的问题,请参考以下文章

Android 9.0 虚拟机连不了网的解决办法

Android 9.0/P(android p指安卓9.0版本) okhttp3网络请求出错

Android 9.0/P(android p指安卓9.0版本) okhttp3网络请求出错

Android Retrofit详解

安卓8.0机子以上升级APP软件安装权限

glide4.0以上在Android9.0以上加载图片不显示解决方案