android5.0版本适配

webview适配

  • 不允许加载混合内容,也就是说https的网页内不允许加载http资源,反之依然

android5.0以下版本,WebView.getSettings().getMixedContentMode()的默认值为MIXED_CONTENT_ALWAYS_ALLOW,也就是总是允许加载混合内容。android5.0起,这个值默值为MIXED_CONTENT_NEVER_ALLOW。处于安全考虑,一般情况下,强烈建议使用MIXED_CONTENT_NEVER_ALLOW模式。但是,如果该网页为第三方网页或者我们的https网页中加载了第三方资源,我们不太可能立马要求对方升级为https。那么我们就做如下适配:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    mWebView.getSettings()
            .setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}
  • 不允许写入第三方cookie

android5.0起,默认不允许写入第三方cookie,需手动设置:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    CookieManager.getInstance().setAcceptThirdPartyCookies(mWebView,true);
}
  • 不再一次性渲染整个网页

android5.0以前,webview总是一次性渲染整个网页。android5.0以后实行只能渲染,只保证可视部分是已渲染的。这在某些场合可能会出问题,比如为webview截屏。当试图在5.0上对webview截屏时会发现只截取到可视部分,并没有截取整个网页。当然,这种情况发生在你并没有上下滑动webview使其整个网页得到渲染。

通过在创建webview前调用静态方法WebView.enableSlowWholeDocumentDraw()使其总是一次性渲染整个网页。

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            WebView.enableSlowWholeDocumentDraw();
        }
        setContentView(R.layout.activity_main);
    }

}
  • webview选择文件时WebChromeClient回调方法的改变
mWebView.setWebChromeClient(new WebChromeClient() {

    // when sdk version < 3.0
    public void openFileChooser(ValueCallback<Uri> valueCallback) {
    
    }

    // when sdk version  >= 3.0
    public void openFileChooser(ValueCallback valueCallback, String acceptType) {
    
    }

    //when sdk version  >= 4.1
    public void openFileChooser(ValueCallback<Uri> valueCallback,
                                String acceptType, String capture) {
    }

    // when sdk version >= 5.0
    @Override
    public boolean onShowFileChooser(WebView webView,
                                     ValueCallback<Uri[]> filePathCallback,
                                     WebChromeClient.FileChooserParams fileChooserParams) {
        return true;
    }
});

在android5.0以前,我们在Web页面上点击选择文件的控件(<input type="file">)时,会回调WebChromeClient的openFileChooser方法,不过该方法的形参在android3.0以前、3.0及以后、4.1及以后有所变化。到了android5.0,直接剔除了该方法,以onShowFileChooser代之。这将导致在5.0以下版本运行时,无法在onShowFileChooser方法中处理回调。openFileChooser方法不要标注@Override,由于是直接剔除,在高版本的sdk找不到该方法,如果你的编译版本>=5.0那么将编译报错。可根据你的minSdkVersion选择性地加入openFileChooser的三个历史版本。

Service适配

android5.0之前,我们可以隐式启动一个Service,

Intent intent = new Intent().setAction("com.android.test.for.service");
startService(intent);

android5.0及以后,隐式启动Service,程序会崩溃。

所以,在android5.0及以后必须显示调用Service。两种方式:

  • 指定packageName
Intent intent = new Intent()
        .setAction("com.android.test.for.service")
        .setPackage(getPackageName());
startService(intent);
  • 直接指定具体的Service类
Intent intent = new Intent(this, MyService.class);
startService(intent);

Material Design

Material Design是一种美学设计,android5.0引入了大量MaterialDesign特性及符合该特性的View。并且这些View都以支持库的形式提供,可以让你在低版本使用它们。android提供的大多数Material Design的View位于design库中。

implementation 'com.android.support:design:28.0.0'

也有部分单独成库。如

implementation 'com.android.support:cardview-v7:28.0.0'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vincent(朱志强)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值