You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@cordova.apache.org by 张雪魂 <zh...@gmail.com> on 2013/01/21 07:31:25 UTC

I think there is a bug in the android geolocation plugin of Phonegap 2.3

When I call the watchPosition function, it only call back
my successCallback function 2 times and errorCallback function once. That
is, It only fires timeout event once. Then the plugin doesn't give to me
the position. I read the plugin source, I think there are some problems.
Then I modify them, the plugin runs well.
1、I modify the win and fail method in the org.apache.cordova.GeoBroker as
the following:

public void win(Location loc, CallbackContext callbackContext, boolean
keepCallback) {
     PluginResult result = new PluginResult(PluginResult.Status.OK,
this.returnLocationJSON(loc));
     result.setKeepCallback(keepCallback);
        callbackContext.sendPluginResult(result);
}

public void fail(int code, String msg, CallbackContext callbackContext,
boolean keepCallback) {
        JSONObject obj = new JSONObject();
        String backup = null;
        try {
            obj.put("code", code);
            obj.put("message", msg);
        } catch (JSONException e) {
            obj = null;
            backup = "{'code':" + code + ",'message':'" +
msg.replaceAll("'", "\'") + "'}";
        }
        PluginResult result;
        if (obj != null) {
            result = new PluginResult(PluginResult.Status.ERROR, obj);
        } else {
            result = new PluginResult(PluginResult.Status.ERROR, backup);
        }

        result.setKeepCallback(keepCallback);
        callbackContext.sendPluginResult(result);
    }

2、I modify the win and fail method in
the org.apache.cordova.CordovaLocationListener as the following:

private void win(Location loc) {
        for (CallbackContext callbackContext: this.callbacks)
        {
            this.owner.win(loc, callbackContext, false);
        }
        this.callbacks.clear();

        if(this.owner.isGlobalListener(this) && this.size() == 0)
        {
         Log.d(TAG, "Stopping global listener");
         this.stop();
        }
        Iterator<CallbackContext> it = this.watches.values().iterator();
        while (it.hasNext()) {
            this.owner.win(loc, it.next(), true);
        }
    }

protected void fail(int code, String message) {
        for (CallbackContext callbackContext: this.callbacks)
        {
            this.owner.fail(code, message, callbackContext, false);
        }
        this.callbacks.clear();

        if(this.owner.isGlobalListener(this) && this.size() == 0)
        {
         Log.d(TAG, "Stopping global listener");
         this.stop();
        }
        Iterator<CallbackContext> it = this.watches.values().iterator();
        while (it.hasNext()) {
            this.owner.fail(code, message, it.next(), true);
        }
    }

Re: I think there is a bug in the android geolocation plugin of Phonegap 2.3

Posted by Shazron <sh...@gmail.com>.
Thanks,
Please file an issue at http://issues.cordova.io - this mailing list is for
the discussion of the development of the Cordova API only.


On Sun, Jan 20, 2013 at 10:31 PM, 张雪魂 <zh...@gmail.com> wrote:

> When I call the watchPosition function, it only call back
> my successCallback function 2 times and errorCallback function once. That
> is, It only fires timeout event once. Then the plugin doesn't give to me
> the position. I read the plugin source, I think there are some problems.
> Then I modify them, the plugin runs well.
> 1、I modify the win and fail method in the org.apache.cordova.GeoBroker as
> the following:
>
> public void win(Location loc, CallbackContext callbackContext, boolean
> keepCallback) {
>      PluginResult result = new PluginResult(PluginResult.Status.OK,
> this.returnLocationJSON(loc));
>      result.setKeepCallback(keepCallback);
>         callbackContext.sendPluginResult(result);
> }
>
> public void fail(int code, String msg, CallbackContext callbackContext,
> boolean keepCallback) {
>         JSONObject obj = new JSONObject();
>         String backup = null;
>         try {
>             obj.put("code", code);
>             obj.put("message", msg);
>         } catch (JSONException e) {
>             obj = null;
>             backup = "{'code':" + code + ",'message':'" +
> msg.replaceAll("'", "\'") + "'}";
>         }
>         PluginResult result;
>         if (obj != null) {
>             result = new PluginResult(PluginResult.Status.ERROR, obj);
>         } else {
>             result = new PluginResult(PluginResult.Status.ERROR, backup);
>         }
>
>         result.setKeepCallback(keepCallback);
>         callbackContext.sendPluginResult(result);
>     }
>
> 2、I modify the win and fail method in
> the org.apache.cordova.CordovaLocationListener as the following:
>
> private void win(Location loc) {
>         for (CallbackContext callbackContext: this.callbacks)
>         {
>             this.owner.win(loc, callbackContext, false);
>         }
>         this.callbacks.clear();
>
>         if(this.owner.isGlobalListener(this) && this.size() == 0)
>         {
>          Log.d(TAG, "Stopping global listener");
>          this.stop();
>         }
>         Iterator<CallbackContext> it = this.watches.values().iterator();
>         while (it.hasNext()) {
>             this.owner.win(loc, it.next(), true);
>         }
>     }
>
> protected void fail(int code, String message) {
>         for (CallbackContext callbackContext: this.callbacks)
>         {
>             this.owner.fail(code, message, callbackContext, false);
>         }
>         this.callbacks.clear();
>
>         if(this.owner.isGlobalListener(this) && this.size() == 0)
>         {
>          Log.d(TAG, "Stopping global listener");
>          this.stop();
>         }
>         Iterator<CallbackContext> it = this.watches.values().iterator();
>         while (it.hasNext()) {
>             this.owner.fail(code, message, it.next(), true);
>         }
>     }
>