通过WebView接入WebSDK的标准实践指南
在Native端应用开发中,通过WebView接入WebSDK是实现网页级功能扩展的一种常见技术方案。然而在实际应用中,用户可能会遇到黑屏、摄像头唤起失败或授权失败等问题,严重影响了用户体验。
本文通过一个范例详细介绍接入流程,并提供解决方案,以应对上述问题。该范例能够在合适的时机请求摄像头权限,并在异常情况下自动重新加载WebSDK,从而降低因黑屏导致的通过率损失,同时能有效应对摄像头唤起失败或授权失败的异常情况。
以下是详细的接入示例代码,供您参考。
copy
package com.example.testwebview;
public class WebActivity extends Activity {
private WebView webView;
private static final int CAMERA_PERMISSION_REQUEST_CODE = 100;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_web);
webView = findViewById(R.id.webView);
webView.setWebViewClient(new WebViewClient());
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setMediaPlaybackRequiresUserGesture(false);
// 设置WebChromeClient以处理权限请求
webView.setWebChromeClient(new WebChromeClient() {
@Override
public void onPermissionRequest(final PermissionRequest request) {
// 检查是否已授予摄像头权限
if (ContextCompat.checkSelfPermission(WebActivity.this, Manifest.permission.CAMERA)
== PackageManager.PERMISSION_GRANTED) {
// WebSDK回调摄像头请求,如果已授予摄像头权限,则继续执行Web页面的后续操作
request.grant(request.getResources());
} else {
// 如果未授予摄像头权限,则请求权限
ActivityCompat.requestPermissions(WebActivity.this,
new String[]{Manifest.permission.CAMERA},
CAMERA_PERMISSION_REQUEST_CODE);
}
}
});
loadWebsdk(); // 加载WebSDK
}
private void loadWebsdk() {
String url = getIntent().getStringExtra("url");
if (url != null && !url.isEmpty()) {
webView.loadUrl(url);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == CAMERA_PERMISSION_REQUEST_CODE) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 请求授权成功后,重新加载WebSDK
loadWebsdk();
} else {
Toast.makeText(this, "摄像头权限被拒绝", Toast.LENGTH_SHORT).show();
}
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}