通过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);
    }
}