phonegap插件开发讲解

明天公司放假,终于有时间写写博客!

之前公司接了个项目,要我短期内搞定一个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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值