制作一个类似QQ第三方登陆的sdk平台(安卓版)

最近公司需要做一个SDK,该SDK为其他的APP可以调用我们的APP,然后通过获取我们的APP获取用户信息,返回给他们一个唯一的授权码。

说白了就是弄一个第三方登陆功能,通过登陆我们的用户中心,给他们一个用户标识。

      这个SDK需要分解开来做,需要实现下面功能:

      可以检测我们的APP是否已经安装
      能够把我们给他们的APPID和APPKEY标识在跳转到我们APP的时候带过来
      可以处理在我们这边登录后的返回信息 
           1.取消登录
            2.登录成功--返回用户信息
            3.发生其他错误

而我们的APP同时也要提供这个功能:
        从别的APP跳转过来的时候,判断是否是请求用户登录(提供登录界面)
        根据用户行为返回特定信息给对方的APP

进展步骤:

        1.获取某个应用是否安装的代码:
             
public static boolean checkApkExist(Context context, String packageName) {
		if (packageName == null || "".equals(packageName)) {
			return false;
		}
		try {
			context.getPackageManager().getApplicationInfo(packageName,
					PackageManager.GET_UNINSTALLED_PACKAGES);
			return true;
		} catch (NameNotFoundException e) {
			return false;
		}
	}
2.应用之间跳转(并且带参数):
   在这里我假设有两个应用A和B,B是我们的应用,A需要使用我们提供的SDK跳转到我们B中进行登录,登录完成后从B返回到A,在这里假设B的包名(com.xxx.B),B中有个叫ApiActivity的页面来控制登录逻辑。
         从A跳转到B的代码是:
       
<span style="white-space:pre">		</span>ComponentName comp = new ComponentName("com.nbg.baby", 
		"com.nbg.baby.ApiLoginActivity"); 
		
		Intent intent = new Intent();
		intent.setComponent(comp);	 
		intent.setAction(Intent.ACTION_VIEW); 
		Bundle bundle = new Bundle(); 
		bundle.putString("extra", "extra.login"); 
		intent.putExtras(bundle); 
		
		if(Utils.checkApkExist(MainActivity.this, "com.nbg.baby")){
			startActivityForResult(intent, 1);
		}else{
			Toast.makeText(MainActivity.this, "应用未安装,无法跳转", Toast.LENGTH_SHORT).show();
		}</span>
A中接受B中返回数据:
	@Override
	public void onActivityResult(int requestCode, int resultCode, Intent data) {	
		if(requestCode ==1){
			String result = data.getStringExtra("result");
			Toast.makeText(this, result, Toast.LENGTH_SHORT).show();;
		}
	}

B中处理正常处理从A传过来数据即可。但是有一点要注意,B的ApiActivity属性,一定要设置:android:exported="true",否则会报错,权限被拒绝!

3.数据传输加密
延续2中叫法,A和B。在B中,要有我们提供给他们的appid和appkey,并且appid和appkey是成对出现,同时要把A的包名传过去,进行加密。在B中对加密的数据进行解密,确认,确实是从我们这边分配的appid和appkey,然后B中进行账号处理,返回一个唯一的openid给A,同时也把账号昵称和头像等数据传过去。

4.制作SDK
前面3个步骤都是准备工作,真正要制作SDK,还是从这一步开始,制作的SDK会导出为jar包,它的主要作用就是负责把A跳转到B之前的准备工作都做好已经处理从B中返回的数据。
    1.创建一个单例类YoYo
该类的实现:
public class YoYo {
	
	 private static YoYo sInstance;
	 private IUiListener listener;
	 
	 private YoYo(String appId, Context context)
	 {
		 
	 }
	 
	 public static synchronized YoYo createInstance(String appId, Context context)
	 {
		 if(sInstance==null){
			 sInstance= new YoYo(appId, context);
		 }
		 return sInstance;
	 }
	 
	 public void login(Activity context, IUiListener callBack)
	 {
		ComponentName comp = new ComponentName("com.nbg.baby", 
					"com.nbg.baby.ApiLoginActivity"); 
					
		Intent intent = new Intent();
		intent.setComponent(comp);	 
		intent.setAction(Intent.ACTION_VIEW); 
		Bundle bundle = new Bundle(); 
		bundle.putString("extra", "我来自星星"); 
		intent.putExtras(bundle);
		context.startActivityForResult(intent, 1);
		this.listener = callBack;
		
	 }
	 public boolean onActivityResult(int requestCode, int resultCode, Intent data) {
		 if(requestCode ==1){
				if(resultCode == Activity.RESULT_CANCELED){
					String result = data.getStringExtra("result");
					UiError e = new UiError(0, "取消登陆", "用户取消");
					this.listener.onError(e);
				}else{
					String result = data.getStringExtra("nickname");
					
					JSONObject object = new JSONObject();
					try {
						object.put("昵称", result);
						this.listener.onComplete(object);
					} catch (JSONException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		 return false;
	 }
}

     2.创建一个回调接口
 该接口的实现:
public interface IUiListener {
	
	  public abstract void onComplete(Object response);
	  
	 
	  public abstract void onError(UiError e);
	  
	 
	  public abstract void onCancel();
}
3.打包输出sdk的jar包
   新建一个android 项目,把上面的代码放入src中,然后项目右键,选择”export"=>"java"=>jar file之后,只选择导出src文件夹,然后选择“导出.class文件夹”,设置目标位置,点“导出”即可。

5.SDK的使用
sdk打包成jar包之后,就可以给别的应用使用了,给他们分配一个appid,然后把jar发给他们,在他们的项目里面,只要把YoYo类创建,实现IUiListener接口,最后在他们的activity中的onactivityresult函数中调用yoyo.onactivityresult()就可以了(这一步骤千万不能忘!)


PS:本SDK是参照QQ第三方登陆的SDK说明文档做的,完全仿照他们的接口调用方式进行。QQ第三方登陆安卓版的地址:http://wiki.connect.qq.com/%E4%BD%BF%E7%94%A8sdk%E5%AE%9E%E7%8E%B0qq%E7%9A%84%E7%99%BB%E5%BD%95%E5%92%8C%E6%B3%A8%E9%94%80_android_sdk

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。