android与phonegap的相互交互

来源:互联网 发布:数据库sql语句面试题 编辑:程序博客网 时间:2024/05/16 18:24

开发环境:android SDK+android2.3或以上的真机

开发所需:cordova-2.1.0.js+sencha-touch-all-debug.js

 

首先把你的phonegap或sehcha项目放到assets文件夹下,然后在你的入口函数(onCreate)里添加如下:

[java] view plaincopy
  1. super.init();  
  2. super.setBooleanProperty("loadInWebView"true);   
  3. super.setIntegerProperty("loadUrlTimeoutValue"60000); //在模拟器测试上使用.不然会出错  
  4. //加splashScreen  
  5. super.setIntegerProperty("splashscreen", R.drawable.welcome);  
  6. this.appView.setBackgroundColor(0);  
  7. this.appView.setBackgroundResource(R.drawable.welcome);  
  8.   
  9. super.loadUrl(<a href="file:///android_asset/PagoClient/index.html">file:///android_asset/PagoClient/index.html</a>);  


这样就可以在你的机器上运行了.注意,我这里用的是2.1.0的cordova包,只支持android系统2.3/以上的真机!!!!!!!!!!!!!

 

如果要在phonegap或sencha端调用android端的代码就需要用插件的方式来做:

1,创建一个继承了Plugin的类

[java] view plaincopy
  1. public class pluginClass extends Plugin{  
  2.   
  3.     public static final String ACTION = "codetest";  
  4.     public static final String ACTION_INTENT_TEST = "com.terry.broadcast.test";  
  5.   
  6.     @Override  
  7.     public PluginResult execute(String action, JSONArray data, String callbackId) {  
  8.         // TODO Auto-generated method stub  
  9.         if(ACTION.equals(action)){  
  10.             Intent intent = new Intent(ctx.getContext(), CaptureActivity.class);//你想去的activity(exp:Temp)  
  11.        ctx.startActivity(intent);  
  12.         }  
  13.         return null;  
  14.     }  
  15.       
  16. }  

2,在项目的res/xml/config.xml文件加一个plugin

          <plugin name="plugintest" value="com.example.senchapago.pluginClass"/>

name是你自字的名字,value是继承了plugin类的所在类的路径

 

3,在phonegap项目里的cordova-2.1.0.js文件最后添加以下代码:

[java] view plaincopy
  1. //to  
  2. var testAndroid01API=function(){};      
  3.   
  4. testAndroid01API.prototype.test = function(params, success, fail){  
  5.     return PhoneGap.exec(  
  6.                 function(args){  
  7.                     success(args);  
  8.                 },   
  9.                 function(args){  
  10.                     fail(args);  
  11.                 },   
  12.                 'plugintest'//java类  
  13.                 'codetest',    //action  
  14.                 [params]    //params  
  15.     );  
  16. };  
  17. PhoneGap.addConstructor(function() {  
  18.     PhoneGap.addPlugin('testAndroid01API'new testAndroid01API());   
  19. });  
  20.      
  21.   
  22. if(!window.plugins) {  
  23.     window.plugins = {};  
  24. }  
  25. if (!window.plugins.testAndroid01API) {  
  26.     window.plugins.testAndroid01API = new testAndroid01API();  
  27. }  
[java] view plaincopy
  1.    
[java] view plaincopy
  1. 4,最后在你需要触发的地方加上:  
[java] view plaincopy
  1. window.plugins.testAndroid01API.test(null,function(r){},function(e){});  
[java] view plaincopy
  1. 这样就可以调用android的Activiy类了,  
[java] view plaincopy
  1. 同理.如果你的在android端把数据传给phonegap端,流程大概与上面的步骤想似:  
[java] view plaincopy
  1. 1,2步一样,第3步是:  
PhoneGap.addConstructor(function() {  PhoneGap.addPlugin('testAndroid02API', new testAndroid02API()); });
//resultvar testAndroid02API=function(){};       testAndroid02API.prototype.test = function(success, error, qrcodeData){       return PhoneGap.exec( success, error,                    'resulttest', //java类名,plugins.xml中注册的名字                   'resultcode',    //action,Java方法中用来匹配的字段                   [qrcodeData]    //params 传递的参数,Array形式       );   };    
if(!window.plugins) {    window.plugins = {};}
 
if (!window.plugins.testAndroid02API) {    window.plugins.testAndroid02API = new testAndroid02API();}
[java] view plaincopy
  1. 4,是在你需要返回结果的地方添加:  
[java] view plaincopy
  1.      var success = function(data){ //当Java方法返回成功时,通过data.key 获得Java中传来的JSONObject数据     
  2.                   //alert("1111111 : " + data.testData1 + '   and 2222222 : ' + data.testData2);     
  3.                   Ext.getCmp('txt_').setValue(data.qrcodeData);   
  4.               };      
  5.                   
  6.      var error = function(e){      
  7.   
  8.                   //Ext.getCmp('txt_').setValue(e);      
  9.               };      
  10.     
  11.      window.plugins.testAndroid02API.test(success, error, null);  
[java] view plaincopy
  1. 这样就可以把数据传递了,当然是你继承了plugin的类中处理方式也是有不同的,例如:  
[java] view plaincopy
  1. <p>public class resultClass extends Plugin{</p><p>    public static final String ACTION = "resultcode";</p><p>    PluginResult result = null;       
  2.     JSONObject jsonObj = new JSONObject();//可以返回给JS的JSON数据   
  3.       
  4.     private SharedPreferences mPref;  
  5.       
  6.     @Override  
  7.     public PluginResult execute(String action, JSONArray data, String callbackId) {  
  8.         mPref = PreferenceManager.getDefaultSharedPreferences(ctx.getContext());  
  9.       if(ACTION.equals(action)){  
  10.   
  11.          String resultCode = mPref.getString("qr_code_result"null);  
  12.          while (resultCode==null || resultCode.length()==0) {//循环获取qr_code_result,直到有值  
  13.             resultCode = mPref.getString("qr_code_result"null);  
  14.      }  
  15.      resultCode = mPref.getString("qr_code_result"null);  
  16.      if(resultCode.length() != 0 ){  
  17.         try {  
  18.            jsonObj.put("qrcodeData", resultCode);  
  19.            mPref.edit().remove("qr_code_result").commit();  
  20.         } catch (JSONException e) {  
  21.            e.printStackTrace();  
  22.         }        
  23.         System.out.println("有值!");  
  24.         result = new PluginResult(PluginResult.Status.OK, jsonObj);     
  25.              //返回成功时,将Java代码处理过的JSON数据返回给JS   
  26.      }else{  
  27.         System.out.println("无值!");  
  28.         result = null;  
  29.      }  
  30.      
  31.         }  
  32.         return result;  
  33.     }  
  34.       
  35. }</p>完!  
原创粉丝点击