Android中集成QQ登陆和QQ空间分享
本文基于QQ open sdk V2.4.1。
QQ登錄應用有一個地方是需要注意的, QQ申請同一品牌應用(包括網站和app),需要相互依賴申請,因為在QQ互聯中,一個應用對應一個app key,如果網站和app的app key是不同的,這樣相同用戶使用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%E4%B8%8B%E8%BD%BD),解壓看到,doc是需集成移動數據分析才會使用到,也是一個教程,在這里不介紹了。jar就是open qq提供的jar包,但這里我們只需要用到?open_sdk_***.jar.我們把這個包復制到我們項目中的libs中,然后配置要引用路徑java path。
4.在Manifest中申明權限:
<uses-permissionandroid:name="android.permission.INTERNET" /> <uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE" />5.在Manifest中添加這些Activity
<activityandroid:name="com.tencent.tauth.AuthActivity"android:noHistory="true"android:launchMode="singleTask"><intent-filter><action android:name="android.intent.action.VIEW" /><category android:name="android.intent.category.DEFAULT" /><category android:name="android.intent.category.BROWSABLE" /><!--下面這個XXXXXXXXXXXX就是你申請騰訊開發平臺所給的app key--><data android:scheme="tencentXXXXXXXXXXXX" /></intent-filter></activity><activity android:name="com.tencent.connect.common.AssistActivity"android:theme="@android:style/Theme.Translucent.NoTitleBar"android:configChanges="orientation|keyboardHidden"/>QQ登錄
1. 我們需要一個全局變量public static Tencent mTencent,當然你也可以聲明為私有的非靜態類型,這個是open qq給的例子中是這么寫,為什么要這么用,后面會解釋。
2.使用QQ登錄:
private void loginByQQ(){// Constant.QQ_KEY 這里是申請open qq給的app keymTencent =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登錄用戶信息
?
privatevoid 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 {@Overridepublic void onComplete(Objectresponse) {//V2.0版本,參數類型由JSONObject 改成了Object,具體類型參考api文檔doComplete((JSONObject)response);}protected void doComplete(JSONObjectvalues) {//在這里可以做一些登錄成功的處理ToastUtil.showToast(LoginActivity.this,getString(R.string.login_success));}@Overridepublic void onError(UiError e) {//在這里可以做登錄失敗的處理ToastUtil.showToast(LoginActivity.this,getString(R.string.qq_login_fail));}@Overridepublic void onCancel() {//在這里可以做登錄被取消的處理ToastUtil.showToast(LoginActivity.this,getString(R.string.qq_login_cancel));}}
分享到QQ空間
方式一:
?在登錄的時候,前面我們有用到public static Tencent mTencent,這個變量聲明為靜態變量,因為在demo例子中,這個mTencent對象在最底的Activty,所以它一直都沒有被關閉,一直有效。因此,在這種情況下,我們可以直接用下面這個方法來做QQ分享。
1.分享方法:
privatevoid shareToQQzone(){mQzoneShare = new QzoneShare(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<String> imageUrls = newArrayList<String>();imageUrls.add("http://media-cdn.tripadvisor.com/media/photo-s/01/3e/05/40/the-sandbar-that-links.jpg"); // for (int i = 0; i <mImageContainerLayout.getChildCount(); i++) { // LinearLayout addItem = (LinearLayout)mImageContainerLayout.getChildAt(i); // EditText editText = (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, new IUiListener() {@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<String> imageUrls = new ArrayList<String>();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. ?回調
privateclass 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%E8%B0%83%E7%94%A8%E8%AF%B4%E6%98%8E#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為好友才可以進行測試。
?
總結
以上是生活随笔為你收集整理的Android中集成QQ登陆和QQ空间分享的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度学习基础--正则化与norm--Sw
- 下一篇: Android分区存储