android PhoneGap 自定义插件
以"发送短信"功能自定义插件
最终效果:
项目目录结构:
如何搭建android PhoneGap这里就不提及了。
首先,index.html中布局,并结合JQuery定义事件。
index.html
<!DOCTYPE HTML><html><head><title>PhoneGap</title><meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <script type="text/javascript" charset="utf-8" src="../js/jquery-1.7.1.js"></script><script type="text/javascript" charset="utf-8" src="../js/phonegap.js"></script><script type="text/javascript" charset="utf-8" src="../js/phonegap_messagePlugin.js"></script><script type="text/javascript">$(function(){var onSend = function(){//成功时执行该函数var success = function(data){alert("tel:" + data.target + "\ncontent:" + data.content);};//失败时执行该函数var error = function(e){alert(e);};var tel = $('#tel').val();var content = $('#content').val();//message: 自定义phonegap_messagePlugin.js中定义的//send(...)函数: message对象的方法window.plugins.message.send(success,error,tel,content);};//发送按钮点击方法绑定$('#send').bind('click',onSend);});</script></head><body><div id="messageDiv"><input id="tel" type="tel" value="5556"/><textarea id="content" rows="10" cols="25"></textarea><button id="send" type="button">发送</button></div></body></html>
接着,那么message从哪里来呢?
自定义一个Js文件用来处理我们自己的需要的逻辑
phonegap_messagePlugin.js
var Message = function() {};Message.prototype = {send: function(success,error,target,content){//调用MessagePlugin.java 的 send(...)方法PhoneGap.exec(success,error,"MessagePlugin","send",[target,content]);}};PhoneGap.addConstructor(function(){//在PhoneGap中添加插件,注意要在plugins.xml中给它赋权限。PhoneGap.addPlugin("message",new Message);});
所以,window.plugins.message.send(....);message其实就是指向这个Message对象,然后在调用它的send函数。
那么,MessagePlugin又指什么呢?
这里就开始插件类的编写了。
MessagePlugin.java
package com.royal.plugins;import org.json.JSONArray;import org.json.JSONException;import org.json.JSONObject;import android.telephony.SmsManager;import com.phonegap.api.Plugin;import com.phonegap.api.PluginResult;/** * 自定义插件类---短信插件 * @author Royal * */public class MessagePlugin extends Plugin{private static final String SEND = "send";@Overridepublic PluginResult execute(String action, JSONArray data, String callbackId) {PluginResult result = null;if(SEND.equals(action)){try {//手机号String target = data.getString(0);//短信内容String content = data.getString(1);//这里引入的是android.telephony.SmsManagerSmsManager sms = SmsManager.getDefault();//发送短信sms.sendTextMessage(target, null, content, null, null);//封装信息返回给index.html的success(data)函数执行JSONObject jsonObj = new JSONObject();jsonObj.put("target", target);jsonObj.put("content", content);//执行成功结果result = new PluginResult(PluginResult.Status.OK,jsonObj);} catch (JSONException e) {result = new PluginResult(PluginResult.Status.JSON_EXCEPTION);}}else{//无效的执行result = new PluginResult(PluginResult.Status.INVALID_ACTION);}return result;}}
所以,PhoneGap.exec(success,error,"MessagePlugin","send",[target,content]);这句代码
其中的MessagePlugin对应的就是上面的MessagePlugin.java这个类,send要对应匹配的就是MessagePlugin.java中execute里面的String action
最后将MessagePlugin.java这个插件类 在 xml/plugins.xml授权!
plugins.xml
<?xml version="1.0" encoding="utf-8"?><plugins> <plugin name="App" value="com.phonegap.App"/> <plugin name="Geolocation" value="com.phonegap.GeoBroker"/> <plugin name="Device" value="com.phonegap.Device"/> <plugin name="Accelerometer" value="com.phonegap.AccelListener"/> <plugin name="Compass" value="com.phonegap.CompassListener"/> <plugin name="Media" value="com.phonegap.AudioHandler"/> <plugin name="Camera" value="com.phonegap.CameraLauncher"/> <plugin name="Contacts" value="com.phonegap.ContactManager"/> <plugin name="Crypto" value="com.phonegap.CryptoHandler"/> <plugin name="File" value="com.phonegap.FileUtils"/> <plugin name="Network Status" value="com.phonegap.NetworkManager"/> <plugin name="Notification" value="com.phonegap.Notification"/> <plugin name="Storage" value="com.phonegap.Storage"/> <plugin name="Temperature" value="com.phonegap.TempListener"/> <plugin name="FileTransfer" value="com.phonegap.FileTransfer"/> <plugin name="Capture" value="com.phonegap.Capture"/> <!-- 自定义plugin赋权限 --> <plugin name="MessagePlugin" value="com.royal.plugins.MessagePlugin"/></plugins>
同样,既然是发短信,当然也要在AndroidManifest.xml 授权发送短信权限
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.royal.plugins" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" /> <!-- PhoneGap权限 --> <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.WRITE_CONTACTS" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 发短信权限 --> <uses-permission android:name="android.permission.SEND_SMS" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name=".PhoneGap_messagePluginActivity" android:configChanges="orientation|keyboardHidden" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
Ok,最后就这样了。 运行! 测试的时候再启动一个AVD咯。
总结:
注意其流程步骤,如何分离。
注意命名(包括各参数)。
理解这个自定义插件demo,可自定义自己需要的一些其他插件。
具体不用,理解即可。
该demo流程关联:
参考:http://gteam-yu.iteye.com/blog/1358707
更多相关文章
- Android(安卓)GPS学习笔记—LMS初始化
- Android浏览器插件开发-Log
- CDH基于Kerberos身份认证和基于Sentry的权限控制功能的测试示例
- log函数封装,让WIN32和android ndk共用相同的log函数,方便调试
- Android(安卓)Manifest 权限描述大全
- Android(安卓)之 ServiceManager与服务管理
- Android(安卓)Intent 三解决
- Android(安卓)SensorService源码分析(二)
- flutter使用multi_image_picker选择图片时候报Permission denied