Cordova中使用JS调用JAVA,并进行回调,判断手机位置信息是否打开,并将结果进行反馈

cordova判断手机位置信息是否打开,并将结果进行反馈

简要描述

JS调用java方法,并进行回调


配置文件的具体方法

需要配置的内容如下(举例)

1.在html页面调用JS
 windows.geoJslocation.getLocation()

windows.geoJslocation 需要与 cordova_plugins.js 中的 clobbers 下的命名一致;

2.定义JS调用java方法
 cordova.define("cordova-plugin-geolocation.location", function(require, exports, module) {
     var exec = require('cordova/exec');
     module.exports = {
     getLocation: function (success, error, args) {
                  var win = function (result) {
                  if(result=="true"){
                  success(result);
                  }else{
                   success(result);
                  }
                  };
                  var fail = function (result) {
                  if(result=="false"){
                    NoOpen(result)
                  }
                  };
             exec(win,fail, 'GeoJsLocation', 'getLocation', []);
			 //五个参数分别win请求成功返回数据;fail请求失败返回的数据;GeoJsLocation为java类名;
			 //getLocation为传递的action,java方法中会用到;[]传递参数
        }
    };
});

cordova-plugin-geolocation.location 与 cordova_plugins.js 中定义的 id 保持一致

3.定义java方法
public class GeoJsLocation extends CordovaPlugin {
    private static final String TAG = "Location";
   private  PluginResult pluginResult;
    String r;
    @Override
    public boolean execute(final String action, final JSONArray args, final CallbackContext callbackContext) throws JSONException {
        Log.v(TAG,"判断定位");
        if ("getLocation".equals(action)) {
         if(isLocationEnabled()){
             r="true";
            // callbackContext.success(r);
			//CallbackContext.success() 方法默认只会执行一次回调,如果想通过一个 CallbackContext 重复发送回调结果就会失败;可以自定义 PluginResult 对象,并调用 setKeepCallback(true); 方法保持
             pluginResult = new PluginResult(PluginResult.Status.OK, r);
             pluginResult.setKeepCallback(true);
             callbackContext.sendPluginResult(pluginResult);
             Log.v(TAG,"定位打开");
             return true;
         }else{
              r="false";
             //callbackContext.success(r);
             pluginResult = new PluginResult(PluginResult.Status.OK, r);
             pluginResult.setKeepCallback(true);
             callbackContext.sendPluginResult(pluginResult);
             Log.v(TAG,"定位未打开");
         }
            return true;
        }
        return false;
    }
    //判断手机位置信息是否打开
    public boolean isLocationEnabled() {
        int locationMode = 0;
        String locationProviders;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            try {
		//MyApplication.getContext()获取全局上下文,一般不推荐,但是这里是判断整个app位置服务。
           locationMode = Settings.Secure.getInt
		   (MyApplication.getContext().getContentResolver(), Settings.Secure.LOCATION_MODE);
            } catch (Settings.SettingNotFoundException e) {
                e.printStackTrace();
                return false;
            }
            return locationMode != Settings.Secure.LOCATION_MODE_OFF;
        } else {
            locationProviders =     Settings.Secure.getString
			(MyApplication.getContext().getContentResolver(),  
			Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
            return !TextUtils.isEmpty(locationProviders);
        }
    }
}
4.路径:src/main/assets/www/cordova_plugins.js
 {
          "id": "cordova-plugin-geolocation.location",
          "file": "plugins/cordova-plugin-geolocation/www/android/location.js",//自定义js路径
          "pluginId": "cordova-plugin-location",//与module.exports.metadata的声明保持一致
          "clobbers": [
            "windows.geoJslocation"
          ]
        },
module.exports.metadata = {
  "cordova-plugin-location":"1.0.0"
 };

5.路径:src/main/res/xml/config.xml

<!--手机定位服务是否打开-->
    <feature name="GeoJsLocation">//java类名字
        <param
            name="android-package"
            value="org.apache.cordova.plugins.geolocation.GeoJsLocation" />//java类路径
    </feature>

java方法返回结果与html进行交互

在上面的java方法中,CallbackContext是用来回调的。

 public boolean execute(final String action, final JSONArray args, final CallbackContext callbackContext) throws JSONException

但需要使得到的数据返回时,可以在java方法中使用以下方法
1.CallbackContext

callbackContext.success(r);

2.PluginResult

PluginResult pluginResult = new PluginResult(PluginResult.Status.OK, r);
             pluginResult.setKeepCallback(true);
             callbackContext.sendPluginResult(pluginResult);

Android 中的 CallbackContext.success() 方法默认只会执行一次回调,如果想通过一个 CallbackContext 重复发送回调结果就会失败。这时我们可以自定义 PluginResult 对象,并调用 setKeepCallback(true);
参考:https://www.jianshu.com/p/58017c929b90

数据返回js

使用上述封装的两个java类中的任意一个,返回的结果会自动返回js

 var win = function (result) {
           if(result==true){
              success(result);
           }else{
              success(result);
           }
        };
  var fail = function (res) {
         };
             exec(win,fail, 'GeoJsLocation', 'getLocation', []);

win为请求成功返回的数据,fail则为失败返回的数据。

html页面接收数据
    success_callback=function(info){//js返回数据给此function方法
    alert(info);
    }
	fail_callback=function(info){//js返回数据给此function方法
    alert(info);
    }
    windows.geoJslocation.getLocation(success_callback,fail_callback,null)//调用js。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

就是不掉头发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值