iT邦幫忙

DAY 9
0

x86 android 設備與外部硬體溝通研究系列 第 9

x86 android 設備與外部硬體溝通研究 - Cordova Plugin (9/30)

  • 分享至 

  • xImage
  •  

今天要介紹使用 android nactive java code 的 cordova plugin

有興趣的朋友可以一邊參考官方的文件: REF

我們拿昨天用的加速度計 plugin 做解說,看完也就會寫了。source code is document :P

撰寫 cordova plugin 的大致流程如下:

  1. 在 .\platforms\android\src 資料夾中放入你的 package \ class ex : .\platforms\android\src\org\apache\cordova\devicemotion\AccelListener.java

  2. 有沒有很眼熟?上面這段就是我們昨天使用 <plugin name="Accelerometer" value="org.apache.cordova.AccelListener" /> 呼叫的資訊,其中藍色部分是 package name , 紅色部分是 class name

  3. 你撰寫的 class 中最重要的是要:

  4. import cordova plugin class ,當然要注意是否要用到 cordova webUI view 的內容,這個要視情況 import

- 像是這樣
- 
import org.apache.cordova.CordovaWebView;
import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaInterface;
import org.apache.cordova.CordovaPlugin; // 必要!!
import org.apache.cordova.PluginResult;  // 必要!!
  1. 建立 excute public method 跟外部的 cordova js code 串接溝通
- 
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) {
        if (action.equals("start")) { // 呼叫 start method
            this.callbackContext = callbackContext;
            if (this.status != AccelListener.RUNNING) {
                // If not running, then this is an async call, so don't worry about waiting
                // We drop the callback onto our stack, call start, and let start and the sensor callback fire off the callback down the road
                this.start();
            }
        }
        else if (action.equals("stop")) { // 呼叫 stop method
            if (this.status == AccelListener.RUNNING) {
                this.stop();
            }
        } else {
          // Unsupported action
            return false;
        }

        PluginResult result = new PluginResult(PluginResult.Status.NO_RESULT, "");
        result.setKeepCallback(true);
        callbackContext.sendPluginResult(result);
        return true;
    }
  1. 建立對應的 start / stop method
  2. 建立 js 對應的 interface : .\plugins\org.apache.cordova.device-motion\www\Acceleration.js
  • var Acceleration = function(x, y, z, timestamp) {
    this.x = x;
    this.y = y;
    this.z = z;
    this.timestamp = timestamp || (new Date()).getTime();
    };

    module.exports = Acceleration;

  1. js 調用 plugin 方式如下: .\plugins\org.apache.cordova.device-motion\www\accelerometer.js
  • 必要引用相關函式:

    var argscheck = require('cordova/argscheck'), // node js 的調用cordova 套件中的 argscheck.js ... etc 檔案
    utils = require("cordova/utils"),
    exec = require("cordova/exec"), // 執行 plugin 的重頭戲放在這
    Acceleration = require('./Acceleration'); // 引用上面的 interface , 給更外部的 js code 使用,還記得我們昨天使用 onSuccess callback 回傳的 acceleration 資訊跟上面定義的完全相同

  • 使用 exec :

    function start() {
    exec(
    function(a) { // 這是 Success callback !
    var tempListeners = listeners.slice(0);
    accel = new Acceleration(a.x, a.y, a.z, a.timestamp);
    for (var i = 0, l = tempListeners.length; i < l; i++) {
    tempListeners[i].win(accel);
    }
    }, function(e) { // 這是 fail callback !
    var tempListeners = listeners.slice(0);
    for (var i = 0, l = tempListeners.length; i < l; i++) {
    tempListeners[i].fail(e);
    }
    },
    "Accelerometer", // 要求 exec 去調用 Accelerometer class
    "start", // 要求執行 Accelerometer class 中的 start() method
    []);
    running = true;
    }

  • 引用上述 js 檔案,由 watchAcceleration 去執行相關初始化資訊並最後使用 start 呼叫 plugin 中的 java class : method

建立並使用 plugin 的主體流程如上,更多細部的資訊可以去爬上述的相關檔案

我們明天見


上一篇
x86 android 設備與外部硬體溝通研究 - Cordova Sensor (8/30)
下一篇
x86 android 設備與外部硬體溝通研究 - Arduino 開發環境 (10/30)
系列文
x86 android 設備與外部硬體溝通研究30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言