android开发之&集成qq分享的那些坑

2,119 阅读5分钟

前段时间公司要集成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了,大家如果发现那里有问题可以提出来