package ezy.sdk3rd.social.platforms.qq; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.support.annotation.NonNull; import android.util.Log; import com.tencent.connect.common.Constants; import com.tencent.connect.share.QQShare; import com.tencent.connect.share.QzonePublish; import com.tencent.tauth.IUiListener; import com.tencent.tauth.Tencent; import com.tencent.tauth.UiError; import org.json.JSONObject; import java.util.ArrayList; import ezy.sdk3rd.social.sdk.OnCallback; import ezy.sdk3rd.social.sdk.Platform; import ezy.sdk3rd.social.sdk.ResultCode; import ezy.sdk3rd.social.share.IShareable; import ezy.sdk3rd.social.share.ShareData; import ezy.sdk3rd.social.share.ShareTo; import ezy.sdk3rd.social.share.media.IMediaObject; import ezy.sdk3rd.social.share.media.MoImage; import ezy.sdk3rd.social.share.media.MoMusic; import ezy.sdk3rd.social.share.media.MoVideo; import ezy.sdk3rd.social.share.media.MoWeb; /** * Created by ezy on 17/3/18. */ public class TXShare implements IShareable { public static final String TAG = "ezy.sdk3rd.qq.share"; private static final String KEY_REQ_TYPE = QQShare.SHARE_TO_QQ_KEY_TYPE; private static final String KEY_TARGET_URL = QQShare.SHARE_TO_QQ_TARGET_URL; private static final String KEY_IMAGE_URL = QQShare.SHARE_TO_QQ_IMAGE_URL; private static final String KEY_IMAGE_LOCAL_URL = QQShare.SHARE_TO_QQ_IMAGE_LOCAL_URL; private static final String KEY_AUDIO_URL = QQShare.SHARE_TO_QQ_AUDIO_URL; private static final String KEY_AUDIO_VIDEO_PATH = QzonePublish.PUBLISH_TO_QZONE_VIDEO_PATH; private static final int REQ_TYPE_DEFAULT = 1; private static final int REQ_TYPE_AUDIO = 2; private static final int REQ_TYPE_MOOD = 3; private static final int REQ_TYPE_VIDEO = 4; private static final int REQ_TYPE_IMAGE = 5; Activity mActivity; Platform mPlatform; Tencent mApi; IUiListener mListener; TXShare(Activity activity, Platform platform) { mActivity = activity; mPlatform = platform; mApi = Tencent.createInstance(platform.getAppId(), mActivity); } String toMessage(UiError error) { return "[" + error.errorCode + "]" + error.errorMessage; } @Override public void share(@NonNull final ShareData data, @NonNull final OnCallback<String> callback) { final boolean isShareToQQ = mPlatform.getName().equals(ShareTo.QQ); mListener = new IUiListener() { @Override public void onComplete(Object response) { Log.e(TAG, "response ==> " + response); if (response instanceof JSONObject && ((JSONObject) response).length() > 0) { callback.onSucceed(mActivity, ""); } else { callback.onFailed(mActivity, ResultCode.RESULT_FAILED, "分享失败: 返回为空"); } callback.onCompleted(mActivity); } @Override public void onError(UiError e) { Log.e(TAG, "错误信息: " + e.errorDetail); callback.onFailed(mActivity, ResultCode.RESULT_FAILED, toMessage(e)); } @Override public void onCancel() { callback.onFailed(mActivity, ResultCode.RESULT_CANCELLED, "用户取消了分享"); } }; Bundle bundle = new Bundle(); if (data.hasText()) { bundle.putString(QQShare.SHARE_TO_QQ_TITLE, data.text); } else if (data.hasTitle()) { bundle.putString(QQShare.SHARE_TO_QQ_TITLE, data.title); } if (data.hasDescription()) { bundle.putString(QQShare.SHARE_TO_QQ_SUMMARY, data.description); } if (data.hasUrl()) { bundle.putString(QQShare.SHARE_TO_QQ_TARGET_URL, data.url); } bundle.putString(QQShare.SHARE_TO_QQ_APP_NAME, mActivity.getPackageManager().getApplicationLabel(mActivity.getApplicationInfo()).toString()); putImageUrl(data, bundle, isShareToQQ); boolean unsupported = false; switch (data.type()) { case IMediaObject.TYPE_WEB: bundle.putInt(KEY_REQ_TYPE, REQ_TYPE_DEFAULT); bundle.putString(QQShare.SHARE_TO_QQ_TARGET_URL, ((MoWeb) data.media).url); shareTo(bundle, isShareToQQ, false, callback); break; case IMediaObject.TYPE_EMOJI: case IMediaObject.TYPE_IMAGE: if (isShareToQQ) { bundle.putInt(KEY_REQ_TYPE, REQ_TYPE_IMAGE); bundle.putString(KEY_IMAGE_LOCAL_URL, ((MoImage) data.media).toUri()); } else { bundle.putInt(KEY_REQ_TYPE, REQ_TYPE_MOOD); } shareTo(bundle, isShareToQQ, true, callback); break; case IMediaObject.TYPE_MUSIC: unsupported = !isShareToQQ; bundle.putInt(KEY_REQ_TYPE, REQ_TYPE_AUDIO); bundle.putString(KEY_AUDIO_URL, ((MoMusic) data.media).mediaUrl); shareTo(bundle, true, false, callback); break; case IMediaObject.TYPE_TEXT: bundle.putInt(KEY_REQ_TYPE, REQ_TYPE_MOOD); shareTo(bundle, isShareToQQ, true, callback); unsupported = isShareToQQ; break; case IMediaObject.TYPE_VIDEO: bundle.putInt(KEY_REQ_TYPE, REQ_TYPE_AUDIO); bundle.putString(KEY_AUDIO_VIDEO_PATH, ((MoVideo) data.media).mediaUrl); shareTo(bundle, false, true, callback); unsupported = isShareToQQ; break; default: unsupported = true; // unsupported break; } if (unsupported) { callback.onFailed(mActivity, ResultCode.RESULT_FAILED, "不支持的分享类型"); } } void putImageUrl(ShareData data, Bundle bundle, boolean isShareToQQ) { if (data.media instanceof MoImage) { if (isShareToQQ) { bundle.putString(KEY_IMAGE_URL, ((MoImage) data.media).toUri()); } else { bundle.putStringArrayList(KEY_IMAGE_URL, imageList(((MoImage) data.media).toUri())); } } else if (data.hasThumb()) { if (isShareToQQ) { bundle.putString(KEY_IMAGE_URL, data.thumb.toUri()); } else { bundle.putStringArrayList(KEY_IMAGE_URL, imageList(data.thumb.toUri())); } } } void shareTo(Bundle bundle, boolean isShareToQQ, boolean isPublishToQZone, OnCallback<String> callback) { if (isShareToQQ) { callback.onStarted(mActivity); mApi.shareToQQ(mActivity, bundle, mListener); } else if (isPublishToQZone) { callback.onStarted(mActivity); mApi.publishToQzone(mActivity, bundle, mListener); } else { callback.onStarted(mActivity); mApi.shareToQzone(mActivity, bundle, mListener); } Log.e(TAG, bundle.toString()); } ArrayList<String> imageList(String image) { ArrayList<String> images = new ArrayList(); images.add(image); return images; } @Override public void onResult(int requestCode, int resultCode, Intent data) { if (requestCode == Constants.REQUEST_QQ_SHARE || requestCode == Constants.REQUEST_QZONE_SHARE) { Tencent.onActivityResultData(requestCode, resultCode, data, mListener); } } }