今天学习了第三方登录(使用了ShareSdk)。使用qq或者新浪微博来登录。感觉受益匪浅。得记下来。
文字写的非常没有条理。
1.到mob官网去创建应用,下载对应的sdk,然后在打开QuickIntegrater.jar,填入创建应用程序(是应用程序)的名称,选择好第三方登录的平台和应用的包名,然后得到的一个带有应用名称命名的文件夹,然后替换应用程序中的相应文件。出现编码异常则改变编码。
2.添加权限
3.接下来到微博开放平台,qq开放平台注册应用,得到的appID,appkey等信息填入到ShareSDK.xml文件夹内(替换对应的项目)
4.集成第三方登录,找到ShareSDK的第三方登录的代码块(授权方法),实现对应的监听方法(根据登录是否成功对应的方法),这个方法需要传入对应得到平台信息,平台信息都是从ShareSDK中得来的。接下来就是在onComplete()方法中获取用户的信息(用户name,头像和地址),使用SharedPreferences来存储信息
5.定义一个本地广播,通过广播的相应来改变主界面中的头像,这里牵涉到了xUtils的使用。因为在getSharedPreferences中得到的是头像的地址,需要用xutils来实现异步加载。
6.完成xutils的配置,创建一个类,定义一个方法,传入对应的context,返回的是BitmapUtils对象
7.在主程序中调用这个方法,通过display得到对应的imageview的id,填充从SharedPreferences得到的img。
下面这些太乱了,也留着。
使用到了Mob的官网,创建好目标应用,然后就是下载对应的sdk,下载后,双击ShareSDKd jar包,填入你应用的名称和包名,然后选择对应分享的客户端,得到的文件,替换掉应用中的相应同名的文件夹。过程中如果出现编码异常,不兼容则把对应编码改成你对应的目标。接下就是添加权限。在集成过程中在asserts文件夹下的appk替换成新建应用的appkyey;接下来就是登陆到微博开放平台,创建一个的应用,在应用信息里可以找到应用的appkey和appsecret 添加到ShareSDK.xml文件夹内,替换对应微博目录下的appkey和appsecret,接下来登录qq互联平台,也创建一个应用,找到应用信息里的appkey和appsecret,也添加到ShareSDK文件中qq对应的项目,其中ShareByappClient对应改成false,表示我们只用服务器端做第三方分享。对了,还得改一处,在清单文件中把scheme项目对应的tencent后面的一串改成在qq中创建应用的appId,接下就是关键啦,集成第三方登录。找到授权对应的一串代码块(这是授权方法),进行删减,留下后面三句,非常重要的三句,记得实现授权方法中的监听方法(包括登录成功和失败等具体的方法),传入这个方法的是登录平台信息,这些信息是在 ShareSDK中得来的,因为我的目标是完成qq和新浪微博的登录,所以在点击对应图片的候,设置好监听,以传入对应平台信息给上面的授权方法。接下来就是获得登录用户的具体信息。在onComplete方法中区分是哪个第三方登录的,分别写出对应的操作,获得的信息都是相同的 用户name,头像和地址。得到了用户的信息后,使用Sharepreference来存储用户的信息,该存储方式很重要,记得提交呀;接下来,发送一个广播,这个广播很是重要,理解下,触发的结果是改变主界面中的用户头像,改成对应平台的用户的头像,广播也是很重要的。自定义好广播接收者,接收的是sharepreference里的头像文件。此时得到的是头像的链接地址,需要做的是异步加载,使用xutils来完成异步加载。首先需要配置好xutils的文件。新建一个类,SystemUtil.class,在这里面定义一个方法,BitmapUtils对应的方法如果加载失败就用默认的头像,也就是刚开始时主界面的那个图像,接下来支持内存,硬盘,缓存操作,然后把对象返回。来打主界面,调用刚才的方法把sharepreference里的头像替换主界面的用户头像。注册好广播后,需要把ShareSDK的初始化做好,不能忘了。
部分代码: @Override
public void onClick(View v) {
// TODO Auto-generated method stub
//用sharesdk做第三方登录和第三方分享
switch (v.getId()) {
case R.id.left_header_qq:
Platform plat = ShareSDK.getPlatform(QQ.NAME);//获得qq用户名
authorize(plat);
break;
case R.id.left_header_sina:
Platform plat1 = ShareSDK.getPlatform(SinaWeibo.NAME);//获得qq用户名
authorize(plat1);
break;
default:
break;
}
}
//authorize方法是在mob中第三方登录中整来的,删除了很多,留下了有用的三句
private void authorize(Platform plat) {
//判断指定平台是否已经完成授权
plat.setPlatformActionListener(this);//第三方登录成功后,会相应
// true不使用SSO授权,false使用SSO授权
plat.SSOSetting(true);
//获取用户资料
plat.showUser(null);
}
@Override
public void onCancel(Platform arg0, int arg1) {
// TODO Auto-generated method stub
}
//授权成功
//HashMap
@Override
public void onComplete(Platform arg0, int arg1, HashMap
// TODO Auto-generated method stub
//先判断是什么平台,然后再按照平台来做
String img;//头像
String name;//昵称
String address;//地址
if(arg0.getName().equals(QQ.NAME))
{
img = arg2.get("figureurl").toString();
name = arg2.get("nickname").toString();
address = arg2.get("city").toString();
}else
{
img = arg2.get("profile_image_url").toString();
name = arg2.get("name").toString();
address = arg2.get("location").toString();
}
//得到头像,名字,地址后把这些地址保存起来。存到SharedPreferences里面?
// SharedPreferences.Editor edit = getSharedPreferences("users", Context.MODE_PRIVATE).edit();
// edit.putString(key, value)
getSharedPreferences("user", Context.MODE_PRIVATE).edit()
.putString("img", img)
.putString("name", name)
.putString("address", address)
.commit();
//接下来发送广播,给自己,Homeactivity!
sendBroadcast(new Intent("changeHeader"));
}
@Override
public void onError(Platform arg0, int arg1, Throwable arg2) {
// TODO Auto-generated method stub
}
class Brocastreceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
//接收到广播的操作是把 sharepreference的数据取得并加载到img头像呀
//得到啦头像的链接地址,然后进行异步加载,用xutils
String img = getSharedPreferences("user", Context.MODE_PRIVATE).getString("img", "");
SystemUtil.getBitMapUtils(act).display(home_header_left, img);
}
}
//******************************
public static BitmapUtils getBitMapUtils(Context context)
{
BitmapUtils bu = new BitmapUtils(context);
//加载链接失败就仍旧用初始化应用时的图片作为头像
bu.configDefaultLoadFailedImage(R.drawable.default_user_leftdrawer);
//支持双缓存 内存和硬盘
bu.configMemoryCacheEnabled(true);
bu.configDiskCacheEnabled(true);
//把bu对象返回出去
return bu;
}