简体   繁体   中英

Android6.0 WebView shows blank page

I have tried to load a page with webView, and it just shows an empty page on my cellphone. Here are the codes and classes.

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();
    }
}

I have also tried the webView.loadDataWithBaseURL method, still doesn't work... Please help me, thank you!

Add internet permission in you manifest. Without it your application will not be able to access internet services.

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

Edited -

In android M and above you have to ask permissions from the user at runtime. Before calling

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

run this code for granting permissions -

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();
            }

And override this method -

@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
    }
}

After this it should run in your Android M phone too. Hope it works.

Try loading data like this:

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

or this:

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

there is no need to load data in a SubThread...

you can log the stringbuilder info before webView loads it

webView.loadData(String url) works well

---update i try to run your code (23 and 19):

在此处输入图片说明

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM