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。