Как создать плагин Cordova с помощью SDK - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть приложение ionic 3, к которому нужно добавить Android SDK.для него нет плагина, поэтому я должен создать для него кордовый плагин.Я пытался в течение нескольких дней, и я могу получить плагин для установки и сборки, без ошибок, но вызов методов плагина, похоже, ничего не делает.Я могу получить js-файл плагина для вывода console.logs, но java-файл, похоже, не работает вообще.это моя ионная информация для моего проекта.У меня нулевой опыт разработки Java-кода или плагина Cordova, поэтому я столкнулся с серьезным препятствием, так как не могу понять, почему не вызывается Java-код.Кто-нибудь может увидеть, что я делаю не так?Ionic:

ionic (Ionic CLI): 4.4.0 (/ usr / local / lib / node_modules / ionic) Ionic Framework: ионно-угловой 3.9.2 @ ionic / app-scripts: 3.2.0

Cordova:

Cordova (CLI Cordova): 8.1.2 (cordova-lib@8.1.1) Платформы Cordova: Android 7.1.4, IOS 4.5.5 Плагины Cordova: Cordova-plugin-ionic-webview 1.2.1, (и 31 другой плагин)

Система:

ios-deploy: 1.9.4 NodeJS: v10.7.0 (/ usr / local / bin / node) npm:6.4.1 ОС: macOS High Sierra Xcode: Xcode 10.1 Версия сборки 10B61

Это мой 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>

Это мой js-файл.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

Это мой файл Gradle.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'
    }
}

и это мой файл Java.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);
    }
}

1 Ответ

0 голосов
/ 19 декабря 2018

Одна вещь, которую я заметил, это то, что целевой путь к файлу для вашего плагина Java-файла неверен:

<source-file src="src/android/chirp.java" target-dir="src/org/apache/cordova/plugin/chirp" />

Имя пакета вашего chirp класса равно com.chirp.cordova.plugin, поэтому target-dir должнобыть src/org/apache/cordova/plugin не src/org/apache/cordova/plugin/chirp, то есть:

<source-file src="src/android/chirp.java" target-dir="src/org/apache/cordova/plugin" />

Обратите внимание, что value, требуемый для <param name="android-package">, на самом деле является полным именем класса (не именем пакета), поэтому имя android-package несколько вводит в заблуждение.Поэтому то, что у вас сейчас есть, правильно:

<param name="android-package" value="org.apache.cordova.plugin.chirp" />

Если вы разрабатываете плагин Cordova, я бы порекомендовал вам отладить реализации Android и iOS с использованием Android Studio и Xcode соответственно.

Если вызапустив ваш плагин в приложении для тестирования в Android Studio, вы увидите предупреждение в выводе logcat, которое указывает на то, что Cordova не может найти собственную реализацию указанного плагина.Также вы можете отлаживать любые проблемы в собственном плагине Java-кода, используя пошаговый отладчик в Android Studio.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...