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'