I know this isn’t a specific ionic native issue as i am only making a cordova plugin at the moment, but i am currently at a loss and looking for help from anywhere, so if anyone has any information or can point me in the right direction, that would be very helpful.
So I have an ionic 3 application that i need to add an android sdk to. there is no plugin for it so I have to create a cordova plugin for it. I tried for a few days now, and i can get the plugin to install and build, error free, but calling the plugin methods don’t seem to do anything. I can get the js file of the plugin to output console.logs but the java file doesn’t seem to be running at all. this is my ionic info for my project. I have zero experience with java code or cordova plugin development so i’ve hit a major roadblock as i cannot figure out why the java code is not being called. can anyone see what i am doing wrong?
Ionic:
ionic (Ionic CLI) : 4.4.0 (/usr/local/lib/node_modules/ionic)
Ionic Framework : ionic-angular 3.9.2
@ionic/app-scripts : 3.2.0
Cordova:
cordova (Cordova CLI) : 8.1.2 (cordova-lib@8.1.1)
Cordova Platforms : android 7.1.4, ios 4.5.5
Cordova Plugins : cordova-plugin-ionic-webview 1.2.1, (and 31 other plugins)
System:
ios-deploy : 1.9.4
NodeJS : v10.7.0 (/usr/local/bin/node)
npm : 6.4.1
OS : macOS High Sierra
Xcode : Xcode 10.1 Build version 10B61
This is my Plugin.xml
<?xml version='1.0' encoding='utf-8'?>
<plugin id="cordova-plugin-chirp"
version="0.1.0"
xmlns="http://apache.org/cordova/ns/plugins/1.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<name>chirp</name>
<js-module name="chirp" src="www/chirp.js">
<clobbers target="cordova.plugins.chirp" />
</js-module>
<platform name="ios">
<config-file parent="/*" target="config.xml">
<feature name="chirp">
<param name="ios-package" value="chirp" />
</feature>
</config-file>
<header-file src="src/ios/chirp.h" />
<source-file src="src/ios/chirp.m" />
</platform>
<platform name="android">
<source-file src="src/android/chirp.java" target-dir="src/org/apache/cordova/plugin/chirp" />
<source-file framework="true" src="src/android/libs/chirp-connect-release.aar" target-dir="libs"/>
<!-- <framework src="src/android/chirp.gradle" custom="true" type="gradleReference" /> -->
<config-file parent="/*" target="res/xml/config.xml">
<feature name="chirp">
<param name="android-package" value="org.apache.cordova.plugin.chirp" />
</feature>
</config-file>
<config-file parent="/*" target="AndroidManifest.xml">
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
</config-file>
</platform>
</plugin>
This is my js file. chirp.js:
var exec = require('cordova/exec');
var chirp ={
getPermissions:function(message){
console.log(message);
exec(null, null, 'Chirp', 'getPermissions', [message]);
},
start:function(message){
console.log(message);
exec(null, null, 'Chirp', 'start', [message]);
},
send:function(message){
console.log(message);
exec(null, null, 'Chirp', 'send', [message]);
}
};
module.exports = chirp
This is my gradle file. chirp.gradle:
repositories {
jcenter()
flatDir {
dirs 'libs'
}
}
dependencies {
compile(name:'chirp-connect-release', ext:'aar')
}
android {
packagingOptions {
exclude 'META-INF/NOTICE'
exclude 'META-INF/LICENSE'
}
}
and this is my java file. chirp.java:
package com.chirp.cordova.plugin;
import android.content.Context;
import android.content.pm.PackageManager;
import android.Manifest;
import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaInterface;
import org.apache.cordova.CordovaWebView;
import org.apache.cordova.LOG;
import org.apache.cordova.CordovaArgs;
import org.apache.cordova.PluginResult;
import org.apache.cordova.PermissionHelper;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import io.chirp.connect.ChirpConnect;
import io.chirp.connect.interfaces.ConnectEventListener;
import io.chirp.connect.interfaces.ConnectSetConfigListener;
import io.chirp.connect.models.ChirpError;
import io.chirp.connect.models.ConnectState;
/**
* This class echoes a string called from JavaScript.
*/
public class chirp extends CordovaPlugin {
private ChirpConnect chirpConnect;
private Context context;
CallbackContext callbackC;
String TAG = "ChirpPlugin";
String [] permissions = {Manifest.permission.MODIFY_AUDIO_SETTINGS, Manifest.permission.RECORD_AUDIO, Manifest.permission.INTERNET, Manifest.permission.ACCESS_NETWORK_STATE};
public static final int SEARCH_REQ_CODE = 0;
public static final int SAVE_REQ_CODE = 1;
public static final int REMOVE_REQ_CODE = 2;
public static final int PICK_REQ_CODE = 3;
public String executeArgs = "";
String KEY = "myKey";
String SECRET = "mySecret";
String CONFIG = "myConfig";
@Override
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
callbackC = callbackContext;
LOG.d(TAG, "We are entering execute");
if (action.equals("start")){
if(hasPermission()){
String message = args.getString(0);
executeArgs = message;
// start(message);
callbackContext.success();
return true;
} else {
PermissionHelper.requestPermissions(this, 0, permissions);
}
} else if (action.equals("send")){
String message = args.getString(0);
this.send(message);
callbackContext.success();
return true;
}
return false;
};
public chirp(Context context) {
this.context = context;
};
@Override
public void initialize(CordovaInterface cordova, CordovaWebView webView) {
super.initialize(cordova, webView);
ChirpConnect chirpConnect = new ChirpConnect(context, KEY, SECRET);
chirpConnect.setConfigFromNetwork(new ConnectSetConfigListener(){
@Override
public void onSuccess(){
chirpConnect.setListener(connectEventListener);
LOG.i("setConfig", "Config successfully set");
}
@Override
public void onError(ChirpError setConfigError){
LOG.e("setConfigError", setConfigError.getMessage());
}
});
};
ConnectEventListener connectEventListener = new ConnectEventListener() {
@Override
public void onSending(byte[] payload, byte channel) {
LOG.v("chirpConnectDemoApp", "This is called when a payload is being sent " + payload + " on channel: " + channel);
}
@Override
public void onSent(byte[] payload, byte channel) {
LOG.v("chirpConnectDemoApp", "This is called when a payload has been sent " + payload + " on channel: " + channel);
}
@Override
public void onReceiving(byte channel) {
LOG.v("chirpConnectDemoApp", "This is called when the SDK is expecting a payload to be received on channel: " + channel);
}
@Override
public void onReceived(byte[] payload, byte channel) {
LOG.v("chirpConnectDemoApp", "This is called when a payload has been received " + payload + " on channel: " + channel);
}
@Override
public void onStateChanged(byte oldState, byte newState) {
LOG.v("chirpConnectDemoApp", "This is called when the SDK state has changed " + oldState + " -> " + newState);
}
@Override
public void onSystemVolumeChanged(int old, int current) {
LOG.d("chirpConnectDemoApp", "This is called when the Android system volume has changed " + old + " -> " + current);
}
};
private void start(String message) {
if (message != null && message.length() > 0) {
chirpConnect.start();
}
};
private void send(String message) {
if (message != null && message.length() > 0) {
long maxLength = chirpConnect.getMaxPayloadLength();
byte[] payload = chirpConnect.randomPayload(maxLength);
chirpConnect.send(payload);
}
};
public boolean hasPermission() {
for(String p : permissions)
{
if(!PermissionHelper.hasPermission(this, p))
{
return false;
}
}
return true;
}
public void requestPermissions(int requestCode)
{
PermissionHelper.requestPermissions(this, requestCode, permissions);
}
}