以"发送短信"功能 自定义插件
最终效果:
项目目录结构:
如何搭建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";
@Override
public 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.SmsManager
SmsManager 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