2012-02-11 18 views
6

私はこのURLを呼び出す場合、それはサーバからイメージを与える以下のURLWebViewのパラメータを持つURLがAndroidで動作しないのですか?

http://stage.realtylog.net/iPhone/functions.php?username=xxx&ID=xxx&act=readFileAndPrint

でのWebViewでloadUrlメソッドを呼び出ししようとしています。その画像をwebviewに表示する必要があります。

正常なURLで正常に動作しています。しかし、パラメータを持つ上記のURLで動作しません。私がしようとした

に/var/www/stage/realtylog.net/iPhone/functions.php文字列でなければなりません

関数名:それは私のようなエラーが発生します

URLEncode上記のURLは、まだ動作していません。 どんな種類のヘルプも高く評価されます。

package com.hussain.webview2; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.Window; 
import android.webkit.SslErrorHandler; 
import android.net.http.*; 
import android.webkit.WebChromeClient; 
import android.webkit.WebView; 
import android.webkit.WebViewClient; 


public class WebViewDemo2Activity extends Activity 
{ 
    final Activity activity = this; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     this.getWindow().requestFeature(Window.FEATURE_PROGRESS); 
     setContentView(R.layout.main); 

     WebView webView = (WebView) findViewById(R.id.webview); 
     // webView.setWebViewClient(new WebViewClient()); 
     // webView.addView(webView.getZoomControls()); 
     webView.getSettings().setJavaScriptEnabled(true); 

     webView.setWebChromeClient(new WebChromeClient() { 
     public void onProgressChanged(WebView view, int progress) 
     { 
      activity.setTitle("Loading..."); 
      activity.setProgress(progress * 100); 

      if(progress == 100) 
       activity.setTitle("Done"); 
     } 
    }); 

    webView.setWebViewClient(new WebViewClient() { 
     @Override 
     public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) 
     { 
      // Handle the error 
     } 



     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) 
     { 
      view.loadUrl(url); 
      return true; 
     } 
    }); 

    //webView.loadUrl("http://developer.android.com"); 
    webView.loadUrl("http://stage.realtylog.net/iPhone/functions.php?username=xxxx&ID=xxxx&act=readFileAndPrint"); 


    } 
} 

答えて

3

変更がへのあなたのURL:

StringBuffer buffer=new StringBuffer("http://stage.realtylog.net/iPhone/functions.php"); 
buffer.append("?username="+URLEncoder.encode("xxxxxxx")); 
buffer.append("&id="+URLEncoder.encode("xxxxxxxx")); 
buffer.append("act="+URLEncoder.encode("readFileAndPrint")); 
webView.loadUrl(buffer.toString()); 
+0

をそれはOKと思われるが、それでも、そのは... – mH16

+0

おかげで、この作業ではありません私のために働いていますが、私は 'username'の前に疑問符を削除する必要があると思います – TheBook

1

前年比は、URL文字列を作成するためのNameValuePairとURLEncodedUtilsのリストを使用することができます。..

protected String addLocationToUrl(String url){ 
    if(!url.endsWith("?")) 
     url += "?"; 

    List<NameValuePair> params = new LinkedList<NameValuePair>(); 

    if (lat != 0.0 && lon != 0.0){ 
     params.add(new BasicNameValuePair("lat", String.valueOf(lat))); 
     params.add(new BasicNameValuePair("lon", String.valueOf(lon))); 
    } 

    if (address != null && address.getPostalCode() != null) 
     params.add(new BasicNameValuePair("postalCode", address.getPostalCode())); 
    if (address != null && address.getCountryCode() != null) 
     params.add(new BasicNameValuePair("country",address.getCountryCode())); 

    params.add(new BasicNameValuePair("user", agent.uniqueId)); 

    String paramString = URLEncodedUtils.format(params, "utf-8"); 

    url += paramString; 
    return url; 
} 

代替オプションは、次のようなものです...あなたもこれを試すことができます...

HttpPost postMethod = new HttpPost("your url"); 
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 

nameValuePairs.add(new BasicNameValuePair("your parameter","parameter value")); 
nameValuePairs.add(new BasicNameValuePair("your parameter","parameter value")); 

postMethod.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
DefaultHttpClient hc = new DefaultHttpClient(); 

HttpResponse response = hc.execute(postMethod); 
+2

私はWebViewを使用していますので、loadUrlメソッドを持っています。 – mH16

11

恐ろしい既知のバグにようこそ.Googleは修正やアドレッシングのような気がしません。

http://code.google.com/p/android/issues/detail?id=17535

+0

あなたは、webview Dinoのバグを言いたいと思います。もう少し明確にすることができます – mH16

+0

このバグは 'file:///'のようなローカルURLには関係ありません – tbruyelle

+0

このバグは未修正ですか? – paquda

1

私は、この問題を解決するために多くのことを探索したが何も作業を発見しました。 私はこの問題をアンドロイドでしか遭遇しませんでしたが、< 4.0

私は最初にURLを読み込むときにこの問題が発生しました。 webviewに既に他のURLが読み込まれていればうまく動作します。

これは私の回避策ですが、実際には愚かですが動作します。

 if (API_ICS_OR_LATER) { 

      mWebView.loadUrl(mURL); 


     } else { 
      /*** 
      * Workaround for Webview bug when url contains parameters 
      * https://code.google.com/p/android/issues/detail?id=17535 
      */ 

      mWebView.loadData("<html></html>", "text/html", "UTF-8"); 

      new Handler().postDelayed(new Runnable() { 

       @Override 
       public void run() { 
        mWebView.loadUrl(mURL); 

       } 
      }, 500); 
     } 
0

変数を別の方法で渡すことができました。

私の問題は、いつでも別のアプリに切り替えたときに、webappに来ると、webviewがリロードしていたことです。私はそれが私のonCreate()メソッドの次の行のためだと思います:myWebView.loadUrl(url);私は、URLにこれらの状態変数を渡す考えがありましたが、あなたが知っているように、それはまだ不可能です。 私がしたことは、onSaveInstanceState(Bundle outState) {...}を使っていくつかの変数の状態を保存し、それらをonRestoreInstanceState(Bundle savedInstanceState){...}で復元することでした。私は次のようでしたmyWebView設定した後のonCreateメソッドで

myWebView.setWebViewClient(new WebViewClient() { 
@Override 
public void onPageFinished(WebView view, String urlString) 
{ 
    Log.i("onPageFinished", "loadVariables("+newURL+")"); 
    if(newURL!="") 
     myWebView.loadUrl("javascript:loadVariables("+"\""+newURL+"\")"); 
} 

@Override 
public boolean shouldOverrideUrlLoading(WebView view, String url) { 
    view.loadUrl(url); 
    return true; 
} 
}); 

jsInterface = new JSInterface(this,myWebView); 
myWebView.addJavascriptInterface(jsInterface, "Android"); 

if (savedInstanceState != null) 
{ 
// retrieve saved variables and build a new URL 
newURL = "www.yoururl.com"; 
newURL +="?var1=" + savedInstanceState.getInt("key1"); 
newURL +="?var2=" + savedInstanceState.getInt("key2"); 
Log.i("myWebApp","NEW URL = " + newURL); 
} 
myWebView.loadUrl("www.yoururl.com"); 

そうに、何が起こるかは最初、私はページをロードし、ページの読み込みが完了したときに、私は変数を渡すことです。ディノFancelluは、その悪いバグを指摘したが、私はそれだけであなたのAndroidプロジェクトにおける資産のローカルファイルに適用されると考えたよう

function loadVariables(urlString){ 
    // if it is not the default URL 
    if(urlString!="www.yoururl.com") 
    { 
     console.log("loadVariables: " + urlString); 
     // parse the URL using a javascript url parser (here I use purl.js) 
     var source = $.url(urlString).attr('source'); 
     var query = $.url(urlString).attr('query'); 
     console.log("URL SOURCE = "+source + " URL QUERY = "+query); 
     //do something with the variables 
    } 
} 
0

:。loadVariables関数は次のようになりますJavaScriptで
このバグはバージョン2+(Froyo)では存在しませんでした。
私のアプリはurl変数を/ asset/filesに渡すことに大きく依存していました。
私だけ一つの変数を渡した(ID = XX?)が、HERESに私はそれを修正し、複数の変数で動作するようにそれを微調整する方法:

// in App declare a string to hold the url parameters 
    String strUrlParams; 

    // In WebViewClient, Override the onReceiveError 
    // Basially check if params exist in Url, strip them and save them to string 
    private class HelloWebViewClient extends WebViewClient { 
    @Override 
    public void onReceivedError(WebView webview, int errorCode, String description, String failingUrl) 
    { 
     System.out.println("onReceivedError: " + description); 
     if (failingUrl.contains("?")) { 
       String[] temp; 
       temp = failingUrl.split(Pattern.quote("?")); 
       strUrlParams = temp[1]; // save params to string 
       webview.loadUrl(temp[0]); // load page without params 

     } else { 
     webview.loadUrl("file:///android_asset/error.html"); 
     } 
    } 
    .......... 
    } 


    // In JavascriptInterface, add method to return the params string 
    public String getUrlPString() { 
    return strUrlParams; 
    } 


    // In the webpage that is expecting the params, add javascript to grab them. 
    var getUrlParam = function(theParam) { 
    var strParam = "nada"; 
    var query = window.location.search.substring(1); 
    if(query.indexOf("=") != -1) { // check if params 
    .... 
    } else { 
    // no params in url, grab params string from app 
    query = app.getUrlPString(); 
    } 
    var vars = query.split("&"); 
    for (var i=0;i<vars.length;i++) { 
    var pair = vars[i].split("="); 
    if (pair[0] == theParam) { 
    strParam = pair[1]; 
    } 
    } 
    return strParam; 
    } 

    // example to grab the ?id=xx param 
    var theID = getUrlParam("id"); 
  • しかし、このページの質問、そのないあたりとしてローカルアセットファイル。 http:// urlです。 私が理解するところでは、WebViewはエラーを投げていません。 PHPスクリプトは次のとおりです。
    PHP Fatal error: Function name must be a string
0

変更あなたのURL: これは便利かもしれ
"関数名が/var/www/stage/realtylog.net/iPhone/functions.phpの文字列でなければなりません" To:

webView.loadUrl(MessageFormat.format("{0}{1}{2}","http://stage.realtylog.net/iPhone/functions.php",URLEncoder.encode("?username=xxxx"),URLEncoder.encode("&ID=xxxx"),URLEncoder.encode("&act=readFileAndPrint"))); 

jsのは、このようなファイル:

data= JSON.parse(decodeURIComponent(data)); 
関連する問題