明天公司放假,终于有时间写写博客!
之前公司接了个项目,要我短期内搞定一个app,对于完全没有开发过android应用的我来说是个挑战,选择jqmobile+phonegap开发,这篇文章讲一下phonegap的插件开发,想写的主要动力是的确亲手写了好多个插件,不写就忘了。不过事实证明,我那个app不适合用phonegap开发,因为涉及的内核太多,业务逻辑有点复杂,写了好多插件,还是不能达到很好地满足需求,用原生的java写比较好。言归正传,开始讲解插件开发。
插件:获取移动端已经安装的第三方应用,并且能通过点击事件打开。
1、java代码
package org.apache.cordova.GetAppPlugin;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningTaskInfo;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.telephony.TelephonyManager;
public class GetAppPlugin extends CordovaPlugin {
public String appName="";
public String packageName="";
public String versionName="";
public int versionCode=0;
public Drawable appIcon=null;
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
if (action.equals("showapp")) {//获取移动端已经安装的第三方应用信息
Context context = cordova.getActivity().getApplicationContext();
PackageManager pm = context.getPackageManager();
//得到系统安装的所有程序包的PackageInfo对象
List<PackageInfo> packages = pm.getInstalledPackages(0);
int length=packages.size();
// JSONObject r = new JSONObject();
List<JSONObject> list=new ArrayList<JSONObject>();
JSONObject s=new JSONObject();
for(int i=0;i<length;i++) {
JSONObject r = new JSONObject();
PackageInfo pinfo = packages.get(i);
//ApplicationInfo tmpInfo =new ApplicationInfo();
//tmpInfo.packageName = pinfo.packageName;
r.put("name",pm.getApplicationLabel(pinfo.applicationInfo).toString());
r.put("icon",pm.getApplicationIcon(pinfo.applicationInfo));
r.put("packagename", pinfo.packageName);
r.put("versionname", pinfo.versionName);
//r.put("size", i);
//r.put("source", tmpInfo.sourceDir);
if ((pinfo.applicationInfo.flags & pinfo.applicationInfo.FLAG_SYSTEM) <= 0) {
// 添加自己已经安装的应用程序
list.add(r);
s.put("app", list);
}
r=null;
}
callbackContext.success(s);
}if(action.equals("open")){
Context context = cordova.getActivity().getApplicationContext();
PackageManager pm = context.getPackageManager();
Intent it= pm.getLaunchIntentForPackage(args.getString(0));
context.startActivity(it);
}if(action.equals("isrunning")){
Context context = cordova.getActivity().getApplicationContext();
ActivityManager am = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> list = am.getRunningTasks(100);
boolean isAppRunning = false;
//Log.d("tag", "正在监听。。。");
String MY_PKG_NAME = args.getString(0);
// Log.d("package", MY_PKG_NAME);
for (RunningTaskInfo info : list) {
if (info.topActivity.getPackageName().equals(MY_PKG_NAME) || info.baseActivity.getPackageName().equals(MY_PKG_NAME)) {
isAppRunning = true;
break;
}
}
if(isAppRunning==true){
callbackContext.success(1);
}else{
callbackContext.success(0);
}
}if(action.equals("getimei")){
callbackContext.success(this.DeviceImeiNumber());
}if(action.equals("search")){
String result="";
String path=args.getString(0);
String filename=args.getString(1);
File[] files=new File(path).listFiles();
for (File f : files)
{
//判断文件名f中是否包含keyword
if (f.getName().indexOf(filename) >= 0)
{
//f.getPath()返回文件的路径
result ="1";
}
}
if (result.equals(""))
result = "0";
callbackContext.success(result);
}else{
return false;
}
return true;
}
public String DeviceImeiNumber(){
TelephonyManager tManager = (TelephonyManager)cordova.getActivity().getSystemService(Context.TELEPHONY_SERVICE);
return tManager.getDeviceId();
}
}
注意:
a、插件继承类 CordovaPlugin
b、返回的数据是json格式
c、action是前端js传过来的方法,通过action的值调用该插件的不同方法,比如
action.equals("getimei")的话,那么该插件将会返回该手机的全球唯一序列号,其他action值类推。
2、注册插件
在xml-》config.xml中注册插件:
<feature name="GetAppPlugin">
<param name="android-package" value="org.apache.cordova.GetAppPlugin.GetAppPlugin" />
</feature>
3、js调用:还是用获取手机唯一序列号讲解
//获取手机序列号
function getimei(){
try {
array=[];
//alert(para);
cordova.exec(
function(message) {
localStorage.device_uuid=message;//这里的message就是插件返回的数据,也就是该调用下返回的手机全球唯一序列号
},
function(message){
console.log(e.message);
}, 'GetAppPlugin', 'getimei',array); //关键在这里:调用GetAppPlugin插件,action的值是getimei,传入的参数的array,空数组
} catch(e) {
console.log(e.message);
}
}
上面的插件我写了好多个action,我讲解用了getimei讲,其他方法都是一样的。其中,
action.equals("showapp")
获取的是手机终端所有的第三方应用信息;
action.equals("open")
通过js调用是传进来的参数打开对应的应用程序;
action.equals("isrunning")
通过js调用是传进来的参数判断某个程序是否正在运行;
action.equals("search")
通过js调用是传进来的参数判断某个文件是否在文件夹中存在;
phonegap插件开发整体是这个思路,有些细节的东西我没有讲的很清楚,这个得靠个人去实践.
demo下载 不懂得也可以直接找我交流,也欢迎各路大神极客黑客骇客指正错误之处,qq交流:1040094181