1. 程式人生 > >android開發之&整合qq分享的那些坑

android開發之&整合qq分享的那些坑

前段時間公司要整合qq分享,雖說都知道騰訊的的文件寫的坑多,但是沒辦法,只能硬著頭皮往上衝。

首先我們需要先下載qq的sdk,我用的是基礎版本open_sdk_r5788_lite.jar,之後匯入到工程,這個就不說了,接下來需要在清單檔案中申請許可權,這個也不說了,騰訊文件上都有。

之後在application標籤下寫上

<activity
android: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" /> <data android:scheme="tencentAPP_ID" /> </intent-filter> </activity>
<activity android:name="com.tencent.connect.common.AssistActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:configChanges="orientation|keyboardHidden|screenSize" />

這兩個activity必須要寫,否則無法成功,

<data android:scheme="tencentAPP_ID" />

一定要注意這裡,在app_id前面加上tencent,否則分享之後收不到結果,也不知道騰訊為啥要這樣幹。

接下來建立例項,在程式碼中新增

mTencent = Tencent.createInstance("APP_ID", this.getApplicationContext());

實現回撥

class MyIUiListener implements IUiListener{

    @Override
public void onComplete(Object o) {
        Toast.makeText(InviteFriendActivity.this, "分享成功!", Toast.LENGTH_SHORT).show();
}

    @Override
public void onError(UiError uiError) {
        Toast.makeText(InviteFriendActivity.this, uiError.errorMessage, Toast.LENGTH_SHORT).show();
}

    @Override
public void onCancel() {
        Toast.makeText(InviteFriendActivity.this, "分享取消!", Toast.LENGTH_SHORT).show();
}
}

接受分享結果的時候要注意,需要在呼叫介面的Activity的onActivityResult方法中增加如下程式碼:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (null != mTencent) {
       Tencent.onActivityResultData(requestCode, resultCode, data, listener);
}
}

其中onActivityResultData介面中的listener為當前呼叫的Activity所實現的相應回撥UIListener。

最後就是喚醒qq,進行分享了,當時按照qq的文件來,各種報錯,也不知道為啥,後來在網上查了下,現在把程式碼貼出來共享一下

public class ShareUtils {

    /**
     * (2) 分享純圖片
     * QQShare.SHARE_TO_QQ_KEY_TYPE    必選 Int    分享型別,分享純圖片時填寫QQShare.SHARE_TO_QQ_TYPE_IMAGE。
     * QQShare.SHARE_TO_QQ_IMAGE_LOCAL_URL 必選 String 需要分享的本地圖片路徑。
     * QQShare.SHARE_TO_QQ_APP_NAME    可選 String 手Q客戶端頂部,替換“返回”按鈕文字,如果為空,用返回代替。
     * QQShare.SHARE_TO_QQ_EXT_INT 可選 Int    分享額外選項,兩種型別可選(預設是不隱藏分享到QZone按鈕且不自動開啟分享到QZone的對話方塊):
     * QQShare.SHARE_TO_QQ_FLAG_QZONE_AUTO_OPEN,分享時自動開啟分享到QZone的對話方塊。
     * QQShare.SHARE_TO_QQ_FLAG_QZONE_ITEM_HIDE,分享時隱藏分享到QZone按鈕。
     */
public static  void onClickShare(Tencent mTencent, Activity activity, IUiListener listener) {
        Bundle params = new Bundle();
//        params.putString(QQShare.SHARE_TO_QQ_IMAGE_LOCAL_URL,imageUrl.getText().toString());
//        params.putString(QQShare.SHARE_TO_QQ_APP_NAME, appName.getText().toString());
params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_IMAGE);
params.putInt(QQShare.SHARE_TO_QQ_EXT_INT, QQShare.SHARE_TO_QQ_FLAG_QZONE_AUTO_OPEN);
mTencent.shareToQQ(activity, params, listener);
}
    /**
     * (3) 分享音樂
     * QQShare.SHARE_TO_QQ_KEY_TYPE    必填 Int    分享的型別。分享音樂填Tencent.SHARE_TO_QQ_TYPE_AUDIO。
     * QQShare.PARAM_TARGET_URL    必選 String 這條分享訊息被好友點選後的跳轉URL。
     * QQShare.SHARE_TO_QQ_AUDIO_URL   必填 String 音樂檔案的遠端連結, 以URL的形式傳入, 不支援本地音樂。
     * QQShare.PARAM_TITLE 必選 String 分享的標題, 最長30個字元。
     * QQShare.PARAM_SUMMARY   可選 String 分享的訊息摘要,最長40個字元。
     * QQShare.SHARE_TO_QQ_IMAGE_URL   可選 String 分享圖片的URL或者本地路徑。
     * QQShare.SHARE_TO_QQ_APP_NAME    可選 String 手Q客戶端頂部,替換“返回”按鈕文字,如果為空,用返回代替。
     * QQShare.SHARE_TO_QQ_EXT_INT 可選 Int    分享額外選項,兩種型別可選(預設是不隱藏分享到QZone按鈕且不自動開啟分享到QZone的對話方塊):
     * QQShare.SHARE_TO_QQ_FLAG_QZONE_AUTO_OPEN,分享時自動開啟分享到QZone的對話方塊。
     * QQShare.SHARE_TO_QQ_FLAG_QZONE_ITEM_HIDE,分享時隱藏分享到QZone按鈕。
     */
public static  void onClickAudioShareImage(Tencent mTencent, Activity activity, IUiListener listener) {
        final Bundle params = new Bundle();
params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_AUDIO);
params.putString(QQShare.SHARE_TO_QQ_TITLE, "要分享的標題");
params.putString(QQShare.SHARE_TO_QQ_SUMMARY,  "要分享的摘要");
params.putString(QQShare.SHARE_TO_QQ_TARGET_URL,  "http://www.baidu.com");
params.putString(QQShare.SHARE_TO_QQ_IMAGE_URL, "http://gaopin-img.bj.bcebos.com/chinacity.jpg");
params.putString(QQShare.SHARE_TO_QQ_AUDIO_URL, "音樂連結");
params.putString(QQShare.SHARE_TO_QQ_APP_NAME,  "測試應用222222");
params.putInt(QQShare.SHARE_TO_QQ_EXT_INT,QQShare.SHARE_TO_QQ_FLAG_QZONE_AUTO_OPEN);
mTencent.shareToQQ(activity, params, listener);
}
    /**
     * (4) 分享應用
     * QQShare.SHARE_TO_QQ_KEY_TYPE    必填 Int    分享的型別。分享音樂填Tencent.SHARE_TO_QQ_TYPE_PP。
     * QQShare.PARAM_TITLE 必選 String 分享的標題, 最長30個字元。
     * QQShare.PARAM_SUMMARY   可選 String 分享的訊息摘要,最長40個字元。
     * QQShare.SHARE_TO_QQ_IMAGE_URL   可選 String 分享圖片的URL或者本地路徑。
     * QQShare.SHARE_TO_QQ_APP_NAME    可選 String 手Q客戶端頂部,替換“返回”按鈕文字,如果為空,用返回代替。
     * QQShare.SHARE_TO_QQ_EXT_INT 可選 Int    分享額外選項,兩種型別可選(預設是不隱藏分享到QZone按鈕且不自動開啟分享到QZone的對話方塊):
     * QQShare.SHARE_TO_QQ_FLAG_QZONE_AUTO_OPEN,分享時自動開啟分享到QZone的對話方塊。
     * QQShare.SHARE_TO_QQ_FLAG_QZONE_ITEM_HIDE,分享時隱藏分享到QZone按鈕。
     */
public static  void onClickAppShare(Tencent mTencent, Activity activity, IUiListener listener) {
        final Bundle params = new Bundle();
params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_APP);
params.putString(QQShare.SHARE_TO_QQ_TITLE, "要分享的標題");
params.putString(QQShare.SHARE_TO_QQ_SUMMARY,  "要分享的摘要");
params.putString(QQShare.SHARE_TO_QQ_IMAGE_URL, "http://gaopin-img.bj.bcebos.com/chinacity.jpg");
params.putString(QQShare.SHARE_TO_QQ_APP_NAME,  "測試應用");
mTencent.shareToQQ(activity, params, listener);
}

    /**
     *  1) 分享圖文訊息
     * QQShare.SHARE_TO_QQ_KEY_TYPE    必填 Int    分享的型別。圖文分享(普通分享)填Tencent.SHARE_TO_QQ_TYPE_DEFAULT
     * QQShare.PARAM_TARGET_URL    必填 String 這條分享訊息被好友點選後的跳轉URL。
     * QQShare.PARAM_TITLE 必填 String 分享的標題, 最長30個字元。
     * QQShare.PARAM_SUMMARY   可選 String 分享的訊息摘要,最長40個字。
     * QQShare.SHARE_TO_QQ_IMAGE_URL   可選 String 分享圖片的URL或者本地路徑
     * QQShare.SHARE_TO_QQ_APP_NAME    可選 String 手Q客戶端頂部,替換“返回”按鈕文字,如果為空,用返回代替
     * QQShare.SHARE_TO_QQ_EXT_INT 可選 Int    分享額外選項,兩種型別可選(預設是不隱藏分享到QZone按鈕且不自動開啟分享到QZone的對話方塊):
     * QQShare.SHARE_TO_QQ_FLAG_QZONE_AUTO_OPEN,分享時自動開啟分享到QZone的對話方塊。
     * QQShare.SHARE_TO_QQ_FLAG_QZONE_ITEM_HIDE,分享時隱藏分享到QZone按鈕
     */
public static void shareToQQ(Tencent mTencent, Activity activity, IUiListener listener) {
        Bundle params = new Bundle();
params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE,QQShare.SHARE_TO_QQ_TYPE_DEFAULT);
params.putString(QQShare.SHARE_TO_QQ_TITLE, "標題");// 標題
params.putString(QQShare.SHARE_TO_QQ_SUMMARY, "要分享的摘要");// 摘要
params.putString(QQShare.SHARE_TO_QQ_TARGET_URL,"http://www.baidu.com");// 內容地址
params.putString(QQShare.SHARE_TO_QQ_IMAGE_URL,"http://gaopin-img.bj.bcebos.com/chinacity.jpg");// 網路圖片地址  params.putString(QQShare.SHARE_TO_QQ_APP_NAME, "應用名稱");// 應用名稱
params.putString(QQShare.SHARE_TO_QQ_EXT_INT, "其它附加功能");
// 分享操作要在主執行緒中完成
mTencent.shareToQQ(activity, params, listener);
}
    /**
     * 1.14 分享到QQ空間
     * QzoneShare.SHARE_TO_QZONE_KEY_TYPE  選填 Int    SHARE_TO_QZONE_TYPE_IMAGE_TEXT(圖文)
     * QzoneShare.SHARE_TO_QQ_TITLE    必填    分享的標題,最多200個字元。
     * QzoneShare.SHARE_TO_QQ_SUMMARY  選填 String 分享的摘要,最多600字元。
     * QzoneShare.SHARE_TO_QQ_TARGET_URL   必填 String 需要跳轉的連結,URL字串。
     * QzoneShare.SHARE_TO_QQ_IMAGE_URL    選填 String 分享的圖片, 以ArrayList<String>的型別傳入,以便支援多張圖片(注:圖片最多支援9張圖片,多餘的圖片會被丟棄)
     */
public static void shareToQZone(Tencent mTencent, Activity activity, IUiListener listener) {
        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, "標題");// 標題
params.putString(QzoneShare.SHARE_TO_QQ_SUMMARY, "要分享的摘要");// 摘要
params.putString(QzoneShare.SHARE_TO_QQ_TARGET_URL,"http://www.baidu.com");// 內容地址
ArrayList<String> imgUrlList = new ArrayList<>();
imgUrlList.add("http://gaopin-img.bj.bcebos.com/chinacity.jpg");
params.putStringArrayList(QzoneShare.SHARE_TO_QQ_IMAGE_URL,imgUrlList);// 圖片地址
        // 分享操作要在主執行緒中完成
mTencent.shareToQzone(activity, params,listener);
}
}
最後還有個坑,就是分享的url地址中一定要加入http://  不加這個的話,分享的時候會提示tagURL錯誤。

OK了,大家如果發現那裡有問題可以提出來