今天要介紹使用 android nactive java code 的 cordova plugin
有興趣的朋友可以一邊參考官方的文件: REF
我們拿昨天用的加速度計 plugin 做解說,看完也就會寫了。source code is document :P
撰寫 cordova plugin 的大致流程如下:
在 .\platforms\android\src 資料夾中放入你的 package \ class ex : .\platforms\android\src\org\apache\cordova\devicemotion\AccelListener.java
有沒有很眼熟?上面這段就是我們昨天使用 <plugin name="Accelerometer" value="org.apache.cordova.AccelListener" /> 呼叫的資訊,其中藍色部分是 package name , 紅色部分是 class name
你撰寫的 class 中最重要的是要:
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; // 必要!!
-
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;
}
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;
必要引用相關函式:
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 的主體流程如上,更多細部的資訊可以去爬上述的相關檔案
我們明天見