2016-09-22 7 views
0

WebViewでページを読み込もうとしましたが、携帯電話に空のページが表示されています。ここにコードとクラスがあります。

のAndroidManifest.xmlAndroid6.0 WebViewが空白ページを表示

<?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方法を試してみました... 私を助けてください、ありがとうございました!

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

またはこの:

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

答えて

0

サブスレッドにデータをロードする必要はありません...

あなたはWebViewのロード前にStringBuilderの情報をログに記録することができ、それは

webView.loadData(文字列のURLは)うまく

に動作します - -update 私はあなたのコード(23及び19)を実行しよう:

enter image description here

+1

私はあなたがwebView.loadUrl(Strng url)を意味すると思います...私はそれを試して、それはうまく動作します。ありがとう。しかし、私はまだstringBufferとloadUrlによるloadDataの違いを直接理解したいと思っています。また、上記のコードはエミュレータでうまくいきます(Android 4.4。2)、実際の電話(Android 6.0)には表示されません。 2つのバージョンの間に違いはありますか? Android 6.0のランタイムチェックについて確認したところ、結果は0で、これは許可されていることを意味します。 – BobHU

+0

@BobHU私は自分の答えを編集しました。見てみましょう。 –

0

してみてください。これがなければ、アプリケーションはインターネットサービスにアクセスできなくなります。

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

編集 -

アンドロイドMでは、あなたは実行時にユーザーからの許可を依頼する必要が上記の。

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

そして、このメソッドをオーバーライド - - 権限を付与するため、このコード

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

申し訳ありませんが、私はそれを追加したが、それは動作しません...私はそれがAndroidシステムのバージョンであれば、それはエミュレータ(Android 4.4.2)で正常に動作しますが、実際の電話(Android 6.0)では動作しませんと思っています。 – BobHU

関連する問題