【问题标题】:URL with parameter in WebView not working in Android?WebView 中带有参数的 URL 在 Android 中不起作用?
【发布时间】:2012-02-11 06:12:20
【问题描述】:

我正在尝试使用以下 url 在 web 视图中调用 loadUrl 方法

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

调用此 URL 时,它会提供来自服务器的图像。我需要在 webview 上显示该图像。

正常的 URL 可以正常工作。但它不适用于带有参数的上述 url。

它给了我这样的错误:

函数名必须是字符串 /var/www/stage/realtylog.net/iPhone/functions.php

我尝试对上面的 url 进行 URLEncode,但它仍然无法正常工作。 任何形式的帮助都将受到高度赞赏。

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


    }
}

【问题讨论】:

    标签: android


    【解决方案1】:

    欢迎来到一个可怕的已知错误,Google 不想修复,甚至不想解决。

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

    【讨论】:

    • 你想说,它是 webview Dino 中的一个错误。你能澄清一下吗
    • 没有这个错误与本地网址有关,例如file:///
    • 你知道这个bug是否还没有修复吗?
    【解决方案2】:

    将您的网址更改为:

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

    【讨论】:

    • 谢谢这对我有用,但我认为你必须删除username之前的问号
    • eb_view_nhs.settings.setDomStorageEnabled(true); 这条线救了我的命。
    • Indeed Mumtaz....面临同样的问题,我可以确认 setDomStorageEnabled(true) 为我节省了一天
    【解决方案3】:

    我搜索了很多来解决这个问题,但没有发现任何工作。 虽然我只在 android 上遇到过这个问题

    我只在第一次加载 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);
            }
    

    【讨论】:

      【解决方案4】:

      将您的网址更改为:

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

      【讨论】:

        【解决方案5】:

        这解决了问题:

        webView.getSettings().setDomStorageEnabled(true);
        

        【讨论】:

          【解决方案6】:

          Yoy 可以使用 List of NameValuePair 和 URLEncodedUtils 来创建 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;
          }
          

          替代选项如下...您也可以尝试...

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

          【讨论】:

          • 我使用的是 WebView,所以它有 loadUrl 方法。我在哪里放置这些代码?
          【解决方案7】:

          我设法以不同的方式传递变量。

          我的问题是,每当我切换到另一个应用程序时,当进入 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");
          

          所以,首先我加载页面,然后在页面完成加载时传递变量。 在 javascript 中 loadVariables 函数如下所示:

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

          【讨论】:

            【解决方案8】:

            正如 Dino Fancellu 所指出的,这是一个糟糕的错误,但我认为它仅适用于您的 android 项目中的资产本地文件。
            令人难以置信的是,这个错误在版本 2+ (Froyo) 中不存在。
            而且我的应用严重依赖将 url 变量传递给 /asset/ 文件。
            我只传递了一个变量 (?id=xx),但这是我修复它的方法,并对其进行了调整以使用多个变量:

                // 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:// 网址。 据我了解,WebView 没有抛出错误。你的 php 脚本是: “函数名称必须是 /var/www/stage/realtylog.net/iPhone/functions.php 中的字符串”
              这可能有用:
              PHP Fatal error: Function name must be a string

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-01-06
              • 1970-01-01
              • 2013-04-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-06-22
              相关资源
              最近更新 更多