2012-02-11 30 views
6

Tôi cố gắng để gọi phương thức loadUrl trong một webview với url bên dướiURL có tham số trong WebView không hoạt động trong Android?

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

Khi gọi URL này, nó mang lại một hình ảnh từ máy chủ. Tôi cần hiển thị hình ảnh đó trên một trang web.

Tính năng này hoạt động tốt với các URL thông thường. Nhưng nó không hoạt động với url trên với các tham số.

Nó mang lại cho tôi một lỗi như:

tên Chức năng

phải là một chuỗi trong /var/www/stage/realtylog.net/iPhone/functions.php

Tôi cố gắng để URLĐịa chỉ url trên, nhưng nó vẫn không hoạt động. Mọi loại trợ giúp sẽ được đánh giá cao.

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"); 


    } 
} 

Trả lời

3

thay đổi url của bạn để:

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

Có vẻ như OK, nhưng vẫn còn, nó không làm việc ... – mH16

+0

Cảm ơn này làm việc cho tôi nhưng tôi nghĩ bạn phải xóa dấu chấm hỏi trước 'username' – TheBook

1

theo năm có thể sử dụng một danh sách của NameValuePair và URLEncodedUtils để tạo ra các chuỗi url ..

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

lựa chọn thay thế là như sau ... bạn cũng có thể thử điều này ...

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

Tôi đang sử dụng WebView, vì vậy nó có phương thức loadUrl. Tôi làm cách nào để đặt mã? – mH16

11

Chào mừng bạn đến với một lỗi đã biết khủng khiếp, rằng Google không cảm thấy thích sửa chữa hoặc thậm chí là giải quyết.

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

+0

Bạn muốn nói, đó là một lỗi trong webview Dino.Có thể bạn làm rõ hơn một chút – mH16

+0

Không có lỗi này liên quan đến url cục bộ như 'file: ///' – tbruyelle

+0

Bạn có biết nếu lỗi này vẫn chưa được sửa? – paquda

1

Tôi đã tìm kiếm rất nhiều để giải quyết vấn đề này nhưng không tìm thấy gì hoạt động. Mặc dù tôi chỉ gặp sự cố này với android < 4.0

Tôi chỉ gặp sự cố này khi tải url đầu tiên. Nếu webview đã tải một số url khác thì nó hoạt động tốt.

Vì vậy, đây là giải pháp thay thế của tôi hoạt động mặc dù nó thực sự ngớ ngẩn.

 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

Tôi đã quản lý biến các biến theo một cách khác.

Vấn đề của tôi là bất cứ khi nào tôi chuyển sang ứng dụng khác, khi truy cập webapp, webview vẫn tải lại. Tôi đoán đó là vì các dòng sau trong phương pháp onCreate() của tôi: myWebView.loadUrl(url); Tôi đã có ý tưởng để vượt qua các biến trạng thái trong url, nhưng như bạn biết nó là không thể được nêu ra. Điều tôi đã làm là lưu trạng thái của một số biến bằng cách sử dụng onSaveInstanceState(Bundle outState) {...} và khôi phục chúng bằng onRestoreInstanceState(Bundle savedInstanceState){...}.

Trong phương pháp onCreate sau khi thiết lập myWebView tôi đã làm như sau:

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"); 

Vì vậy, những gì nó xảy ra là đầu tiên tôi tải trang và sau đó tôi vượt qua các biến khi trang xong để tải. Trong javascript loadVariables chức năng trông như thế này:

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

Như Dino Fancellu chỉ ra, một lỗi xấu của nó, nhưng tôi nghĩ rằng nó chỉ áp dụng cho các tài sản tập tin địa phương trong dự án Android của bạn.
Vô cùng đủ, lỗi này không tồn tại trong phiên bản 2+ (Froyo).
Và ứng dụng của tôi dựa nhiều vào việc chuyển các biến url đến/asset/files.
Tôi đã chỉ đi qua một biến (id = xx?), Nhưng heres làm thế nào tôi cố định nó, và tinh chỉnh nó để làm việc với nhiều biến:

// 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"); 
  • Nhưng theo câu hỏi trang này, nó không phải là một tệp nội dung cục bộ; là một http: // url. Từ những gì tôi hiểu, WebView không ném lỗi. script php của bạn là: "tên hàm phải là một chuỗi trong /var/www/stage/realtylog.net/iPhone/functions.php"
    này có thể hữu ích:
    PHP Fatal error: Function name must be a string
0

thay đổi url của bạn để:

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 nộp như thế này:

data= JSON.parse(decodeURIComponent(data)); 
Các vấn đề liên quan