简体   繁体   English

Android6.0 WebView显示空白页

[英]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. 我试图用webView加载页面,但它仅在手机上显示一个空白页面。 Here are the codes and classes. 这是代码和类。

AndroidManifest.xml 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 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 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 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! 我也尝试过webView.loadDataWithBaseURL方法,仍然无法使用...请帮助我,谢谢!

Add internet permission in you manifest. 在清单中添加Internet权限 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. 在android M及更高版本中,您必须在运行时向用户询问权限。 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. 之后,它也应该在您的Android M手机中运行。 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... 无需在SubThread中加载数据...

you can log the stringbuilder info before webView loads it 您可以在webView加载之前记录stringbuilder信息

webView.loadData(String url) works well webView.loadData(String url)效果很好

---update i try to run your code (23 and 19): ---更新我尝试运行您的代码(23和19):

在此处输入图片说明

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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