簡體   English   中英

Android6.0 WebView顯示空白頁

[英]Android6.0 WebView shows blank page

我試圖用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方法,仍然無法使用...請幫助我,謝謝!

在清單中添加Internet權限 沒有它,您的應用程序將無法訪問互聯網服務。

<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手機中運行。 希望它能工作。

嘗試像這樣加載數據:

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

或這個:

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

無需在SubThread中加載數據...

您可以在webView加載之前記錄stringbuilder信息

webView.loadData(String url)效果很好

---更新我嘗試運行您的代碼(23和19):

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM