开发Cordova插件

举报
yd_221104950 发表于 2020/12/01 00:52:03 2020/12/01
【摘要】 一、搭建环境 请参考《Cordova创建项目、编译、安装》 二、创建项目: 创建命令:cordova create [文件名] [包名] ~/Desktop/Cordova$ cordova create MyCordovaCamera com.cs.camera Creating a new cordova project. ~/Desktop/Cordova...

一、搭建环境

请参考《Cordova创建项目、编译、安装》

二、创建项目:

创建命令:cordova create [文件名] [包名]

~/Desktop/Cordova$ cordova create MyCordovaCamera com.cs.camera
Creating a new cordova project.
~/Desktop/Cordova$ ls
MyCordovaCamera  

  
 
  • 1
  • 2
  • 3
  • 4

三、在Cordova项目中添加Android平台

1、进入刚刚创建的Cordova项目

~/Desktop/Cordova$ cd MyCordovaCamera

  
 
  • 1

2、在Cordova项目中添加Android平台

~/Desktop/Cordova/MyCordovaCamera$ cordova platform add android

  
 
  • 1

以上是创建Cordova项目,用来测试我们开发的cordova插件用的。下面开始进行插件开发的步骤介绍。

四、安装plugman插件

~$ sudo npm install -g plugman

  
 
  • 1

五、创建一个插件

创建命令:

plugman create --name [插件名] --plugin_id [插件ID] --plugin_version [插件版本号]

  
 
  • 1

我们插件创建在cordova项目的上一级目录:

~/Desktop/Cordova/MyCordovaCamera$ cd ..
~/Desktop/Cordova$ plugman create --name CSCamera --plugin_id com.cs.camera --plugin_version 1.0.0
~/Desktop/Cordova$ ls
CSCamera  MyCordovaCamera 

  
 
  • 1
  • 2
  • 3
  • 4

下面是创建好的插件目录:
在这里插入图片描述创建完插件后,目录如上图所示,其src目录是空的。www目录里有一个CSCamera.js文件。配置文件plugin.xml也仅如下的配置信息:

<?xml version='1.0' encoding='utf-8'?>
<plugin id="com.cs.camera" version="1.0.0" xmlns="http://apache.org/cordova/ns/plugins/1.0" xmlns:android="http://schemas.android.com/apk/res/android"> <name>CSCamera</name> <js-module name="CSCamera" src="www/CSCamera.js"> <!--这里是调用插件时用的名字,这个target就是js代码调用原生代码的引用--> <clobbers target="cordova.plugins.CSCamera" /> </js-module>
</plugin>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

六、编写生成的插件中的安卓代码

1、打开插件目录CSCamera中的src目录,发现目录是空的,这里需要手动添加android目录。
2、然后在android目录里创建一个java文件,创建一个类继承CordovaPlugin。

上面两步可以通过以下命令来自动完成,推荐这样做,命令要在插件目录下执行:

plugman platform add --platform_name [platform] // platform 只能写ios或者android

  
 
  • 1
~/Desktop/Cordova/CSCamera$ plugman platform add --platform_name android

  
 
  • 1

生成的Java文件CSCamera.java如下:

package com.cs.camera;

import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.CallbackContext;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

/**
 *  这个类回显一个从javascript调用的字符串。 
 */
public class CSCamera extends CordovaPlugin { @Override public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { if (action.equals("coolMethod")) { String message = args.getString(0); this.coolMethod(message, callbackContext); return true; } return false; } private void coolMethod(String message, CallbackContext callbackContext) { if (message != null && message.length() > 0) { callbackContext.success(message); } else { callbackContext.error("Expected one non-empty string argument."); } }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

插件的安卓代码已经完成了。
给插件添加完平台配置后,plugin.xml配置文件也随之增加了平台的配置信息:

<platform name="android"> <config-file parent="/*" target="res/xml/config.xml"> <!--name要与java类名一致都为CSCamera, param标签中的value是插件安装好后java类名全路径--> <feature name="CSCamera"> <param name="android-package" value="com.cs.camera.CSCamera" /> </feature> </config-file> <config-file parent="/*" target="AndroidManifest.xml"> </config-file> <!--src为java源文件的路径,target-dir为插件安装好后的源文件的位置,要和上面的feature标签下param标签里的value中的包名对应--> <source-file src="src/android/CSCamera.java" target-dir="src/com/cs/camera" />
</platform>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

七、配置plugin.xml

但是插件目前还没有办法识别到我们写的java类和java方法。因此,我们需要在plugin.xml文件对我们写的东西进行声明:

<?xml version='1.0' encoding='utf-8'?>
<!--id代表这个插件的唯一标识,在上传到npm后,用户都是通过这个插件id去下载的-->
<plugin id="com.cs.camera" version="1.0.0" xmlns="http://apache.org/cordova/ns/plugins/1.0" xmlns:android="http://schemas.android.com/apk/res/android"> <!--插件名称--> <name>CSCamera</name> <!--配置JS的路径--> <!--文件中可能会有多个js-module的,一个js-module就是一个调用的方式,这里用户调用的方式就是cordova.plugins.CSCamera.方法名,如对外提供toast这个方法,那调用方式就为cordova.plugins.CSCamera.toast--> <!--js-module标签中的name要和www文件夹下CSCamera.js这个文件名一样--> <js-module name="CSCamera" src="www/CSCamera.js"> <!--这里是调用插件时用的名字,这个target就是js代码调用原生代码的引用--> <clobbers target="cordova.plugins.CSCamera" /> </js-module> <!--添加Android平台--> <platform name="android"> <config-file target="AndroidManifest.xml" parent="/manifest"> <!--配置权限--> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> </config-file> <config-file target="AndroidManifest.xml" parent="application"> <provider android:name="org.apache.cordova.camera.FileProvider" android:authorities="${applicationId}.provider" android:exported="false" android:grantUriPermissions="true" > <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/camera_provider_paths"/> </provider> </config-file> <!--插件中src/android中的所有java文件都需要在这里声明,否则无法调用--> <!--src为java源文件的路径,target-dir为插件安装好后,源文件的位置,要和下面的feature标签下param标签里的value中的包名对应--> <source-file src="src/android/CSCamera.java" target-dir="src/com/cs/camera" /> <!--插件的配置信息, build的时候会添加到res/xml/config.xml文件中--> <config-file parent="/*" target="res/xml/config.xml"> <!--name要与java类名一致都为CSCamera, param标签中的value是插件安装好后java类名全路径--> <feature name="CSCamera"> <!--插件入口--> <param name="android-package" value="com.cs.camera.CSCamera" /> </feature> </config-file> </platform>
</plugin>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

在android目录下创建xml目录:

~/Desktop/Cordova/CSCamera/src/android$ mkdir xml

  
 
  • 1

创建camera_provider_paths.xml文件

~/Desktop/Cordova/CSCamera/src/android/xml$ touch camera_provider_paths.xml

  
 
  • 1

文件内容为:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name="external_files" path="."/>
</paths>

  
 
  • 1
  • 2
  • 3
  • 4

这是为了解决在高版本的android系统中,不能再直接通过file://的方式来获取文件的问题。

八、编写CSCamera.js文件

这个js文件,在我们创建了插件后会自动生成:

var exec = require('cordova/exec');

exports.toast = function (arg0, success, error) { exec(success, error, 'CSCamera', 'coolMethod', [arg0]);
};

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

注意:

  • CSCamera:是plugin.xml中配置的feature的name
  • coolMethod是对应名为CSCamera的java类中的方法,这也是为什么要求feature的name的值要和java类名一致的原因。
  • toast:是在外部使用时调用的方法,对使用者是可见的。

九、修改CSCamera.java类

改动其实不是很多,就是加了Toast.makeText(cordova.getActivity(),“Hello world”,Toast.LENGTH_LONG).show()。如果我们成功调用了插件,那么就会打印这句话。

public class CSCamera extends CordovaPlugin { @Override public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { if (action.equals("coolMethod")) {// 对应toastPlugin.js中exec方法的第4个参数 String message = args.getString(0); Toast.makeText(cordova.getActivity(),"Hello world",Toast.LENGTH_LONG).show(); this.coolMethod(message, callbackContext); return true; } return false; } private void coolMethod(String message, CallbackContext callbackContext) { if (message != null && message.length() > 0) { callbackContext.success(message); } else { callbackContext.error("Expected one non-empty string argument."); } }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

十、配置package.json

在package.json配置该插件信息,没有这个文件,我们添加插件时会出现错误!进入插件目录,执行 npm init:

~/Desktop/Cordova/CSCamera$ npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help json` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg> --save` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
name: (CSCamera) CSCamera
Sorry, name can no longer contain capital letters.
name: (CSCamera) cscamera
version: (1.0.0) 
description: This is a camera plugin which will be provided the ability of take picture for H5 App.
entry point: (index.js) 
test command: 
git repository: 
keywords: 
author: 
license: (ISC) 
About to write to /home/kyun/Desktop/Cordova/CSCamera/package.json:

{
  "name": "cscamera",
  "version": "1.0.0",
  "description": "This is a camera plugin which will be provided the ability of take picture for H5 App.",
  "main": "index.js",
  "scripts": { "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

Is this ok? (yes) 

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

初始化完成后,就会在插件的根目录下,生产一份package.json文件。

十一、安装插件到cordova项目

cordova plugin add [插件路径] cordova plugin remove [插件的包名]

  
 
  • 1
  • 2

以上两个命令都要在cordova项目的根目录执行。添加插件就是把我们做好的插件,添加到Android项目的assets目录中,因此

每次修改了插件内容的话都需要移除并重新添加。

安装插件:

~/Desktop/Cordova/CSCamera$ pwd
/home/kyun/Desktop/Cordova/CSCamera
~/Desktop/Cordova/CSCamera$ cd ..
~/Desktop/Cordova$ ls
CSCamera  MyCordova  MyCordovaCamera  sample
~/Desktop/Cordova$ cd MyCordovaCamera
~/Desktop/Cordova/MyCordovaCamera$ cordova plugin add /home/kyun/Desktop/Cordova/CSCamera
Installing "com.cs.camera" for android
Adding com.cs.camera to package.json

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

添加后,就会在MyCordovaCamera项目的插件目录里有这个插件:
在这里插入图片描述添加插件出现的错误,请参考《cordova项目添加插件出错CordovaError: Could not determine package name from output》
移除插件也很方便:

~/Desktop/Cordova/MyCordovaCamera$ cordova plugin remove com.cs.camera


  
 
  • 1
  • 2

当你反复进行上面两个操作时,可能会报错,小技巧:再保存一下plugin.xml文件,再来进行添加插件操作。

十二、调用插件

打开cordova项目,找到www/index.html, index.html是这个h5 App的入口,我们可以在里面测试我们的插件是否被调用:

<body> <div class="app"> <h1>Apache Cordova</h1> <div id="deviceready" class="blink"> <p class="event listening">Connecting to Device</p> <p class="event received">Device is Ready</p> <button id="test_plugin">测试插件</button> </div> </div> <script type="text/javascript" src="cordova.js"></script> <script type="text/javascript" src="js/index.js"></script> </body>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

注意:尽量避免直接在HTML标签上注册事件,因为那可能会失败。在一些浏览器如chrome上,它会认为这是一种不安全的操作,于是乎,事件就会被屏蔽掉。推荐的做法是在js代码里注册事件。所以我们把上面“测试插件”按钮的事件放在js/index.js文件里注册:

document.getElementById('test_plugin').onclick = function(){ cordova.plugins.CSCamera.toast("成功了",function(success){
		alert(success);
	},function(err){
		alert(err);
	});
};

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

编译cordova项目,然后安装测试。致此,自定义开发插件的基本过程就是这样大家可以试着做一下。
最快的安装测试方式:(1)用USB数据线连接手机和手提电脑;(2)把手机的调试模式打开;(3)在Cordova项目的根目录下,运行命令:

~/Desktop/Cordova/MyCordovaCamera$ cordova run android

  
 
  • 1

这样Cordova项目在编译完成后,会直接在手机上运行起来。
注意不要打开其他模拟器和连接多台手机,否则你就要特别使用–target参数来指定运行在哪台设备上了。
查看连接到电脑上的设备:

~$ adb devices
List of devices attached
6cd18d00	device

  
 
  • 1
  • 2
  • 3

指定运行设备:

~/Desktop/Cordova/MyCordovaCamera$ cordova run android --target 6cd18d00

  
 
  • 1

不过,当只连了一台设备时,就会默认为这一台,不需要特别指定。

谢谢阅读。

文章来源: blog.csdn.net,作者:WongKyunban,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_40763897/article/details/100893726

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。