Архив метки: webview

Android WebView: не работает выбор файла на странице в теге input type=»file»

Неожиданно обнаружилось что в странице загружаемой в виджет webview  не работаю инпуты файлов. Т.е. при нажатии кнопки браузер не реагирует от слова никак. Как оказалось при дальнейших раскопках, Google подразумевает, что обработку файлов «вы берете на себя».

Решение:

public class MainActivity extends AppCompatActivity {
    private WebView mbrowser;
    private ValueCallback<Uri> mUploadMessage;
    public ValueCallback<Uri[]> uploadMessage;
    public static final int REQUEST_SELECT_FILE = 100;
    private final static int FILECHOOSER_RESULTCODE = 1;
...
...
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            if (requestCode == REQUEST_SELECT_FILE) {
                if (uploadMessage == null) return;
                uploadMessage.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, intent));
                uploadMessage = null;
            }
        }
        else if (requestCode == FILECHOOSER_RESULTCODE) {
            if (null == mUploadMessage) return;
            Uri result = intent == null || resultCode != MainActivity.RESULT_OK ? null : intent.getData();
            mUploadMessage.onReceiveValue(result);
            mUploadMessage = null;
        }
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
...
...
        mbrowser=(WebView) findViewById(R.id.main_webview);
        mbrowser.getSettings().setJavaScriptEnabled(true); // разрешен javascript
        mbrowser.getSettings().setAppCacheEnabled(false); // разрешон кэш
        mbrowser.getSettings().setDatabaseEnabled(true); // хранение данных во встроенной БД в браузере
        mbrowser.getSettings().setDomStorageEnabled(true);
       // mbrowser.getSettings().setSupportZoom(true); // зум
        mbrowser.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); // разрешать открывать окна
        //mbrowser.getSettings().setBuiltInZoomControls(true); // приблизить/удалить
        mbrowser.getSettings().setGeolocationEnabled(true); // разрешаем геолокацию
        mbrowser.setWebChromeClient(new WebChromeClient() {
                                        @Override
                                        public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
                                            callback.invoke(origin, true, false);
                                        }
                                        // For 3.0+ Devices (Start)
                                        // onActivityResult attached before constructor
                                        protected void openFileChooser(ValueCallback uploadMsg, String acceptType) {
                                            mUploadMessage = uploadMsg;
                                            Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                                            i.addCategory(Intent.CATEGORY_OPENABLE);
                                            i.setType("image/*");
                                            startActivityForResult(Intent.createChooser(i, "File Browser"), FILECHOOSER_RESULTCODE);
                                        }
                                        // For Lollipop 5.0+ Devices
                                        public boolean onShowFileChooser(WebView mWebView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {
                                            if (uploadMessage != null) {
                                                uploadMessage.onReceiveValue(null);
                                                uploadMessage = null;
                                            }
                                            uploadMessage = filePathCallback;
                                            Intent intent = null;
                                            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
                                                intent = fileChooserParams.createIntent();
                                            }
                                            try {
                                                startActivityForResult(intent, REQUEST_SELECT_FILE);
                                            } catch (ActivityNotFoundException e) {
                                                uploadMessage = null;
                                                return false;
                                            }
                                            return true;
                                        }
                                        //For Android 4.1 only
                                        protected void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
                                            mUploadMessage = uploadMsg;
                                            Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
                                            intent.addCategory(Intent.CATEGORY_OPENABLE);
                                            intent.setType("image/*");
                                            startActivityForResult(Intent.createChooser(intent, "File Browser"), FILECHOOSER_RESULTCODE);
                                        }
                                        protected void openFileChooser(ValueCallback<Uri> uploadMsg) {
                                            mUploadMessage = uploadMsg;
                                            Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                                            i.addCategory(Intent.CATEGORY_OPENABLE);
                                            i.setType("image/*");
                                            startActivityForResult(Intent.createChooser(i, "File Chooser"), FILECHOOSER_RESULTCODE);
                                        }

        });

Читаем печеньки (coockies) из webview, android

Прочитать cookies на открытой странице в webview можно например так:

public String CookieExtract (String cooks,String coocksname){
        String CookieValue = null;
        if (cooks!=null) {
            Log.v("Form1", "Все куки:"+cooks);
            Log.v("Form1", "Ищем:"+coocksname);
            String[] temp = cooks.split(";");
            for (String ar1 : temp) {
                if (ar1.contains(coocksname)) {
                    String[] temp1 = ar1.split("=");
                    CookieValue = temp1[1];
                    break;
                }
            }
        } else {
            Log.v("Form1", "Куков пока нет...");
        };
        return CookieValue;
    };
    @Override
    public void onPageFinished(WebView view, String url){
        user_randomid_w3=CookieExtract(CookieManager.getInstance().getCookie(url),"user_randomid_w3");
        Log.v("Form1", "Прочитали куки:"+user_randomid_w3);
        mbrowser.setVisibility(View.VISIBLE);
        spiner.setVisibility(View.INVISIBLE);
        super.onPageFinished(view, url);

    }

Запрос выбора SSL сертификата в компоненте WebView

Задача: при открытии страницы https необходимо позволить пользователю выбрать необходимый сертификат ssl из установленых в хранилище.

Решение:

private class NocWebViewClient extends WebViewClient {
    @Override
    public void onReceivedClientCertRequest(WebView view, final ClientCertRequest request) {
        Log.v(getClass().getSimpleName(), "===> certificate required!");

        KeyChain.choosePrivateKeyAlias(Form1.this, new KeyChainAliasCallback(){
            @TargetApi(Build.VERSION_CODES.LOLLIPOP)
            @Override
            public void alias(String alias) {
                Log.v(getClass().getSimpleName(), "===>Key alias is: " + alias);
                try {
                    PrivateKey changPrivateKey = KeyChain.getPrivateKey(Form1.this, alias);
                    X509Certificate[] certificates = KeyChain.getCertificateChain(Form1.this, alias);
                    Log.v(getClass().getSimpleName(), "===>Getting Private Key Success!" );
                    request.proceed(changPrivateKey, certificates);
                } catch (KeyChainException e) {
                    Log.e(getClass().getSimpleName(), Util.printException(e));
                } catch (InterruptedException e) {
                    Log.e(getClass().getSimpleName(), Util.printException(e));
                }
            }
        },new String[]{"RSA"}, null, null, -1, null);
    }
    @Override
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
        handler.proceed();
    }

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url)
    {
        return true;
    }
    @Override
    public void onPageFinished(WebView view, String url){

    }