Ionic build cannot find module error. How to import Android plugin?

I'm trying to develop an Android Plugin to use in an Ionic app.

I created the app with a starter project already provided by Ionic using ionic start myApp tabs.

I have also created, in a different folder, my plugin, that contains the following files.

plugin.xml
<?xml version="1.0" encoding="UTF-8"?>
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
    id="location-plugin" version="0.0.1">
<name>GSLocationManager</name>
<description>Location Plugin</description>
<license>MIT</license>
<keywords>cordova,device,sensors,location</keywords>

<js-module name=“LocationManager” src=“www/LocationManager.js”>
<clobbers target=“LocationManager” />
</js-module>

<engines>
<engine name=“cordova” version=“>=3.6.0”></engine>
</engines>

<platform name=“android”>
<preference name=“GOOGLE_PLAY_SERVICES_VERSION” default=“11+”/>
<preference name=“ANDROID_SUPPORT_LIBRARY_VERSION” default=“26+”/>
<preference name=“ICON” default=“@mipmap/icon” />
<preference name=“SMALL_ICON” default=“@mipmap/icon” />
<preference name=“ACCOUNT_NAME” default=“@string/app_name” />
<preference name=“ACCOUNT_LABEL” default=“@string/app_name” />
<preference name=“ACCOUNT_TYPE” default=“$PACKAGE_NAME.account” />
<preference name=“CONTENT_AUTHORITY” default=“$PACKAGE_NAME” />

<framework src=“com.google.android.gms:play-services-location:$GOOGLE_PLAY_SERVICES_VERSION” />
<framework src=“com.android.support:support-v4:$ANDROID_SUPPORT_LIBRARY_VERSION” />
<framework src=“com.android.support:appcompat-v7:$ANDROID_SUPPORT_LIBRARY_VERSION” />
<!-- <framework src=“android/dependencies.gradle” custom=“true” type=“gradleReference”/> -->

<source-file src=“path/to/locationmanager/GSLocationManager.java”
target-dir=“path/to/locationmanager”></source-file>

<config-file target=“AndroidManifest.xml” parent=“/manifest”>
<uses-permission android:name=“android.permission.AUTHENTICATE_ACCOUNTS” />
<uses-permission android:name=“android.permission.READ_SYNC_SETTINGS” />
<uses-permission android:name=“android.permission.WRITE_SYNC_SETTINGS” />
<uses-permission android:name=“android.permission.RECEIVE_BOOT_COMPLETED” />
<uses-permission android:name=“com.google.android.gms.permission.ACTIVITY_RECOGNITION” />
<uses-permission android:name=“android.permission.ACCESS_NETWORK_STATE” />
<uses-permission android:name=“android.permission.ACCESS_COARSE_LOCATION” />
<uses-permission android:name=“android.permission.ACCESS_FINE_LOCATION” />
<uses-permission android:name=“android.permission.ACCESS_LOCATION_EXTRA_COMMANDS” />
<uses-permission android:name=“android.permission.INTERNET” />
<uses-permission android:name=“android.permission.WAKE_LOCK” />
<uses-permission android:name=“android.hardware.location” />
</config-file>

<config-file target=“res/xml/config.xml” parent=“/*”>
<feature name=“GSLocationManager”>
<param name=“android-package” value=“android.package.locationmanager.GSLocationManager” />
</feature>
</config-file>
</platform>

locationManager.js
var GSLocationManager = {
getCurrentLocation: function(success, failure) {
exec(success, failure, ‘GSLocationManager’, ‘getCurrentLocation’, []);
}
}

module.exports = GSLocationManager;

GSLocationManager.java
package android.package.locationmanager;

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

import org.json.JSONArray;
import org.json.JSONObject;
import org.json.JSONException;

import android.annotation.SuppressLint;
import android.content.Context;
import android.location.Location;
import android.location.LocationManager;

public class GSLocationManager extends CordovaPlugin {

private JSONObject data = new JSONObject();

// at the initialize function, we can configure the tools we want to use later, like the sensors
@Override
public void initialize(CordovaInterface cordova, CordovaWebView webView) {
    super.initialize(cordova, webView);

}

// safety unregistering from the events if the application stops somehow
@Override
public void onDestroy() {

}

// this is the main part of the plugin, we have to handle all of the actions sent from the js
@Override
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
    if ("getCurrentLocation".equals(action)) {
        Location location = getCurrentLocation();
        JSONObject json = new JSONObject();
        json.put("latitude", location.getLatitude());
        json.put("longitude", location.getLongitude());
        callbackContext.success(json);
        return true;
    }
    return false;  // Returning false results in a "MethodNotFound" error.
}

@SuppressLint("MissingPermission")
private Location getCurrentLocation() {
    LocationManager locationManager = (LocationManager) cordova.getActivity().getApplicationContext().getSystemService(Context.LOCATION_SERVICE);

    Location lastKnownGPSLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
    return lastKnownGPSLocation;
}

}

Then I created a package.json for my plugin usign plugman And after that, added my android plugin to my Ionic project by doing ionic cordova plugin add path/to/my/plugin

But I cannot seem to be able to import my plugin to app.module.ts using import { GSLocationManager } from ‘globespinning-location-plugin’ I try to build but CLI says ERROR in src/app/app.module.ts(12,31): error TS2307: Cannot find module ‘globespinning-location-plugin’.

Any idea where the error is? How should I import a plugin created by me, and referenced from a local folder? I want to be able to call GSLocationManager.getCurrentLocation() inside my ionic app.

#android #angular #ionic #cordova

3 Likes20.20 GEEK