Android 第三方分享集成

---集成的包括QQ、新浪、微信


1、申请第三方应用的开发者权限

微信:https://open.weixin.qq.com/

QQ:http://open.qq.com/

新浪:http://open.weibo.com/


2、生成自己项目的debug.keystore (百度查找生成keystore的方法)


3、下载签名工具,获取应用的签名(根据debug.keystore生成的MD5签名),再去申请应用

微信:https://open.weixin.qq.com/cgi-bin/frame?t=resource/res_main_tmpl&verify=1&lang=zh_CN

新浪:https://github.com/sinaweibosdk/weibo_android_sdk



3、(1)申请应用:(流程自行百度)

微信:https://open.weixin.qq.com/ 管理中心

QQ:http://open.qq.com/apps/dev

新浪:http://open.weibo.com/apps


* 项目包名 

* 项目签名  


在Eclipse中就能看到md5签名,也可以使用MD5签名生成器生成,项目build到手机上的时候,需要指定你自己的keystore,用来对应开发者账号所申请的应用的包名和签名。如下图: 




4、开发


AdnroidManifest.xml文件添加:

<!-- 新浪微博第三方授权 -->
        <activity
            android:name="com.sina.weibo.sdk.component.WeiboSdkBrowser"
            android:configChanges="keyboardHidden|orientation"
            android:exported="false"
            android:windowSoftInputMode="adjustResize" >
        </activity>


        <service
            android:name="com.sina.weibo.sdk.net.DownloadService"
            android:exported="false" >
        </service>
        <!-- qq第三方授权 -->
        <activity
            android:name="com.tencent.connect.common.AssistActivity"
            android:configChanges="orientation|keyboardHidden"
            android:screenOrientation="portrait"
            android:theme="@android:style/Theme.Translucent.NoTitleBar" />
        <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="tencent1103566344" />
                <!-- 100380359 100381104 222222 -->
            </intent-filter>
        </activity>
        <!-- 分享 -->
        <receiver
            android:name=".AppRegister"
            android:permission="com.tencent.mm.plugin.permission.SEND" >
            <intent-filter>
                <action android:name="com.tencent.mm.plugin.openapi.Intent.ACTION_REFRESH_WXAPP" />
            </intent-filter>
        </receiver>



代码实现:

package com.cdsmartlink.wine.utils;


import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;


import org.json.JSONException;
import org.json.JSONObject;


import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;


import com.cdsmartlink.utils.cache.SharedPreferencesUtils;
import com.cdsmartlink.wine.android.activity.R;
import com.cdsmartlink.wine.android.constants.Constants;
import com.sina.weibo.sdk.api.TextObject;
import com.sina.weibo.sdk.api.WebpageObject;
import com.sina.weibo.sdk.api.WeiboMessage;
import com.sina.weibo.sdk.api.WeiboMultiMessage;
import com.sina.weibo.sdk.api.share.IWeiboShareAPI;
import com.sina.weibo.sdk.api.share.SendMessageToWeiboRequest;
import com.sina.weibo.sdk.api.share.SendMultiMessageToWeiboRequest;
import com.sina.weibo.sdk.auth.AuthInfo;
import com.sina.weibo.sdk.auth.Oauth2AccessToken;
import com.sina.weibo.sdk.auth.WeiboAuthListener;
import com.sina.weibo.sdk.exception.WeiboException;
import com.sina.weibo.sdk.utils.Utility;
import com.tencent.connect.share.QQShare;
import com.tencent.connect.share.QzoneShare;
import com.tencent.mm.sdk.openapi.BaseReq;
import com.tencent.mm.sdk.openapi.BaseResp;
import com.tencent.mm.sdk.openapi.IWXAPI;
import com.tencent.mm.sdk.openapi.IWXAPIEventHandler;
import com.tencent.mm.sdk.openapi.SendMessageToWX;
import com.tencent.mm.sdk.openapi.WXMediaMessage;
import com.tencent.mm.sdk.openapi.WXWebpageObject;
import com.tencent.open.t.Weibo;
import com.tencent.tauth.IUiListener;
import com.tencent.tauth.Tencent;
import com.tencent.tauth.UiError;


public class ThridPartyShareUtils{
private static Activity LocalActivity;

/**
* 分享到朋友圈
* @param wxapi
* @param WXSupportAPINo
*/
public static void shareToWechatFriend(IWXAPI wxapi, int WXSupportAPINo){
WXWebpageObject wxWebpageObject = new WXWebpageObject();

wxWebpageObject.webpageUrl=Constants.getShareTargetUrl();

// 用WXTextObject对象初始化一个WXMediaMessage对象
WXMediaMessage msg = new WXMediaMessage();
msg.mediaObject = wxWebpageObject;
msg.title = Constants.SHARE_DEFAULT_TITLE;
msg.description = Constants.SHARE_DEFAULT_SUMMARY;

// 构造一个Req
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = buildTransaction("webpage"); // transaction字段用于唯一标识一个请求
req.message = msg;
// req.scene = SendMessageToWX.Req.WXSceneTimeline;
req.scene = SendMessageToWX.Req.WXSceneTimeline;
wxapi.sendReq(req);
}
/**
* 分享到微信
* @param wxapi
* @param WXSupportAPINo
*/
public static void shareToWechat(IWXAPI wxapi, int WXSupportAPINo){
WXWebpageObject wxWebpageObject = new WXWebpageObject();

wxWebpageObject.webpageUrl=Constants.getShareTargetUrl();

// 用WXTextObject对象初始化一个WXMediaMessage对象
WXMediaMessage msg = new WXMediaMessage();
msg.mediaObject = wxWebpageObject;
msg.title = Constants.SHARE_DEFAULT_TITLE;
msg.description = Constants.SHARE_DEFAULT_SUMMARY;

// 构造一个Req
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = buildTransaction("webpage"); // transaction字段用于唯一标识一个请求
req.message = msg;
// req.scene = SendMessageToWX.Req.WXSceneTimeline;
req.scene = SendMessageToWX.Req.WXSceneSession;
wxapi.sendReq(req);
}

/**
* 分享到QQ
* @param mTencent
* @param activity
* @param shareType
* @param mExtarFlag
*/
public static void shareToQQ(Tencent mTencent,final Activity activity,int shareType,int mExtarFlag){
// 初始化QQ分享用实例
Bundle bundle = new Bundle();
//这条分享消息被好友点击后的跳转URL。
bundle.putString(QQShare.SHARE_TO_QQ_TARGET_URL, Constants.getShareTargetUrl());
//分享的标题。注:PARAM_TITLE、PARAM_IMAGE_URL、PARAM_ SUMMARY不能全为空,最少必须有一个是有值的。
bundle.putString(QQShare.SHARE_TO_QQ_TITLE, Constants.SHARE_DEFAULT_TITLE);
//分享的图片URL
bundle.putString(QQShare.SHARE_TO_QQ_IMAGE_URL, Constants.getShareImageUrl());
//分享的消息摘要,最长50个字
bundle.putString(QQShare.SHARE_TO_QQ_SUMMARY, Constants.SHARE_DEFAULT_SUMMARY);
//手Q客户端顶部,替换“返回”按钮文字,如果为空,用返回代替
bundle.putString(QQShare.SHARE_TO_QQ_APP_NAME, Constants.PARAM_APP_NAME);
// //标识该消息的来源应用,值为应用名称+AppId。
// bundle.putString(QQShare.s, Constants.PARAM_APP_NAME + Constants.TENCENT_APP_ID);

bundle.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, shareType);
          
bundle.putInt(QQShare.SHARE_TO_QQ_EXT_INT, mExtarFlag);

mTencent.shareToQQ(activity, bundle , new IUiListener() {
@Override
public void onError(UiError e) {
Toast.makeText(activity, "分享失败:message /n "+ e.errorDetail,Toast.LENGTH_SHORT).show();
}
@Override
public void onComplete(Object obj) {
JSONObject json = (JSONObject) obj;
Log.i("info", json.toString());
}
@Override
public void onCancel() {
}
});
}

/**
* 分享到QQ空间
* @param activity 打开该界面的parent activity
* @param qzone_shareType 分享类型
* @param shareType 
* @param mTencent 授权信息
*/
public static void shareToQzone(final Activity activity,int qzone_shareType,int shareType,Tencent mTencent) {
QzoneShare mqQzoneShare = new QzoneShare(activity, mTencent.getQQToken());
final Bundle params = new Bundle();
params.putInt(QzoneShare.SHARE_TO_QZONE_KEY_TYPE, qzone_shareType);
params.putString(QzoneShare.SHARE_TO_QQ_TITLE, Constants.SHARE_DEFAULT_TITLE);
params.putString(QzoneShare.SHARE_TO_QQ_SUMMARY, Constants.SHARE_DEFAULT_SUMMARY);
if (shareType != QzoneShare.SHARE_TO_QZONE_TYPE_APP) {
// app分享不支持传目标链接
params.putString(QzoneShare.SHARE_TO_QQ_TARGET_URL,Constants.getShareTargetUrl());
}
// 支持传多个imageUrl
ArrayList<String> imageUrls = new ArrayList<String>();
imageUrls.add(Constants.getShareImageUrl());
// 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 = "http://img3.cache.netease.com/photo/0005/2013-03-07/8PBKS8G400BV0005.jpg";
// params.putString(QzoneShare.SHARE_TO_QQ_IMAGE_URL, imageUrl);
params.putStringArrayList(QzoneShare.SHARE_TO_QQ_IMAGE_URL,imageUrls);
mqQzoneShare.shareToQzone(activity, params, new IUiListener() {
@Override
public void onError(UiError e) {
Log.i("info", e.errorDetail);
Toast.makeText(activity, "分享失败:message /n "+ e.errorDetail,Toast.LENGTH_SHORT).show();
}


@Override
public void onComplete(Object obj) {
Log.i("info",obj.toString());
Toast.makeText(activity, "分享成功",Toast.LENGTH_SHORT).show();
}


@Override
public void onCancel() {
Log.i("info","onCancel:");
Toast.makeText(activity, "取消分享",Toast.LENGTH_SHORT).show();
}
});
}
/**
* 分享到腾讯微博
* @param mTencent 授权信息
* @param activity 
* @param mWeibo
*/
public static void shareToQQWeibo(Tencent mTencent,final Activity activity,Weibo mWeibo){
LocalActivity = activity;
if(!mTencent.isSessionValid()){
mTencent.login(activity, "all", new QQTrirdPartyLoginLstener());
}


String content = Constants.SHARE_DEFAULT_TITLE +" /n || "+ Constants.SHARE_DEFAULT_CONTENT +" /n || "+ Constants.getShareTargetUrl();
mWeibo.sendText(content, new IUiListener() {
@Override
public void onError(UiError e) {
Log.i("info",e.errorDetail);
Toast.makeText(activity, "分享失败:message /n "+ e.errorDetail,Toast.LENGTH_SHORT).show();


}
@Override
public void onComplete(Object obj) {
Log.i("info",obj.toString());
Toast.makeText(activity, "分享成功",Toast.LENGTH_SHORT).show();
}
@Override
public void onCancel() {
Log.i("info","onCancel");
Toast.makeText(activity, "取消分享",Toast.LENGTH_SHORT).show();
}
});
}

public static void shareToSina(final Activity activity, int mShareType,
int SHARE_CLIENT,final IWeiboShareAPI mWeiboShareAPI) {


AuthInfo authInfo = new AuthInfo(activity,
Constants.SINA_APP_KEY, Constants.REDIRECT_URL,
Constants.SCOPE);
String token = SharedPreferencesUtils
.getDatasFromSharedPreferences(activity,
SharedPreferencesUtils.USER_LOGIN_FILE_NAME,
Context.MODE_PRIVATE,
SharedPreferencesUtils.SINA_ACCESS_TOKEN);


mWeiboShareAPI.sendRequest(activity, initSendMultiMessage(activity),authInfo, token, new WeiboAuthListener() {
@Override
public void onWeiboException(WeiboException arg0) {
}
@Override
public void onComplete(Bundle bundle) {
Oauth2AccessToken newToken = Oauth2AccessToken
.parseAccessToken(bundle);
// Map<String, String> map = new HashMap<String, String>();
// map.put(SharedPreferencesUtils.SINA_ACCESS_TOKEN,
// newToken.getToken());
// SharedPreferencesUtils
// .saveDatasInSharedPreferences(
// activity,
// SharedPreferencesUtils.USER_LOGIN_FILE_NAME,
// Context.MODE_PRIVATE, map);
}
@Override
public void onCancel() {
}
});
}

public static SendMultiMessageToWeiboRequest initSendMultiMessage(final Activity activity){
 // 1. 初始化微博的分享消息
        WeiboMultiMessage weiboMessage = new WeiboMultiMessage();
        TextObject textObject = new TextObject();
        textObject.text = Constants.SHARE_DEFAULT_TITLE;
   // 1. 初始化微博的分享消息
        WebpageObject mediaObj = new WebpageObject();
        mediaObj.actionUrl = Constants.getShareTargetUrl();
        mediaObj.identify = Utility.generateGUID();
        mediaObj.title = Constants.SHARE_DEFAULT_TITLE;
        mediaObj.description = Constants.SHARE_DEFAULT_SUMMARY;
        
     // 设置 Bitmap 类型的图片到对象里
        BitmapDrawable mBitmapDrawable = (BitmapDrawable) activity.getResources()
        .getDrawable(R.drawable.app_icon);  
        mediaObj.setThumbImage(mBitmapDrawable.getBitmap());
        mediaObj.defaultText = Constants.SHARE_DEFAULT_CONTENT;
     
        weiboMessage.mediaObject = mediaObj;
        weiboMessage.textObject = textObject;
        
  // 2. 初始化从第三方到微博的消息请求
        SendMultiMessageToWeiboRequest request = new SendMultiMessageToWeiboRequest();
        // 用transaction唯一标识一个请求
        request.transaction = String.valueOf(System.currentTimeMillis());
        request.multiMessage = weiboMessage;
        
        return request;
}

public static SendMessageToWeiboRequest initSendSingleMessage(){
 // 1. 初始化微博的分享消息
 WeiboMessage weiboMessage = new WeiboMessage();
      
      WebpageObject mediaObject = new WebpageObject();
      mediaObject.identify = Utility.generateGUID();
      mediaObject.title = Constants.SHARE_DEFAULT_TITLE;
      mediaObject.description = Constants.SHARE_DEFAULT_SUMMARY;
      
      // 设置 Bitmap 类型的图片到视频对象里
//      mediaObject.setThumbImage(mShareWebPageView.getThumbBitmap());
      mediaObject.actionUrl = Constants.getShareTargetUrl();
      mediaObject.defaultText = Constants.SHARE_DEFAULT_CONTENT;       
      
      weiboMessage.mediaObject = mediaObject;
      
  // 2. 初始化从第三方到微博的消息请求
      SendMessageToWeiboRequest request = new SendMessageToWeiboRequest();
      // 用transaction唯一标识一个请求
      request.transaction = String.valueOf(System.currentTimeMillis());
      request.message = weiboMessage;
      
      return request;
}

/**
* qq一键登录
* @author Administrator
*/
public static class QQTrirdPartyLoginLstener implements IUiListener {
@Override
public void onCancel() {


}
@Override
public void onComplete(Object obj) {
JSONObject json = (JSONObject) obj;
try {
String openid = json.getString(Constants.TENCENT_OPENID);
String access_token =  json.getString(Constants.TENCENT_ACCESS_TOKEN);
String expires_in = json.getString(Constants.TENCENT_EXPIRES_IN);
Long expiresing_in= System.currentTimeMillis() + Long.parseLong(expires_in) * 1000;
//将其余信息放入map中
Map<String, String> map = new HashMap<String, String>();
map.put(SharedPreferencesUtils.QQ_OPENID, openid);
map.put(SharedPreferencesUtils.QQ_ACCESS_TOKEN, access_token);
map.put(SharedPreferencesUtils.QQ_TOKEN_EXPIRES_TIME,String.valueOf(expiresing_in));
//保存到登录的用户信息文件中
SharedPreferencesUtils.saveDatasInSharedPreferences(LocalActivity, 
SharedPreferencesUtils.USER_LOGIN_FILE_NAME,
Context.MODE_PRIVATE, map);

} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onError(UiError arg0) {
}
}

private static String buildTransaction(final String type) {
return (type == null) ? String.valueOf(System.currentTimeMillis())
: type + System.currentTimeMillis();
}

}
}





  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值