phonegap(cordova)android ios的QQ 微博 人人第三方登录

2014-11-28 奇Yu 移动应用

这是phonegap plugin,用来做第三方平台登录的,目前有qq、微博、人人三个平台

qq登录

首先要在qq互联,创建移动应用,获取appId神马的

然后搭建环境,ios环境搭建看这里android的在这里

环境配好了,Next,就是写代码了,直接把.java.m .h文件copy到工程里,然后把www/plugins下的qqLogin.js拷贝到对应的www/plugins目录下

还有一步,在工程的cordova_plugins.jsconfig.xml里增加对应plugin的说明

ios版

<feature name="QQLogin">
    <param name="ios-package" value="QQLogin" />
</feature>

android版

<feature name="QQLogin">
    <param name="android-package" value="com.example.cordova.qqLogin.QQLogin" />
</feature>

注意,android版value对应的是QQLogin.java这个文件所在的路径

最后在对应的js里写上登录按钮的点击事件,比如

$('#qq-login').click(function() {
    qqLogin.ssoLogin(function(res) { alert('uid:'+res.uid+' token:'+res.token);
    }, function() { alert('授权失败');
    });

});

另外,ios的AppDelegate.mopenURL里要加上如下所示代码,当然还要import对应的.h文件:

// this happens while we are running ( in the background, or from within our own app ) // only valid if Filpped-Info.plist specifies a protocol to handle - (BOOL)application:(UIApplication*)application openURL:(NSURL*)url sourceApplication:(NSString*)sourceApplication annotation:(id)annotation
{ if (!url) { return NO;
    } // calls into javascript global function 'handleOpenURL' NSString* jsString = [NSString stringWithFormat:@"handleOpenURL(\"%@\");", url];
    [self.viewController.webView stringByEvaluatingJavaScriptFromString:jsString]; // all plugins will get the notification, and their handlers will be called [[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:CDVPluginHandleOpenURLNotification object:url]]; // weiboLogin WeiboLogin *weiboPlugin = [self.viewController.pluginObjects objectForKey:@"WeiboLogin"];
    [WeiboSDK handleOpenURL:url delegate:weiboPlugin]; // renrenLogin RenrenLogin *renrenPlugin = [self.viewController.pluginObjects objectForKey:@"RenrenLogin"];
    [RennClient handleOpenURL:url];
    [TencentOAuth HandleOpenURL:url ];
    QQLogin *qqPlugin = [self.viewController.pluginObjects objectForKey:@"QQLogin"];

    [QQApiInterface handleOpenURL:url delegate:qqPlugin]; return YES;
}

微博登录

和qq基本一致,微博的文档po主放在doc目录下了

人人登录

人人文档在这里,ios版android

步骤和前面的一致

git地址

https://github.com/jessiehan/phonegap-social-sso

原作者地址

http://zjuhpp.com/phonegap-di-san-fang-ping-tai-deng-lu-di-plugin.html



标签: phonegap cordova android

评论(0) 浏览(6440)

phonegap(cordova)android插件开发技巧

2014-11-28 奇Yu 移动应用

这里说的是 3.0之后的。

因为3.0之后的版本插件和主程序是分开的,插件需要单独安装

网络上有很多插件的相关文章,我感觉讲的比较繁琐,所以重新整理一篇。


首先需要了解插件包的 文件结构


test 
│  plugin.xml 
│ 
├─src 
│  └─android 
│          Easemob.java 
│ 
└─www 
       easemob.js



一.先看plugin.xml
<?xml version="1.0" encoding="UTF-8"?>
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
    id="com.imqiyu.cordova.easemob"
    version="0.0.1">
    <name>环信聊天</name>
    <description>easemob.com的聊天 封装的cordova插件</description>
    <author>qiyu</author>
    <license>Apache 2.0 License</license>
    <engines>
        <engine name="cordova" version=">=3.0.0" />
    </engines>
    
    <!--js-module指向的就是我们刚才所写的js文件的路径,src指向www/easemob.js,name属性自己定义,share代表我们在客户端调用的时候的实例名。--> <js-module src="www/easemob.js" name="easemob"> <clobbers target="easemob" />
    </js-module>
    
    <!-- android -->  
    <platform name="android">    
        <source-file src="src/android/Easemob.java" target-dir="src/com/imqiyu/cordova/easemob" /> 
        
        <config-file target="res/xml/config.xml" parent="/*">  
            <feature name="Easemob" >  
                <param name="android-package" value="com.imqiyu.cordova.easemob.Easemob"/>  
            </feature>  
        </config-file>  
    
    </platform>  
</plugin>


如果直接在上面写注释容易出错,简单的写在这里
最上面的 id 需要唯一,name,描述,作者自己看着写,engines的版本需要大于3.0,这样就是因为3.0后的版本后之前的是分界线,如果你开发的插件是在3.X后特有的版本才有的,需要指定到能调的动你插件的版本。
<js-module src="www/easemob.js" name="easemob">
        <clobbers target="easemob" />
</js-module>

这段是JS 的描述。JS的路径,jS的调用名称,
platform是每个平台的描述
source-file 是文件在插件包内的路径 target-dir 安装到android后的路径,甚至可以理解成包名
 <param name="android-package" value="com.imqiyu.cordova.easemob.Easemob"/>  
这里是value是只插件中java文件的路径。注意他包含了 报名 和文件名 如果你还需要其它的配置
比如 activity和权限可以这样写他们都在platform的下级
     <config-file  target="AndroidManifest.xml" parent="/*">       
		<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
     </config-file>
	 <config-file  target="AndroidManifest.xml" parent="application">
       <activity
		  android:name="cn.sharesdk.framework.ShareSDKUIShell"
		  android:theme="@android:style/Theme.Translucent.NoTitleBar"
		  android:configChanges="keyboardHidden|orientation|screenSize"
		  android:screenOrientation="portrait"
		  android:windowSoftInputMode="stateHidden|adjustResize" >
		   <intent-filter>
				<data android:scheme="tencent100371282" />
				<action android:name="android.intent.action.VIEW" />
				<category android:name="android.intent.category.BROWSABLE" />
				<category android:name="android.intent.category.DEFAULT" />
			</intent-filter>
		</activity>		
     </config-file> 

二. easemob.js文件

var cordova = require('cordova');
var Easemob =function(){};

Easemob.prototype.login = function(success,error,str) {
    cordova.exec(success,error,'Easemob','login',str);
};
var easemob = new Easemob();
module.exports = easemob;


主要看 cordova.exec()


  1.        一共5个参数 
  2.        第一个 :成功回调 
  3.        第二个 :失败回调 
  4.        第三个 :将要调用的类,等下JAVA文件里面的类名称 
  5.        第四个 :调用的方法名(一个类里可能有多个方法 靠这个参数区分) 
  6.        第五个 :传递的参数  以数组的格式 


这里可以看到我把他们写在一个函数里面 在前端页面调研那个的时候可以直接使用

easemob.login(function(){},function(){}},"[]");

如果是有多个可以这样写


var cordova = require('cordova');
var Easemob =function(){};

Easemob.prototype.login = function(success,error,str) {
    cordova.exec(success,error,'Easemob','login',str);
};
Easemob.prototype.logout = function(success,error,str) {
    cordova.exec(success,error,'Easemob','logout',str);
};
Easemob.prototype.chat = function(success,error,str) {
    cordova.exec(success,error,'Easemob','chat',str);
};

var easemob = new Easemob();
module.exports = easemob;


我这里写了三个调用。前台调用的时候可以直接使用easemob.login();easemoblogout;easemob.chat();三个方法调用

三.Easemob.java 文件

package com.imqiyu.cordova.easemob;
//此处的包名要和 XML里面的包名一样
import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.json.JSONArray;
import org.json.JSONException;
import android.content.Context;

//这里的类名 就是 XML里面android-package的只 包名+类名
//这里的类名 就是JS cordova.exec()的第三个参数
public class Easemob extends CordovaPlugin {	
	//这里的String action就是JS cordova.exec()的第四个参数 要执行什么动作
	@Override
	public boolean execute(String action, JSONArray args,
			CallbackContext callbackContext) throws JSONException {
		//这里的args n就是JS cordova.exec()的第五个参数 以JSON格式得到,一定要安顺序
		final String	user=args.getString(0);
		final String	psword=args.getString(1);	  
		  if (action.equals("login")) {
				   
				if(user=="admin" && paword=="123456"){
					   callbackContext.success("成功登录");  
				}
			  }else if(action.equals("logout")){
				  
			
				  
			  }else if(action.equals("chat")){
				 
			  }

		return super.execute(action, args, callbackContext);
	}

	
	
}

至此一个插件算是开发完成了

插件的安装 cordova plugin add 你的本地路径 或者是GIT路径

然后前台调用

easemob.login(function(s){alert(s);},function(){}},['admin','123456']);



如果你想要更新界面需要使用 UI线程,

	 if (action.equals("login")) {
				   
				   cordova.getActivity().runOnUiThread(new Runnable() {
		                public void run() {		                	
							//需要更新页面的操作
		                }
		            });
			  }else if(action.equals("logout")){				  
	
				  
			  }else if(action.equals("chat")){
			
			  }

如果你需要得到内容上下文可以使用

Context context = this.cordova.getActivity().getApplicationContext(); 

如果你需要返回一个集合 可以使用

callbackContext.sendPluginResult(new PluginResult(status,aa));

标签: phonegap cordova 插件开发 android

评论(0) 浏览(5303)

android List异步获取网络图片之聊天列表

2014-11-20 奇Yu 移动应用

安卓获取网络图片可以参考

http://blog.csdn.net/wangjinyu501/article/details/8219317

我现在要的需求和这篇博客所讲的有一点点的不同

他这里获取的列表每张图片都不一样。

而我要获取的是 有些列表的图片是相同的

聊天列表.png

像我这张图片一样是一个聊天的列表

左侧和右侧的几张图片 是重合的。

如果还用上面博客的代码,

就会出现

第一个线程 去请求  头像,当第一个请求还没有返回的时候,

第二个,第三个,第四个,线程也会去请求相同的头像图片资源,


现在解决的方法。

在线程去请求之前,先判断 内存内有没有这个图片资源

没有了 就将现在要去请求的 放到一个集合里面。

如果集合里已经存在这个网址了。

就直接返回

没有存在就往下继续执行 ,去网络请求这个图片,

等待图片请求回来了。

循环刚才的集合,设置每个ImageView控件的图片


ImageLoader.java


package com.imqiyu.aochen;
import java.io.BufferedReader;
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.InputStream; 
import java.io.InputStreamReader;
import java.io.OutputStream; 
import java.net.HttpURLConnection; 
import java.net.URL; 
import java.util.ArrayList;
import java.util.Collections; 
import java.util.Map; 
import java.util.WeakHashMap; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONObject;
import com.easemob.chatuidemo.R;
import android.app.Activity; 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.util.Log;
import android.widget.ImageView; 
import com.imqiyu.aochen.Utils;  
public class ImageLoader {
  
    MemoryCache memoryCache=new MemoryCache(); 
    FileCache fileCache; 
    ExecutorService executorService;
    
    final  Map<String,ArrayList<ImageView>> imageViews=Collections.synchronizedMap(new WeakHashMap<String,ArrayList<ImageView>>()); 
    private void ViewList(String url,ImageView iv){
    	ArrayList<ImageView> temp;
    		//先取出数组里
    		 temp=imageViews.get(url);
    		 if(temp==null){
    			 ArrayList<ImageView> imList=new ArrayList<ImageView>();  
    			 imList.add(iv);
    			 imageViews.put(url, imList); 
    			 Log.d("img",url+"需要新建一个集合");
    		 }else{
    			 temp.add(iv);
    			 Log.d("img",url+"直接累加的集合");
    			 imageViews.put(url, temp); 
    		 }        
    
    	
    
    }
  
    public ImageLoader(Context context){ 
        fileCache=new FileCache(context); 
        executorService=Executors.newFixedThreadPool(5); 
    } 

  
    final int stub_id = R.drawable.default_avatar; 
    public void DisplayImage(String url, ImageView imageView) 
    {    
        Bitmap bitmap=memoryCache.get(url); 
        if(bitmap!=null){  
        	Log.d("img",url+"读取的是缓存");
            imageView.setImageBitmap(bitmap); 
        } else
        {  
        	Log.d("img",url+"读取的是URL");
        	ArrayList<ImageView> temp;        	
    		//先取出数组里
    		 temp=imageViews.get(url);
        	//然后往里面添加
        	if(temp != null){
        		Log.d("img",url+"已经存在集合了 直接返回即可");
        		ViewList(url,imageView); 
        	
        	}else{
        		Log.d("img",url+"不存在与集合,需要重新获取");
        		ViewList(url,imageView); 
                queuePhoto(url);                 
        	}
        	imageView.setImageResource(stub_id); 
        	
        } 
    } 

  
    private void queuePhoto(String url) 
    {     	
        PhotoToLoad p=new PhotoToLoad(url); 
        executorService.submit(new PhotosLoader(p)); 
    } 
    
 
  
    private Bitmap getBitmap(String url) 
    { 
        File f=fileCache.getFile(url); 
  
        //从sd卡 因为是头像他会换的不适合长期保存
       Bitmap b = decodeFile(f); 
        if(b!=null) 
            return b; 
  
        //从网络
        try {         
            Bitmap bitmap=null; 
            URL imageUrl = new URL(url); 
            HttpURLConnection conn = (HttpURLConnection)imageUrl.openConnection(); 
            conn.setConnectTimeout(30000); 
            conn.setReadTimeout(30000); 
            conn.setInstanceFollowRedirects(true); 
            InputStream is=conn.getInputStream(); 
            OutputStream os = new FileOutputStream(f); 
            Utils.CopyStream(is, os);            
            os.close();          
            bitmap = decodeFile(f);         
            return bitmap; 
        } catch (Exception ex){         	
           ex.printStackTrace(); 
           return null; 
        } 
    } 
  
    //解码图像用来减少内存消耗
    private Bitmap decodeFile(File f){ 
        try { 
            //解码图像大小
            BitmapFactory.Options o = new BitmapFactory.Options(); 
            o.inJustDecodeBounds = true; 
            BitmapFactory.decodeStream(new FileInputStream(f),null,o); 
  
            //找到正确的刻度值,它应该是2的幂。
            final int REQUIRED_SIZE=70; 
            int width_tmp=o.outWidth, height_tmp=o.outHeight; 
            int scale=1; 
            while(true){ 
                if(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE) 
                    break; 
                width_tmp/=2; 
                height_tmp/=2; 
                scale*=2; 
            } 
  
            BitmapFactory.Options o2 = new BitmapFactory.Options(); 
            o2.inSampleSize=scale; 
            return BitmapFactory.decodeStream(new FileInputStream(f), null, o2); 
        } catch (FileNotFoundException e) {} 
        Log.d("getimg","解码出错了");
        return null; 
    } 
  
   // /任务队列
    private class PhotoToLoad 
    { 
        public String url;   
        public PhotoToLoad(String u){ 
            url=u; 
          
        } 
    } 
    

    class PhotosLoader implements Runnable { 
        PhotoToLoad photoToLoad;        
        PhotosLoader(PhotoToLoad photoToLoad){ 
            this.photoToLoad=photoToLoad; 
        } 
  
        @Override
        public void run() { 
            Bitmap bmp=getBitmap(photoToLoad.url);             
            memoryCache.put(photoToLoad.url, bmp);
        
            BitmapDisplayer bd=new BitmapDisplayer(bmp, photoToLoad); 
            Activity a=(Activity)imageViews.get(photoToLoad.url).get(0).getContext(); 
            a.runOnUiThread(bd); 
        } 
    } 
   
  
    boolean imageViewReused(PhotoToLoad photoToLoad){ 
        ArrayList<ImageView> tag=imageViews.get(photoToLoad.url); 
        if(tag==null || !tag.get(0).equals(photoToLoad.url)) 
            return true; 
        return false; 
    } 

  
    //用于显示位图在UI线程
    class BitmapDisplayer implements Runnable 
    { 
        Bitmap bitmap; 
        PhotoToLoad photoToLoad; 
        public BitmapDisplayer(Bitmap b, PhotoToLoad p){bitmap=b;photoToLoad=p;} 
        public void run() 
        { 
        	Log.d("img","url="+photoToLoad.url);
        	ArrayList<ImageView> ivList=imageViews.get(photoToLoad.url);
        	int size=ivList.size(); 
        	Log.d("img","需要循环设置图片的次数"+size);
        	for(int i=0;i<size;i++){
        		if(bitmap!=null){
                	Log.d("img","设置图片成功");
                	ivList.get(i).setImageBitmap(bitmap); 
                }
                else{
                	Log.d("img","设置图片失败");                 
                    ivList.get(i).setImageResource(stub_id);                	
                    
                }
        	}
        	//都设置成功了就删除把。
        	imageViews.remove(photoToLoad.url);
            
        } 
    } 
  
    public void clearCache() { 
        memoryCache.clear(); 
        fileCache.clear(); 
    } 
   

  
} 

附上其它几个文件的代码

FileCache.java


package com.imqiyu.aochen;

import java.io.File;

import android.content.Context;

public class FileCache {
    
    private File cacheDir;
    
    public FileCache(Context context){
        //找一个用来缓存图片的路径
        if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED))
            cacheDir=new File(android.os.Environment.getExternalStorageDirectory(),"LazyList");
        else
            cacheDir=context.getCacheDir();
        if(!cacheDir.exists())
            cacheDir.mkdirs();
    }
    
    public File getFile(String url){
        
        String filename=String.valueOf(url.hashCode());       
        File f = new File(cacheDir, filename);
        return f;
        
    }
    
    public void clear(){
        File[] files=cacheDir.listFiles();
        if(files==null)
            return;
        for(File f:files)
            f.delete();
    }

}

MemoryCache.java

package com.imqiyu.aochen;

import java.lang.ref.SoftReference;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import android.graphics.Bitmap;

public class MemoryCache {
    private Map<String, SoftReference<Bitmap>> cache=Collections.synchronizedMap(new HashMap<String, SoftReference<Bitmap>>());//软引用
    
    public Bitmap get(String id){
        if(!cache.containsKey(id))
            return null;
        SoftReference<Bitmap> ref=cache.get(id);
        return ref.get();
    }
    
    public void put(String id, Bitmap bitmap){
        cache.put(id, new SoftReference<Bitmap>(bitmap));
    }

    public void clear() {
        cache.clear();
    }
}

Utils.java

package com.imqiyu.aochen;
import java.io.InputStream;
import java.io.OutputStream;


public class Utils {
    public static void CopyStream(InputStream is, OutputStream os)
    {
        final int buffer_size=1024;
        try
        {
            byte[] bytes=new byte[buffer_size];
            for(;;)
            {
              int count=is.read(bytes, 0, buffer_size);
              if(count==-1)
                  break;
              os.write(bytes, 0, count);              
            }  
            is.close();
            os.close();
                     	
       
      /*     int len=0;
            byte[] buffer = new byte[buffer_size];
            while((len = is.read(buffer)) != -1){
                os.write(buffer, 0, len);
            }
            os.close();
            is.close();  */
            
            
        }
        catch(Exception ex){}
    }
    

}

标签: android

评论(0) 浏览(2612)

android 5分钟集成环信及时聊天DEMO

2014-11-17 奇Yu 移动应用

第一步

首先将环节的UIDEMO 导入到eclipse IDE内

然后新建一个自己想项目

QQ截图20141117155132.png


第二步 将DEMO 变成library



右击 demo 选择Properties

QQ截图20141117155638.png

以次选择 android  勾选is libray 然后选择apply  OK


第三步 复制架包覆盖DEMO的架包

复制自己项目里的 android架包 覆盖DEMO里面的

QQ截图20141117161732.png


第四步 修改 DEMO里面和自己有冲突的布局文件

因为这里是是演示 所以只有 activity_main.xml 这个布局是重名的

修复错误

修改冲突的布局文件.png


第5步

在project.properties文件内添加 manifestmerger.enabled=true 

QQ图片20141117163330.jpg


第六步修改  <application 标签的 android:name值 

android:name="com.easemob.chatuidemo.DemoApplication"

QQ截图20141117164048.png


第七步 在自己的项目引入 library


然后在自己的项目内 点击右键选择Properties

QQ截图20141117160054.png

选择android ->add ->chatdemoui ->ok ->apply->ok


这时候 DEMO应用里面应该会报错

case expressions must be constant expressions

很简单 在报错的 鼠标放到switch 上 安ctrl + 1 让他变成 if esle就可以了

case expressions must be constant expressions.pngQQ截图20141117164252.png


此时基本都可以了 

然后在自己的 项目内 新建一个按钮 监听按钮 点击了打开 DEMO的登录页面


    but=(Button) findViewById(R.id.button1);
        but.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent intent= new Intent(MainActivity.this,com.easemob.chatuidemo.activity.LoginActivity.class); 
startActivity(intent);
}
});

然后运行下看看 ,是不是已经集成了


Screenshot_2014-11-17-17-26-38.pngScreenshot_2014-11-17-17-26-49.pngScreenshot_2014-11-17-17-27-10.png



补充一点 自己的 环信应用标识(AppKey): 可以直接在 DEMO里面修改成自己的就可以了





标签: android

评论(2) 浏览(7765)

phonegap(cordova)从手机app跳转到web页面在跳转回APP本地页面思路

2014-10-11 奇Yu 移动应用

项目中需要用到 WAP支付宝支付。

但是 使用PHONEGAP开发 跳转到支付宝支付,然后跳转回来 就回不到APP的本地页面,

就是使用WAP的第三方登录也是一样的。很难从WAP页面在跳转到 app本地的本地页面


可以看下我的实现思路。

QQ截图20141011163811.png

我是使用phongeap +jqmobi 做的

下面是 点击去支付跳转到 打开IFRAME的页面


    <!-----第三方登录------->
    <div id="qi_disanfang" class="panel padding0" data-header="default_head" data-footer="none" data-load="ondisanfang" data-unload="undisanfang">
        <iframe id="login_content" class="pay_content" style="height:100%;width:100%;border:0 none;" src=''></iframe>
    </div>


只是在页面里面创建了一个IFRAME框,SRC为空

页面初始化函数


/*第三方登录*/
function ondisanfang(){
    //设置标题
    qsetTitle("登录");
    //监听消息状态
    window.addEventListener('message',loginStart, false);
    //远程wap页面的地址
    var url=serverURL+'user.php?act=oath&type=qq&callblock=app/login.php';
    //赋值给iframe 的src 并设置iframe的宽高    
    document.getElementById("login_content").src = url;
    var $pay_content = $("#login_content");
    var h = $pay_content.parent().height();
    var w = $pay_content.parent().width();
    $pay_content.css({
        height: h,
        width: w
    });

}
loginStart 监听消息回调函数

//消息回调函数
function loginStart(e) {
    //判断传过来的消息 是不是自己设置的,这个地方如果想严谨一点还可以判断下 发消息的 域地址是不是自己的地址,我这里没有判断
    if(e.data=='login_success'){
        //如果是就执行自己的方法 跳转到其它页面或者做其它的操作
        ongoto('qi_center');
    }
}
页面卸载函数

function undisanfang() {
    //删除刚才的监听
    window.removeEventListener('message',loginStart,false);
}
这样这个打开远程的iframe框就做好了,所有的wap远程页面都在这里操作。登录。支付。当他们支付成功 都会 有一个 回调页面。
这个回调页面就是我们自己服务器的页面
回调页面里只需要发送一个消息给父窗口,让我们刚才的监听收到消息就可以了
可以在回调页面做一个按钮 来执行一个JS函数,也可以直接发送一个消息,具体看业务逻辑
回调页面JS

  <script type="text/javascript">

		 //给iframe框的父窗口发送一个消息  这个消息内容要和刚才你监听的内容一样
         top.postMessage('login_success', '*');

	
  </script>

标签: phonegap cordova

评论(0) 浏览(9723)

windows下 phonegap(cordova ) nodejs git ant 配置

2014-7-14 奇Yu 移动应用

因为看到交流群了,很多童鞋不知道怎么使用NODEJS来创建cordova 项目。或者是在用NODEJS创建项目时候遇到错误。所以写这篇文章。算是做个标记。

本文不再介绍JAVA jdk 的安装配置。如果不会请自行度娘!

如果安装phonegap官方的说明,

先下载 nodejs 安装

然后在 用


C:\> npm install -g phonegap


命令 你会发现

提示 npm ERR! not found:git

这是因为你的系统没有安装GIT工具

GIT具体是做什么的 自行度娘!!

QQ图片20140714220815.jpg


下面是正确的做法

第一步 、

首先去 http://nodejs.org/

下载NODEJS 

只需要点击绿色的 INSTALL

他会自动下载适合你系统的版本

QQ图片20140714220329.jpg

这个没有什么,只需要下一步,下一步安装好了。


第二步、

安装GIT工具

1 官方网站 http://msysgit.github.io/ 

也可以去谷歌下载不过因为ZF的和谐,速度不敢恭维,甚至打不开

这里提供一个CNDS的地址

http://download.csdn.net/detail/z4231/7620429

安装也没有什么,只需要下一步,下一步即可。

最后需要设置的


在 我的电脑 -》属性-》环境变量-》系统变量 ->PATH内添加、

你GIT的安装目录下的bin  和libexec\git-core;的路径 注意需要用;和隔开

D:\Program Files\Git\bin;

D:\Program Files\Git\libexec\git-core;


QQ图片20140714222211.jpg


第三步

安装 ANT

下载地址

http://ant.apache.org/

下载后直接解压

然后将解压后的文件放到  你程序的安装目录 例如 我的会放到 D:\Program Files目录下

然后设置环境变量

新建一个ANT_HOME 值是你刚才的目录 D:\Program Files\apache-ant-1.9.3

ANT_HOME: D:\Program Files\apache-ant-1.9.3

在path 内追加 %ANT_HOME%\bin;

如果存在 CLASSPATH的变量则追加

不存在则 新建CLASSPATH然后值为%ANT_HOME%\lib



ANT_HOME: D:\Program Files\apache-ant-1.9.3

path:%ANT_HOME%\bin;
CLASSPATH:%ANT_HOME%\lib


请确保你的android adt安装成功 有在系统环境变量内配置 platform-tools和tools的两个目录 

PATH:安装目录\tools;安装目录\platform-tools

至此你的phonegap已经配置成功了。。

接下来你可以运行 CMD命令

输入

 npm install -g cordova
在网络畅通的情况下。稍等片刻 你就安装成功了





标签: phonegap cordova

评论(0) 浏览(9287)

Powered by emlog 豫ICP备14014990号-1 sitemap