Перейти к содержанию

Android Webview

Пример WebView приложения на Android

Данный пример может использоваться для открытия страницы любого примера Web SDK, как в браузере. Чтобы открыть страницу, необходимо указать URL, например

Так выглядит пример MCU Client, открытый в режиме только аудио конференции в Android Webview

Работа с кодом примера

Для разбора кода возьмем классы MainActivity.java и WebViewActivity.java примера webview-example, который доступен для скачивания в соответствующей сборке 1.1.0.26.

1. Запуск WebViewActivity c указанным URL

code

button = (Button) findViewById(R.id.btnUrl);
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        EditText et = (EditText) findViewById(R.id.textUrl);
        String url = et.getText().toString();
        if (url.isEmpty()) {
            showDialog();
        } else {
            Intent intent = new Intent(context, WebViewActivity.class);
            intent.putExtra("url", url);
            startActivity(intent);
        }
    }
});

2. Настройка параметров WebView

code

WebSettings settings = webView.getSettings();

// Enable Javascript
settings.setJavaScriptEnabled(true);

// Use WideViewport and Zoom out if there is no viewport defined
settings.setUseWideViewPort(true);
settings.setLoadWithOverviewMode(true);

// Enable pinch to zoom without the zoom buttons
settings.setBuiltInZoomControls(true);

// Allow use of Local Storage
settings.setDomStorageEnabled(true);

if(Build.VERSION.SDK_INT > Build.VERSION_CODES.HONEYCOMB) {
    // Hide the zoom controls for HONEYCOMB+
    settings.setDisplayZoomControls(false);
}

// Enable remote debugging via chrome://inspect
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    WebView.setWebContentsDebuggingEnabled(true);
}

3. Настройка обработки ошибок при проверке SSL сертификатов открываемой страницы

code

webView.setWebViewClient(new WebViewClient() {
    @Override
    public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError error) {

        final AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext());
        String message = "SSL Certificate error.";
        switch (error.getPrimaryError()) {
            case SslError.SSL_UNTRUSTED:
                message = "The certificate authority is not trusted";
                break;
            case SslError.SSL_EXPIRED:
                message = "The certificate has expired";
                break;
            case SslError.SSL_NOTYETVALID:
                message = "The certificate is not yet valid.";
                break;
            case SslError.SSL_IDMISMATCH:
                message = "The cerificate ID is mismatch";
                break;
            case SslError.SSL_DATE_INVALID:
                message = "The certificate date is invalid";
                break;
            case SslError.SSL_INVALID:
                message = "The certificate is invalid";
                break;
        }
        builder.setTitle("SSL Cerificate Error");
        builder.setMessage(message);
        builder.setPositiveButton("Continue", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                handler.proceed();
            }
        });
        builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                handler.cancel();
            }
        });
        Log.d(TAG, "onReceivedSslError " + message);
        final AlertDialog dialog = builder.create();
        dialog.show();
    }
});

4. Настройка обработки запроса прав доступа к камере и микрофону

code

webView.setWebChromeClient(new WebChromeClient() {
    @Override
    public void onPermissionRequest(final PermissionRequest request) {
        Log.d(TAG, "Request permissions: ");
        for (String res : request.getResources()) {
            Log.d(TAG, res);
        }
        WebViewActivity.this.runOnUiThread(new Runnable() {
            @TargetApi(Build.VERSION_CODES.LOLLIPOP)
            @Override
            public void run() {
                request.grant(request.getResources());
            }
        });
    }

    @Override
    public void onPermissionRequestCanceled(PermissionRequest request) {
        Log.d(TAG, "onPermissionRequestCanceled");
    }

});

5. Запрос прав доступа к камере и микрофону

code

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    int hasCameraPermission = checkSelfPermission(Manifest.permission.CAMERA);
    int hasRecordPermission = checkSelfPermission(Manifest.permission.RECORD_AUDIO);
    List<String> permissions = new ArrayList<>();
    if (hasCameraPermission != PackageManager.PERMISSION_GRANTED) {
        permissions.add(Manifest.permission.CAMERA);
    }
    if (hasRecordPermission != PackageManager.PERMISSION_GRANTED) {
        permissions.add(Manifest.permission.RECORD_AUDIO);
    }
    if (!permissions.isEmpty()) {
        requestPermissions(permissions.toArray(new String[permissions.size()]), 111);
    }
}

6. Открытие URL

code

webView.loadUrl(url);