Web View仅在几个版本的Lollipop中工作

时间:2017-06-02 11:38:48

标签: android webview

我正在开发网页视图,但是网页视图只在lollipop 5.1版本中打开,并且它没有在其他版本的棒棒糖和更高版本的android中打开。我还在清单文件中提供了所有权限。将不胜感激。

  <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.colorssoftware.sdfg">
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.BLUETOOTH"/>
        <uses-permission android:name="android.permission.CAMERA"/>
        <uses-feature android:name="android.hardware.camera" android:required="true" />
        <uses-permission android:name="android.permission.RECORD_AUDIO" />
        <user-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
        <uses-feature android:name="android.hardware.camera.autofocus" />
        <permission android:name="android.permission.FLASHLIGHT"
            android:permissionGroup="android.permission-group.HARDWARE_CONTROLS"
            android:protectionLevel="normal" />
        <uses-feature android:name="android.hardware.audio.low_latency" />
        <uses-feature android:name="android.hardware.audio.pro" />
        <uses-feature android:name="android.hardware.microphone" android:required="true"/>
        <uses-feature android:name="android.hardware.camera.autofocus" />
        <uses-feature android:name="android.hardware.camera.front" android:required="true" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
        <uses-permission android:name="android.webkit.PermissionRequest" />
        <uses-permission android:name="android.permission.MICROPHONE" />


        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />

                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>

    </manifest>

这是主要活动

package com.colorssoftware.sdfg;


import android.content.Context;
import android.content.res.Resources;
import android.net.http.SslCertificate;
import android.net.http.SslError;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.webkit.PermissionRequest;
import android.webkit.SslErrorHandler;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.NoSuchProviderException;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        WebView htmlWebView = (WebView) findViewById(R.id.webView);
        htmlWebView.setWebViewClient(new CustomWebViewClient());
        WebSettings webSetting = htmlWebView.getSettings();
        webSetting.setJavaScriptEnabled(true);
        webSetting.setAllowFileAccessFromFileURLs(true);
        webSetting.setAllowUniversalAccessFromFileURLs(true);
        webSetting.setJavaScriptCanOpenWindowsAutomatically(true);
        webSetting.setDomStorageEnabled(true);
        webSetting.setJavaScriptCanOpenWindowsAutomatically(true);
        /*webSetting.setBuiltInZoomControls(true);*/
        webSetting.setAllowFileAccess(true);
       /* webSetting.setSupportZoom(true);
        webSetting.setDisplayZoomControls(true);
       */ htmlWebView.getSettings().setPluginState(WebSettings.PluginState.ON);
        htmlWebView.requestFocus();
        htmlWebView.loadUrl("https://www.colourssoftware.com:3443/\n");

        htmlWebView.setWebChromeClient(new WebChromeClient(){
            // Need to accept permissions to use the camera
            @RequiresApi(api= Build.VERSION_CODES.LOLLIPOP )

            @Override
            public void onPermissionRequest(final PermissionRequest request) {
                Log.d("hhhhhh","onPermissionRequest");
                request.grant(request.getResources());
            }

        });
    }


    public static Certificate getCertificateForRawResource(int resourceId, Context context) {
        CertificateFactory cf = null;
        Certificate ca = null;
        Resources resources = context.getResources();
        InputStream caInput = resources.openRawResource(resourceId);

        try {
            cf = CertificateFactory.getInstance("X.509","BC");
            ca = cf.generateCertificate(caInput);
        } catch (java.security.cert.CertificateException e) {
            e.printStackTrace();
        } catch (NoSuchProviderException e) {
            e.printStackTrace();
        } finally {
            try {
                caInput.close();
            } catch (IOException e) {
                Log.e(TAG, "exception", e);
            }
        }

        return ca;
    }

    public static Certificate convertSSLCertificateToCertificate(SslCertificate sslCertificate) {
        CertificateFactory cf = null;
        Certificate certificate = null;
        Bundle bundle = sslCertificate.saveState(sslCertificate);
        byte[] bytes = bundle.getByteArray("x509-certificate");

        if (bytes != null) {
            try {
                CertificateFactory certFactory = CertificateFactory.getInstance("X.509","BC");
                Certificate cert = certFactory.generateCertificate(new ByteArrayInputStream(bytes));
                certificate = cert;
            } catch (java.security.cert.CertificateException e) {
                e.printStackTrace();
            } catch (NoSuchProviderException e) {
                e.printStackTrace();
            }
        }

        return certificate;
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }


    private class CustomWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
           view.loadUrl(url);
            return true;

        }

        @Override
        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
            SslCertificate sslCertificateServer = error.getCertificate();
            Certificate pinnedCert = getCertificateForRawResource(R.raw.fullchain, MainActivity.this);
            Certificate serverCert = convertSSLCertificateToCertificate(sslCertificateServer);

            if(pinnedCert.equals(serverCert)) {
                handler.proceed();
            } else {
                super.onReceivedSslError(view, handler, error);
            }
        }

    }

0 个答案:

没有答案