WebView中带参数的URL在Android中不起作用?

nlejzf6q  于 2023-01-28  发布在  Android
关注(0)|答案(8)|浏览(190)

我正在尝试使用以下URL调用webview中的loadUrl方法
http://stage.realtylog.net/iPhone/functions.php?username=xxx&ID=xxx&act=readFileAndPrint
当调用这个网址,它会从服务器提供一个图像。我需要显示在一个网页视图的图像。
它可以很好的处理普通的网址,但是不能处理上面带参数的网址。
它会给我一个错误,例如:
函数名必须是/var/www/stage/ www.example.com中的字符串realtylog.net/iPhone/functions.php
我试图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");

    }
}
3gtaxfhh

3gtaxfhh1#

欢迎来到一个可怕的已知错误,谷歌不想修复,甚至解决。
http://code.google.com/p/android/issues/detail?id=17535

qxsslcnc

qxsslcnc2#

更改你的网址为:

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

ctzwtxfj3#

我搜索了很多来解决这个问题,但没有发现任何工作。虽然我只遇到了这个问题与android〈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);
        }
gpfsuwkq

gpfsuwkq4#

此操作修复了以下问题:

webView.getSettings().setDomStorageEnabled(true);
t3irkdon

t3irkdon5#

更改你的网址为:

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

6qfn3psc6#

Yoy可以使用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);
ngynwnxp

ngynwnxp7#

我设法用一种不同的方式传递变量。
我的问题是,每当我切换到另一个应用程序,当来到webapp,webview不断重新加载。我猜这是因为我的onCreate()方法中的以下行:myWebView.loadUrl(url);我有过在url中传递这些状态变量的想法,但正如你所知,这还不可能,我所做的是使用onSaveInstanceState(Bundle outState) {...}保存一些变量的状态,然后使用onRestoreInstanceState(Bundle savedInstanceState){...}恢复它们。
在onCreate方法设置myWebView后,我做了以下操作:

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

svmlkihl8#

正如Dino Fancellu指出的,这是一个坏错误,但我认为它只适用于Android项目中的资产本地文件。
令人难以置信的是,这个bug在2+版本(Froyo)中并不存在。
而且我的应用程序严重依赖于将url变量传递给/asset/ files。
我只传递了一个变量(?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://url。据我所知,WebView没有抛出错误。您的php脚本是:“函数名必须是/var/www/stage/ www.example.com中的字符串realtylog.net/iPhone/functions.php“

这可能有用:
PHP Fatal error: Function name must be a string

相关问题