PhoneGap 4.2.0-0.24.2(Cordova 4.3.0)插件指南
1. 前言
利用phonegap的擴展可以實現用web API調用手機的本地功能,如二維碼掃描,拍照等。而由於 phonegap 升級較快,在 3.X 之後改變了它的插件機制,所有調用手機原生的功能全部以外部插件的形式提供,創建 phonegap 項目之後不再能夠直接調用系統功能 API 如 camera ,device 等,所以必須以插件的形式引入到項目中來,才能夠使用。
2. 使用第三方插件
> cordova plugin searchkeyword(搜索相關keyword插件)
> cordova plugin addorg.apache.cordova.device
> cordova plugin add org.apache.cordova.console
> cordova plugin ls
插件可以從很多地方安裝:
第三方插件庫:http://plugins.cordova.io/#/
插件名(從plugin repository下載):cordova plugin addorg.apache.cordova.console
git地址:cordovaplugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-camera.git
本地地址:cordova plugin add d:\cordova-3.3.0\cordova-plugin-camera
本地文件:cordova plugin add plugin.tar.gz
指定版本
cordova plugin add [email protected]
cordova plugin add https://github.com/apache/cordova-plugin-console.git#r0.2.0
cordova plugin add https://github.com/someone/aplugin.git#:/my/sub/dir
cordova plugin add https://github.com/someone/aplugin.git#r0.0.1:/my/sub/dir
等等
3. 自定義插件
(1) 新建class文件(插件類),繼承CordovaPlugin,重寫execute()方法:
Echo.java
import android.util.Log;
import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaInterface;
import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.CordovaWebView;
import org.json.JSONArray;
import org.json.JSONException;
/**
* Created by Rickyon 3/9/2015.
*/
public class Echo extends CordovaPlugin {
//初始化
@Override
public voidinitialize(CordovaInterface cordova, CordovaWebView webView) {
super.initialize(cordova, webView);
// yourinit code here
}
@Override
publicboolean execute(String action, JSONArray args, CallbackContext callbackContext)throws JSONException {
if(action.equals("echo")) {
String message = args.getString(0);
this.echo(message, callbackContext);
return true;
}
returnfalse;
}
private voidecho(final String message, final CallbackContext callbackContext) {
/**
* Theplugin's JavaScript does not run in the main thread of the WebView interface;
* instead,it runs on the WebCore thread, as does the execute method.
* If youneed to interact with the user interface, you should use the followingvariation:
*/
cordova.getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
if(message != null && message.length() > 0) {
Log.e("messageis","......................"+message);
callbackContext.success(message);
} else {
callbackContext.error("Expected one non-empty stringargument.");
}
}
/**
* Usethe following if you do not need to run on the main interface's thread,
* but donot want to block the WebCore thread either:
*
*cordova.getThreadPool().execute(newRunnable() {
* public void run() {
* ...
* callbackContext.success(); // Thread-safe.
* }
*});
*/
});
}
}
(2) 在JS中調用Native code:
(注:cordova.exec(successcallback, failcallback, service, action, array);爲JavaScript調用Nativ code的入口,其通過匹配service在config.xml文件中對應的文件位置(包),找到對應的Java文件,並執行裏面的execute方法。其中successcallback和failcallback分別爲成功或者失敗時要調用的function,service爲插件名,action爲js要完成的動作,array爲Json信息)
echo.js
window.echo = function(str, callback) {
cordova.exec(callback, function(err){callback('Nothing to echo.'); }, "Echo", "echo", [str]);
}
(3) 在index.html中調用js代碼:
(注:1、addEventListener爲cordova中的API事件監聽器;2、得監聽deviceready事件,否則插件不起作用。)
index.html
<script>
document.addEventListener("deviceready",onDeviceReady, false);
function onDeviceReady() {
window.echo("Hello,Plugin!", function(echoValue) {
alert(echoValue == "Hello,Plugin!");
});
}
</script>
(4) 在config.xml中註冊插件:
(注:feature的name爲上面cordova.exec()中Service,一般使用java文件名。而com.oocl.myapplication.echo爲Echo.java文件的位置。Param的name等於onload,表示app的webview加載時也加載。)
config.xml
<!--Plugins -->
<featurename="Echo">
<param name="android-package"value="com.oocl.myapplication.plugins.Echo" />
<param name="onload" value="true" />
</feature>