ionic2

自定义cordova插件-进阶

2018-02-13  本文已影响643人  昵称已被使用_

前言

运行高德定位demo

项目中添加定位功能

关于申请key这里有更详细介绍

 <service android:name="com.amap.api.location.APSService"></service>
 <meta-data android:name="com.amap.api.v2.apikey" android:value="e36b642d723fd530a960eb1c5cf38953"/>

由于sdk版本大于23以上的app要动态申请定位权限,所以这里使用sdk版本为22.默认有app需要的所有权限

 <!--用于进行网络定位-->
  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
  <!--用于访问GPS定位-->
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
  <!--用于获取运营商信息,用于支持提供运营商信息相关的接口-->
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
  <!--用于访问wifi网络信息,wifi信息会用于进行网络定位-->
  <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
  <!--用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
  <!--用于访问网络,网络定位需要上网-->
  <uses-permission android:name="android.permission.INTERNET"/>
  <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
  <!--用于读取手机当前的状态-->
  <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
  <!--用于写入缓存数据到扩展存储卡-->
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  <!--用于申请调用A-GPS模块-->
  <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
  <!--用于申请获取蓝牙信息进行室内定位-->
  <uses-permission android:name="android.permission.BLUETOOTH"/>
  <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
  <!--<uses-sdk android:minSdkVersion="16" android:targetSdkVersion="25"/>-->
  <uses-sdk android:maxSdkVersion="22" android:minSdkVersion="16" android:targetSdkVersion="22" />
package com.kit.cordova.nativeLocation;

import android.content.Context;
import android.util.Log;

import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationListener;

import org.apache.cordova.CordovaInterface;
import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.CallbackContext;

import org.apache.cordova.CordovaWebView;
import org.apache.cordova.PluginResult;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class NativeLocation extends CordovaPlugin {

  CallbackContext callbackContext = null;

  //声明AMapLocationClient类对象
  AMapLocationClient mLocationClient = null;

  //声明定位回调监听器
  AMapLocationListener mLocationListener = new AMapLocationListener() {
    @Override
    public void onLocationChanged(AMapLocation aMapLocation) {
      if (aMapLocation != null) {
        if (aMapLocation.getErrorCode() == 0) {
          int locationType = aMapLocation.getLocationType();//获取当前定位结果来源 定位类型对照表: http://lbs.amap.com/api/android-location-sdk/guide/utilities/location-type/
          Double latitude = aMapLocation.getLatitude();//获取纬度
          Double longitude = aMapLocation.getLongitude();//获取经度
          JSONObject jo = new JSONObject();
          try {
            jo.put("locationType", locationType);
            jo.put("latitude", latitude);
            jo.put("longitude", longitude);
          } catch (JSONException e) {
            jo = null;
            e.printStackTrace();
          }
          Log.w("定位成功:", jo.toString());
          callbackContext.success(jo);
        } else {
          // 错误码对照表 http://lbs.amap.com/api/android-location-sdk/guide/utilities/errorcode/
          Log.e("定位失败错误码:", aMapLocation.getAdCode());
          Log.e("定位失败信息:", aMapLocation.getErrorInfo());
          callbackContext.error(aMapLocation.getErrorCode());
        }
      }
    }
  };

  @Override
  public void initialize(CordovaInterface cordova, CordovaWebView webView) {
    super.initialize(cordova, webView);
    Context context = this.cordova.getActivity().getApplicationContext();
    mLocationClient = new AMapLocationClient(context);
    mLocationClient.setLocationListener(mLocationListener);
    AMapLocationClientOption mLocationOption = new AMapLocationClientOption();
    mLocationOption.setLocationPurpose(AMapLocationClientOption.AMapLocationPurpose.SignIn);// 使用签到定位场景
    mLocationClient.setLocationOption(mLocationOption); // 设置定位参数
  }

  @Override
  public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
    this.callbackContext = callbackContext;
    if (action.equals("coolMethod")) {
      // 设置场景模式后最好调用一次stop,再调用start以保证场景模式生效
      mLocationClient.stopLocation();
      mLocationClient.startLocation(); // 启动定位
      PluginResult r = new PluginResult(PluginResult.Status.NO_RESULT);
      r.setKeepCallback(true);
      callbackContext.sendPluginResult(r);
      return true;
    }
    return false;
  }
}

调试

定位key配置错误或key在AndroidManifest.xml文件位置不正确

app没有定位权限,日志如下,错误码为12.设置sdk版本为22或者手动在系统设置中打开app定位权限

插件集成

<?xml version='1.0' encoding='utf-8'?>
<plugin id="com.kit.cordova.nativeLocation" version="0.0.1" xmlns="http://apache.org/cordova/ns/plugins/1.0"
        xmlns:android="http://schemas.android.com/apk/res/android">
  <name>nativeLocation</name>
  <js-module name="nativeLocation" src="www/nativeLocation.js">
    <clobbers target="cordova.plugins.nativeLocation"/>
  </js-module>
  <platform name="android">
    <config-file parent="/*" target="res/xml/config.xml">
      <feature name="nativeLocation">
        <!--这里的value是包名加类名-->
        <param name="android-package" value="com.kit.cordova.nativeLocation.NativeLocation"/>
      </feature>
    </config-file>

    <config-file target="AndroidManifest.xml" parent="/manifest">
      <!--用于进行网络定位-->
      <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
      <!--用于访问GPS定位-->
      <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
      <!--用于获取运营商信息,用于支持提供运营商信息相关的接口-->
      <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
      <!--用于访问wifi网络信息,wifi信息会用于进行网络定位-->
      <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
      <!--用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
      <!--用于访问网络,网络定位需要上网-->
      <uses-permission android:name="android.permission.INTERNET"/>
      <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
      <!--用于读取手机当前的状态-->
      <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
      <!--用于写入缓存数据到扩展存储卡-->
      <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
      <!--用于申请调用A-GPS模块-->
      <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
      <!--用于申请获取蓝牙信息进行室内定位-->
      <uses-permission android:name="android.permission.BLUETOOTH"/>
      <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
    </config-file>

    <config-file target="AndroidManifest.xml" parent="/manifest/application">
      <!-- 定位需要的key -->
      <meta-data android:name="com.amap.api.v2.apikey" android:value="e36b642d723fd530a960eb1c5cf38966"/> 这里填你的key,哈哈
      <!-- 定位需要的服务 -->
      <service android:name="com.amap.api.location.APSService" />
    </config-file>
    <source-file src="src/android/NativeLocation.java" target-dir="src/com/kit/cordova/nativeLocation"/>
    <source-file src="src/android/AMap_Location_V3.7.0_20171218.jar" target-dir="libs"/>
  </platform>
</plugin>
  <preference name="android-minSdkVersion" value="16"/>
  <preference name="android-maxSdkVersion" value="22"/>
  <preference name="android-targetSdkVersion" value="22"/>
 cordova platform rm android
 cordova platform add android
 cordova run android

插件优化

exports.getLocation = function (success, error) {
  exec(success, error, 'nativeLocation', 'getLocation');
};

  click(){
    // getLocation只有两个参数了
    cordova.plugins.nativeLocation.getLocation(res => {
      console.log(res);
    }, err => {
      console.log(err);
    })
  }
cordova plugin rm com.kit.cordova.nativeLocation
cordova plugin add D:\com.kit.cordova.nativeLocation --variable API_KEY=e36b642d723fd530a960eb1c5cf38953
 cordova platform rm android
 cordova platform add android
 cordova run android
上一篇下一篇

猜你喜欢

热点阅读