Android6.0 WebView显示空白页面

时间:2016-09-22 18:30:14

标签: java android webview

我尝试使用webView加载页面,它只是在我的手机上显示一个空白页面。以下是代码和类别。

的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.bobqiu.http_01" >

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

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


activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="com.example.bobqiu.http_01.MainActivity">

<WebView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/webview1"
    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_marginBottom="72dp" />
</RelativeLayout>

HttpThread.java

package com.example.bobqiu.http_01;

    import android.os.Handler;
    import android.webkit.WebView;

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.MalformedURLException;
    import java.net.URL;

    /**
     * Created by Bobqiu on 2016/9/22.
     */

    public class HttpThread extends Thread {
        private String url;

        private WebView webView;

        private Handler handler;

        public HttpThread(String url,WebView webView,Handler handler){
            this.url = url;
            this.webView = webView;
            this.handler = handler;
        }
        public void run(){
            try {
                URL httpUrl = new URL(url);
                try {
                    HttpURLConnection connection = (HttpURLConnection) httpUrl.openConnection();
                    connection.setReadTimeout(5000);
                    connection.setRequestMethod("GET");
                    final StringBuffer sb = new StringBuffer();
                    BufferedReader reader = new BufferedReader(new
                    InputStreamReader(connection.getInputStream()));
                    String str;
                    while((str = reader.readLine())!=null){
                        sb.append(str);
                    }

                    handler.post(new Runnable() {
                        @Override
                        public void run() {                     
                        webView.loadData(sb.toString(),"text/html;
                        charset=utf-8",null);
                        }
                    });
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }
        }
    }

MainActivity.java

package com.example.bobqiu.http_01;

import android.Manifest;
import android.os.Handler;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.WebView;

public class MainActivity extends AppCompatActivity {
    private WebView webView;
    private Handler handler = new Handler();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        webView= (WebView) this.findViewById(R.id.webview1);
        webView.getSettings().setDomStorageEnabled(true);
        webView.getSettings().setJavaScriptEnabled(true);
        int permissionCheckContextCompat.
        checkSelfPermission(MainActivity.this,
                Manifest.permission.INTERNET);
        System.out.println("!!!!!"+permissionCheck);//it shows 0 in console
        new HttpThread("https://m.baidu.com/",webView,handler).start();
    }
}

我也试过了webView.loadDataWithBaseURL方法,仍然没有工作...... 请帮帮我,谢谢!

3 个答案:

答案 0 :(得分:1)

在清单中添加互联网权限。没有它,您的应用程序将无法访问互联网服务。

<manifest xlmns:android...>
...
<uses-permission  android:name="android.permission.INTERNET" />
<application ...
</manifest>

已编辑 -

在Android M及以上版本中,您必须在运行时询问用户的权限。在致电

之前
new HttpThread("https://m.baidu.com/",webView,handler).start();

运行此代码以授予权限 -

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (checkSelfPermission(Manifest.permission.INTERNET)
                        != PackageManager.PERMISSION_GRANTED) {
                    // Should we show an explanation?
                    if (shouldShowRequestPermissionRationale(
                            Manifest.permission.INTERNET)) {
                        // Explain to the user why we need to read the contacts
                    }
                    requestPermissions(new String[]{Manifest.permission.INTERNET},
                            1);
                    // MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE is an
                    // app-defined int constant
                    return;
                }else {
                    new HttpThread("https://m.baidu.com/",webView,handler).start();
                }
            }else {
                new HttpThread("https://m.baidu.com/",webView,handler).start();
            }

并覆盖此方法 -

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {
        case 1: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // permission was granted, yay! Do the
                // contacts-related task you need to do.
                new HttpThread("https://m.baidu.com/",webView,handler).start();
            } else {

                // permission denied, boo! Disable the
                // functionality that depends on this permission.
                Snackbar.make(parent, "Click on allow to Access Internet in you application", Snackbar.LENGTH_LONG)
                        .setAction("CLOSE", new View.OnClickListener() {
                            @Override
                            public void onClick(View view) {

                            }
                        })
                        .setActionTextColor(getResources().getColor(android.R.color.holo_purple
                        )).show();
            }
            return;
        }

        // other 'case' lines to check for other
        // permissions this app might request
    }
}

此后它也应该在你的Android M手机中运行。希望它有效。

答案 1 :(得分:0)

尝试加载如下数据:

webView.loadData(sb.toString(),"text/html",UTF-8);

或者这个:

webView.loadDataWithBaseURL("",sb.toString(),"text/html",UTF-8,"");

答案 2 :(得分:0)

无需在SubThread中加载数据......

您可以在webView加载之前记录stringbuilder信息

webView.loadData(String url)效果很好

---更新 我尝试运行你的代码(23和19):

enter image description here

相关问题