2012-02-11 14 views
6

estoy tratando de llamar al método LoadURL en una vista web con el siguiente urlURL con parámetro en WebView que no funciona en Android?

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

Al llamar a esta URL, da una imagen de servidor. Necesito mostrar esa imagen en una vista web.

Funciona bien con URL normales. Pero no funciona con la URL anterior con parámetros.

Me da un error como:

Nombre de la función debe ser una cadena de /var/www/stage/realtylog.net/iPhone/functions.php

Intenté URLEncode la URL anterior, pero todavía no está funcionando. Cualquier tipo de ayuda será muy apreciada.

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


    } 
} 

Respuesta

3

cambio de su URL a:

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

parece bien, pero aún así, no su trabajo ... Gracias – mH16

+0

esta funciona para mí pero creo que tienes que eliminar el signo de interrogación antes del 'username' – TheBook

1

Yoy puede utilizar una lista de NameValuePair y URLEncodedUtils para crear la cadena de 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; 
} 

opción alternativa es como seguir ... usted puede intentar esto también ...

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

Estoy usando una WebView, así que tiene el método loadUrl. ¿Dónde coloco el código? – mH16

11

Bienvenido a un error conocido horrible, que Google no tiene ganas de solucionar, o incluso abordar.

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

+0

Quiere decir que es un error en la vista web de Dino. ¿Puede aclarar un poco más? – mH16

+0

No, este error está relacionado con la URL local como 'file: ///' – tbruyelle

+0

. ¿Sabe si este error todavía no se ha corregido? – paquda

1

busqué mucho para solucionar este problema, pero no encontraron nada de trabajo. Aunque solo encontré este problema con android < 4.0

Solo encontré este problema al cargar la URL por primera vez. Si la vista web ya ha cargado alguna otra URL, funciona bien.

Así que este es mi solución que funciona, aunque es realmente tonto.

 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

Logré pasar las variables de una manera diferente.

Mi problema es que cada vez que cambio a otra aplicación, cuando vengo a la aplicación web, la vista web se vuelve a cargar. Supongo que se debe a la siguiente línea en mi método onCreate(): myWebView.loadUrl(url); Tuve la idea de pasar estas variables de estado en la url, pero como saben, aún no es posible. Lo que hice fue guardar el estado de algunas variables usando onSaveInstanceState(Bundle outState) {...} y restaurarlas con onRestoreInstanceState(Bundle savedInstanceState){...}.

En el método onCreate después de configurar myWebView hice lo siguiente:

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

Por lo tanto, lo que sucede es que primero me carga la página y luego me pase las variables cuando la página termine de cargar.En Javascript loadVariables función tiene el siguiente aspecto:

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

Como Dino Fancellu señaló, es un bicho malo, pero creo que sólo se aplica a los archivos locales activos en su proyecto androide.
Increíblemente, este error no existía en las versiones 2+ (Froyo).
Y mi aplicación se basó en gran medida en pasar las variables de URL a/activos/archivos.
sólo estaba pasando una variable (id = xx?), Pero aquí está cómo lo fijé, y ajustado para que funcione con múltiples variables:

// 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"); 
  • Pero según esta pregunta páginas, no es una archivo de activos local; es un http: // url. Por lo que entiendo, WebView no está arrojando el error. Su script php es: "Nombre de la función debe ser una cadena de /var/www/stage/realtylog.net/iPhone/functions.php"
    Esto puede ser muy útil:
    PHP Fatal error: Function name must be a string
0

cambio de su URL a:

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 presentar la siguiente manera:

data= JSON.parse(decodeURIComponent(data)); 
Cuestiones relacionadas