QQ SDK 分享实现,及不回调问题

来源:互联网 发布:网络布线好学吗 编辑:程序博客网 时间:2024/06/05 13:35

写在前面的话
其实,用了这么多分享功能,我觉得QQ和微博的分享是最简单的了,特别是QQ,其实实现和设计都挺方便的,特别是对分享结果的监测。可以只实现一个接口便行
最难用的就是微信了。需要单独的Activity去接受,而且连这个Activity的在代码层面的路径(包结构)都是规定好的,而且手册里也不明确说,恶心死人不偿命。

谁说微信是产品设计的顶级作品?就冲这个SDK的手册难用程度,我给1分。

1. 在AndroidManifest.xml里声明QQ相关的Activity

<activity    android:name="com.tencent.tauth.AuthActivity"    android:launchMode="singleTask"    android:noHistory="true" >    <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="tencentXXXXXXXX" />    </intent-filter></activity><activity    android:name="com.tencent.connect.common.AssistActivity"    android:configChanges="orientation|keyboardHidden|screenSize"    android:theme="@android:style/Theme.Translucent.NoTitleBar" />

注意XXXXXXX的地方,要换成你的APP_ID

2. 添加SDK到你的工程里

具体就是拷贝*.jar到lib目录下,然后添加编译。
注意,这里有个坑,如果是全量SDK包,是包含有支付SDK的,有一些应用市场会限制个人开发者的产品里添加这种支付SDK,审核不过。
修改方式也简单,就是只添加基础包,分享登录什么的够用了。

3. 实现回调接口

private class QQShareListener implements IUiListener{    @Override    public void onCancel() {        Toast.makeText(InviteActivity.this, R.string.cancel_to_share, Toast.LENGTH_SHORT)                .show();    }    @Override    public void onError(UiError uiError) {        Toast.makeText(InviteActivity.this, InviteActivity.this.getText(R.string                        .failed_to_share) + uiError.errorMessage + "\n" +uiError.errorDetail,                Toast.LENGTH_SHORT)        .show();    }    @Override    public void onComplete(Object o) {        enableAction(InviteActivity.this.action);    }}

注意,要声明一个类的变量,后边会用到
QQShareListener sl = new QQShareListener();

4. 最恶心的问题 重载onActivityResult

官方手册中没有写这条,但是不写不成功

protected void onActivityResult(int requestCode, int resultCode, Intent data) {    super.onActivityResult(requestCode, resultCode, data);    // 官方文档没没没没没没没没没没没这句代码, 但是很很很很很很重要, 不然不会回调!    Tencent.onActivityResultData(requestCode, resultCode, data, shareListener);    if (requestCode == Constants.REQUEST_API) {        if (resultCode == Constants.REQUEST_QQ_SHARE ||                resultCode == Constants.REQUEST_QZONE_SHARE ||                resultCode == Constants.REQUEST_OLD_SHARE) {            Tencent.handleResultData(data, shareListener);        }    }}

5. 实现分享代码

//分享到QQpublic void shareToQQ(View v){    Tencent tencent = Tencent.createInstance(TuHaoConstants.QQ_APP_ID, this.getApplicationContext());    final Bundle params = new Bundle();    Util.ConfigParser configParser = new Util.ConfigParser(this);    params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_DEFAULT);    params.putString(QQShare.SHARE_TO_QQ_TITLE, configParser.getShareTitle());    params.putString(QQShare.SHARE_TO_QQ_SUMMARY, configParser.getShareDescription());    params.putString(QQShare.SHARE_TO_QQ_TARGET_URL, configParser.getShareUrl());    params.putString(QQShare.SHARE_TO_QQ_IMAGE_LOCAL_URL, dtb.saveForSharing(BitmapFactory            .decodeResource(this.getResources(), R.mipmap.ic_launcher)));    params.putString(QQShare.SHARE_TO_QQ_APP_NAME, this.getString(R.string.app_name));    tencent.shareToQQ(this, params, shareListener);}//分享到QZonepublic void shareToQZone(View v){    DrawTextOnBmp dtb = new DrawTextOnBmp(this);    Tencent tencent = Tencent.createInstance(TuHaoConstants.QQ_APP_ID, this.getApplicationContext());    Bundle params = new Bundle();    Util.ConfigParser configParser = new Util.ConfigParser(this);    params.putString(QQShare.SHARE_TO_QQ_IMAGE_LOCAL_URL, dtb.saveForSharing(BitmapFactory            .decodeResource(this.getResources(), R.mipmap.ic_launcher)));    params.putString(QQShare.SHARE_TO_QQ_APP_NAME, this.getString(R.string.app_name));    params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_DEFAULT);    params.putInt(QQShare.SHARE_TO_QQ_EXT_INT, QQShare.SHARE_TO_QQ_FLAG_QZONE_AUTO_OPEN);    params.putString(QQShare.SHARE_TO_QQ_TARGET_URL, configParser.getShareUrl());    params.putString(QQShare.SHARE_TO_QQ_SUMMARY, configParser.getShareDescription());    params.putString(QQShare.SHARE_TO_QQ_TITLE, configParser.getShareTitle());    Toast.makeText(this, R.string.launching_qzone, Toast.LENGTH_SHORT).show();    tencent.shareToQQ(this, params, shareListener);}

到此,大功造成。
很多人和我当初一样,明明实现了回调接口,但就是不回调,不知道原因在哪里。
后来发现有几个值得注意的问题
1. AndroidManifest.xml里的那个APP_ID前,一定要有tencent
2. 重载onActivityResult

1 0