我们在接入qq登录时,如果安装了qq手机客户端,qq登录时会调起客户端进行授权,那么这个授权方式是怎么实现的呢?
看看qq的授权方式
1、通过sdk打开客户端,进入到授权页面
2、接入sdk的客户端需要重写onActivityResult进行数据的回调
3、授权的页面所在的activity需要加上android:exported="true"
动手写写看:
1、先编写sdk
看看AuthSDK,这里有两个方法,一个是测试登录的方法,调用这个方法可以打开授权页面,另一个是授权回调的数据,需要在接入sdk的client端接入
package com.authsdk.api;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.widget.Toast;
import com.authsdk.constants.Codes;
import com.authsdk.listener.AuthListener;
import com.authsdk.util.Utils;
public class AuthSDK {
private static AuthListener mAuthListener;
/**
* 测试登录
* @param context
* @param authListener
*/
public static void login(Activity context,AuthListener authListener){
mAuthListener=authListener;
if(!Utils.checkApplication(context, "com.example.authsdkclient")){
Toast.makeText(context, "请先安装Auth客户端", Toast.LENGTH_LONG).show();
return;
}
Intent intent=new Intent();
intent.setComponent(new ComponentName("com.example.authsdkclient", "com.example.authsdkclient.AuthSDKActivity"));
context.startActivityForResult(intent, Codes.REQUEST_LOGIN_CODE);
}
/**
* ActivityResult回调
*
* @param requestCode
* @param resultCode
* @param data
*/
public static void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == Codes.REQUEST_LOGIN_CODE){
if(null != mAuthListener){
mAuthListener.onAuth(data.getStringExtra("authmsg"));
}
}
}
}
2、编写授权页面的客户端
package com.example.authsdkclient;
import java.util.HashMap;
import java.util.Map;
import org.json.JSONObject;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
public class AuthSDKActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_authsdk);
findViewById(R.id.back).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Map<String, Object> map=new HashMap<String, Object>();
map.put("code", Status.BACK);
map.put("message", "点击了返回");
Intent intent=new Intent();
intent.putExtra("authmsg", getData(map));
setResult(Codes.RESULT_BACK_CODE, intent);
finish();
}
});
findViewById(R.id.auth).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
final ProgressDialog p=new ProgressDialog(AuthSDKActivity.this);
p.setMessage("正在登录");
p.create();
p.show();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
p.cancel();
Map<String, Object> map=new HashMap<String, Object>();
map.put("code", Status.BACK);
map.put("message", "授权成功");
Intent intent=new Intent();
intent.putExtra("authmsg", getData(map));
setResult(Codes.RESULT_AUTH_CODE, intent);
finish();
}
}, 2000);
}
});
}
public String getData(Map<String, Object> map){
JSONObject json=new JSONObject(map);
return json.toString();
}
}
注意,记得在AndroidManifest.xml中加上
<activity android:name="com.example.authsdkclient.AuthSDKActivity"
android:exported="true"></activity>
package com.example.authsdkdemo;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import com.authsdk.api.AuthSDK;
import com.authsdk.listener.AuthListener;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//登录
AuthSDK.login(MainActivity.this, new AuthListener() {
@Override
public void onAuth(String data) {
// TODO Auto-generated method stub
System.out.println("data;"+data);
}
});
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
//必须的回调
AuthSDK.onActivityResult(requestCode, resultCode, data);
}
}
看看效果