以"发送短信"功能自定义插件

最终效果:


项目目录结构:


如何搭建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

更多相关文章

  1. Android(安卓)GPS学习笔记—LMS初始化
  2. Android浏览器插件开发-Log
  3. CDH基于Kerberos身份认证和基于Sentry的权限控制功能的测试示例
  4. log函数封装,让WIN32和android ndk共用相同的log函数,方便调试
  5. Android(安卓)Manifest 权限描述大全
  6. Android(安卓)之 ServiceManager与服务管理
  7. Android(安卓)Intent 三解决
  8. Android(安卓)SensorService源码分析(二)
  9. flutter使用multi_image_picker选择图片时候报Permission denied

随机推荐

  1. 【安卓学习之常见问题】 编译V7问题- 'an
  2. 在Ubuntu下使用adb
  3. Android实现中文按拼音排序方法
  4. Android(安卓)自定义码表图
  5. Google Maps API v2密钥申请
  6. android 系统重启关机 方法 非常好的一篇
  7. Invalid file name: must contain only [
  8. android照相机竖屏显示的图像出现旋转的
  9. 解决 Android(安卓)N requires the IDE t
  10. Android(安卓)Studio升级到3.1之后导入其