Android中集成QQ登陆和QQ空间分享 qq分享sdk集成
QQ登录应用有一个地方是需要注意的,QQ申请同一品牌应用(包括网站和app),需要相互依赖申请,因为在QQ互联中,一个应用对应一个app key,如果网站和app的appkey是不同的,这样相同用户使用QQ登录时候所产生的openid就会不同了,此时无法判断是否为同一个用户。在QQ互联中,一个用户的openid是对应一个应用,也就是说,如果这个用户去登录别的应用,QQ互联返回的openid是不同的。准备工作:1.注册腾讯开发者账号,上http://open.qq.com注册,填写好详细信息认证开发者信息,大概等1个工作日就可以审核完毕。2.审核通过后可以在“管理资料”中创建应用,在这里我们选择的是移动应用。3.下载open qq给的sdk包(http://wiki.open.qq.com/wiki/mobile/SDK下载),解压看到,doc是需集成移动数据分析才会使用到,也是一个教程,在这里不介绍了。jar就是openqq提供的jar包,但这里我们只需要用到open_sdk_***.jar.我们把这个包复制到我们项目中的libs中,然后配置要引用路径javapath。4.在Manifest中申明权限:
5.在Manifest中添加这些Activity android:name="com.tencent.tauth.AuthActivity" android:noHistory="true"android:launchMode="singleTask"> android:theme="@android:style/Theme.Translucent.NoTitleBar"android:configChanges="orientation|keyboardHidden"/>
QQ登录
1. 我们需要一个全局变量public static TencentmTencent,当然你也可以声明为私有的非静态类型,这个是open qq给的例子中是这么写,为什么要这么用,后面会解释。2.使用QQ登录:private void loginByQQ(){ // Constant.QQ_KEY这里是申请open qq给的app key mTencent=Tencent.createInstance(Constant.QQ_KEY, LoginActivity.this); if(!mTencent.isSessionValid()) {IUiListener listener = newBaseUiListener() {@Overrideprotected voiddoComplete(JSONObject values) { //Log.e("qq",values.toString()); try {//在这里我们可以去到唯一QQ互联可以给我们识别不同QQ用户的openidqqOpenId= values.getString("openid"); } catch(JSONException e) {//TODO Auto-generated catch blocke.printStackTrace(); }finally{if(qqOpenId==null){qqOpenId= "";} }ToastUtil.showToast(LoginActivity.this,"login success"); updateUserInfo();//Log.e("SDKQQAgentPref","AuthorSwitch_SDK:" +SystemClock.elapsedRealtime());}}; mTencent.login(this,"all", listener);//Log.e("SDKQQAgentPref","FirstLaunch_SDK:" +SystemClock.elapsedRealtime()); } else {mTencent.logout(this); }}3. 获取QQ登录用户信息private void updateUserInfo() { if (mTencent != null&&mTencent.isSessionValid()) {IUiListener listener = newIUiListener() {@Overridepublic voidonError(UiError e) { //获取不到这个信息}@Overridepublic voidonComplete(final Object response) { JSONObjectjson =(JSONObject)response; //Log.e("qquser info",json.toString());可以在这里打印来看看获取到了用户的什么信息,如果你想获取QQ号,那是不可能的 //因为open qq没有提供这样的接口。 StringnickName =getString(R.string.qq_user);//比如QQ昵称 try {nickName= json.getString("nickname");} catch (JSONException e) {e.printStackTrace(); }}@Overridepublic voidonCancel() { //获取用户信息被取消}};UserInfo mInfo = newUserInfo(this,mTencent.getQQToken());mInfo.getUserInfo(listener); } else { }}4. 最重还需要一个回调类private classBaseUiListener implements IUiListener { @Override public void onComplete(Objectresponse){//V2.0版本,参数类型由JSONObject 改成了Object,具体类型参考api文档doComplete((JSONObject)response); } protected void doComplete(JSONObjectvalues){//在这里可以做一些登录成功的处理ToastUtil.showToast(LoginActivity.this,getString(R.string.login_success)); } @Override public void onError(UiError e) {//在这里可以做登录失败的处理ToastUtil.showToast(LoginActivity.this,getString(R.string.qq_login_fail)); } @Override public void onCancel() {//在这里可以做登录被取消的处理ToastUtil.showToast(LoginActivity.this,getString(R.string.qq_login_cancel)); } }
分享到QQ空间
方式一:
在登录的时候,前面我们有用到public static TencentmTencent,这个变量声明为静态变量,因为在demo例子中,这个mTencent对象在最底的Activty,所以它一直都没有被关闭,一直有效。因此,在这种情况下,我们可以直接用下面这个方法来做QQ分享。1.分享方法:privatevoid shareToQQzone(){ mQzoneShare = newQzoneShare(this,LoginActivity.mTencent.getQQToken()); final Bundle params = new Bundle(); //设置分享类型:图文并茂加链接。其他类型见帮助文档 int shareType =QzoneShare.SHARE_TO_QZONE_TYPE_IMAGE_TEXT;params.putInt(QzoneShare.SHARE_TO_QZONE_KEY_TYPE, shareType); //标题params.putString(QzoneShare.SHARE_TO_QQ_TITLE, "测试"); //内容params.putString(QzoneShare.SHARE_TO_QQ_SUMMARY,"contenttext"); if (shareType!=QzoneShare.SHARE_TO_QZONE_TYPE_APP) {//app分享不支持传目标链接params.putString(QzoneShare.SHARE_TO_QQ_TARGET_URL,"http://www.hicsg.com");}// // 支持传多个imageUrl,在这里我测试只放一张图片,最多可以放9张ArrayList imageUrls = newArrayList();imageUrls.add("http://media-cdn.tripadvisor.com/media/photo-s/01/3e/05/40/the-sandbar-that-links.jpg");// for (int i = 0; i// LinearLayout addItem =(LinearLayout)mImageContainerLayout.getChildAt(i);// EditTexteditText = (EditText)addItem.getChildAt(1);// imageUrls.add(editText.getText().toString());// }// String imageUrl = "XXX";//params.putString(Tencent.SHARE_TO_QQ_IMAGE_URL,imageUrl);params.putStringArrayList(QzoneShare.SHARE_TO_QQ_IMAGE_URL,imageUrls);doShareToQzone(params);}2.回调方法:privatevoid doShareToQzone(final Bundle params) {//final Activity activity =ProductDetailActivity.this;new Thread(new Runnable() {@Overridepublic void run() { Log.e("share","qzone");// TODO Auto-generated methodstubmQzoneShare.shareToQzone(ProductDetailActivity.this,params, newIUiListener() {
@Overridepublic void onCancel() { //取消分享 Log.e("qzone share", "cancel");}
@Overridepublic void onError(UiErrore) { //分享错误 Log.e("qzone share", "error:"+e.errorDetail);}
@Overridepublicvoid onComplete(Object response) {//分享成功Log.e("qzoneshare", "success");}
});}}).start();}
方式二:
当然上面那种方式是比较不符合我们的使用习惯的,比如,我登录了一段时间,先把Activity关闭,我再打开app但是不登录,此时需要做分享处理,上面那个方法就会报空指针异常。此时,我们就需要用这个方法1.分享到QQ空间private void shareToQQzone() {final Bundle params = new Bundle();params.putInt(QzoneShare.SHARE_TO_QZONE_KEY_TYPE,QzoneShare.SHARE_TO_QZONE_TYPE_IMAGE_TEXT);params.putString(QzoneShare.SHARE_TO_QQ_TITLE, "Test");params.putString(QzoneShare.SHARE_TO_QQ_SUMMARY,"content infro");params.putString(QzoneShare.SHARE_TO_QQ_TARGET_URL,"http://www.hicsg.com");ArrayList imageUrls = new ArrayList();imageUrls.add("http://media-cdn.tripadvisor.com/media/photo-s/01/3e/05/40/the-sandbar-that-links.jpg");params.putStringArrayList(QzoneShare.SHARE_TO_QQ_IMAGE_URL,imageUrls);params.putInt(QzoneShare.SHARE_TO_QQ_EXT_INT,QQShare.SHARE_TO_QQ_FLAG_QZONE_AUTO_OPEN);Tencent mTencent =Tencent.createInstance(Constant.QQ_KEY,ProductDetailActivity.this);mTencent.shareToQzone(ProductDetailActivity.this, params,newBaseUiListener());}2.回调private class BaseUiListener implements IUiListener {@Overridepublic void onComplete(Objectresponse) {//V2.0版本,参数类型由JSONObject 改成了Object,具体类型参考api文档doComplete((JSONObject)response);}protected void doComplete(JSONObjectvalues) {//分享成功}@Overridepublic void onError(UiError e) {//在这里处理错误信息if(e.errorDetail == null){ToastUtil.showToast(ProductDetailActivity.this,getString(R.string.no_qq));}else{ToastUtil.showToast(ProductDetailActivity.this,getString(R.string.share_fail)+":"+e.errorDetail);}}@Overridepublic void onCancel() {//分享被取消ToastUtil.showToast(ProductDetailActivity.this,getString(R.string.share_cancel));}}
更多api帮助见api文档:http://wiki.open.qq.com/wiki/Android_API调用说明#1.14_.E5.88.86.E4.BA.AB.E5.88.B0QQ.E7.A9.BA.E9.97.B4.EF.BC.88.E6.97.A0.E9.9C.80QQ.E7.99.BB.E5.BD.95.EF.BC.89别忘了要在代码混淆中添加-keep class com.tencent.open.TDialog$*-keep class com.tencent.open.TDialog$* {*;}-keep class com.tencent.open.PKDialog-keep class com.tencent.open.PKDialog {*;}-keep class com.tencent.open.PKDialog$*-keep class com.tencent.open.PKDialog$* {*;}
P.S测试的时候,需要开发者账号QQ或者加这个QQ为好友才可以进行测试。新浪的排版比较难看,可以看我的技术博客:http://blog.csdn.net/arjinmc/article/details/38439957
更多阅读
手机中病毒的危害和如何清理 手机病毒怎么清理
手机中病毒的危害和如何清理——简介 对于手机中病毒的用户来说一定要及时的清理,否则会对我们的手机和个人信息及财产造成威胁。手机病毒都具备相应的传染性和破坏性,机上网支付等功能也呈现更为全面的趋势。那么,手机中毒后不能及时
qq空间分享怎么删除 批量删除qq空间的分享
qq空间分享怎么删除——简介分享是很多人都会做的一件事,将有趣的文章视频分享到自己的QQ空间,或许有时候只是为了骗点访问,增加点人气,但也是一种乐趣,如果打算删除分享呢?qq空间分享怎么删除——方法/步骤qq空间分享怎么删除 1、登陆自
全国农村住房信息系统登陆和使用方法 全国农村住房系统
全国农村住房信息系统登陆和使用方法——简介全国农村住房信息系统是2014年5月份国家住房和城乡建设部指示建议下创建的系统。建立全国农村住房信息系统的目的,全面把握和评估全国农村人居环境状况,切实改善农村人居环境现状。那么,全
在word中如何编辑边框和底纹 word边框和底纹在哪
Word是最常用的办公软件之一,如何才能在Word中编辑边框和底纹呢?在word中如何编辑边框和底纹——认识边框和底纹在word中如何编辑边框和底纹 1、边框和底纹可以通过选择“格式--
如何删除或者隐藏ps中的参考线和标尺? ps隐藏参考线
有时候从网上下载psd文件打开时,用photoshop打开后,会看到横横竖竖的各色各样的长线,这其实就是photoshop中的“参考线和标尺”,那么如果我们不需要这些 辅助的功能呢?想删除或者 隐藏这些线,那该如何做呢?下面就是自己总结的几条经验,跟大家分享下。