首先给大家推荐一下一个第三方做分享的,现在这个第三方确实很不错,有时候我都想放弃官方的用他的来做。因为当时做官方的很恼火。
Share SDK,它是为iOS、Android、WP8的APP提供社会化功能的一个组件,目前支持如QQ、微信、新浪微博、腾讯微博、开心网、人人网、豆瓣、网易微博、搜狐微博、facebook、twitter、google+等国内外主流社交平台。
好的现在废话不多说了开始做我们的官方DEMO了。
当然,如果你要做分享首先需要的是去各大开放平台注册帐号然后申请。
QQ开发平台:http://open.qq.com/;
微信开发平台:https://open.weixin.qq.com/
新浪微博开发平台:http://open.weibo.com/
下载最新的SDK。或者直接下载他们的DEMO可以先看一下。
然后就是在各大平台创建自己的应用。
这里值得注意的是:当你用eclipse的MD5值的时候,记得把MD5值的冒号全部去掉,然后把所有大写字符变成小写字母来做签名。
首先我先说微信的分享,微信现在因为微信版本高了之后他支持的分享内容比较多,我这里就主要介绍2种就是文字和图片。
我们首先在微信开放平台申请自己的应用拿到APPID,然后下载他最新的SDK,放到自己项目的libs文件夹里面。
微信的SDK全名是:libammsdk.jar。mta-sdk-1.6.2.jar
微信准备工作已经做好了,我们现在开始写代码。
布局文件:名字自己随便取,然后在里面添加2个butto控件,并且添加ID。
<LinearLayout xmlns:android="<a target=_blank href="http://schemas.android.com/apk/res/android">http://schemas.android.com/apk/res/android</a>"
xmlns:tools="<a target=_blank href="http://schemas.android.com/tools">http://schemas.android.com/tools</a>"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical"
> <Button
android:id="@+id/wxh"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="微信好友"
/>
<Button
android:id="@+id/wxp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="微信朋友圈"
/></LinearLayout>
然后是代码的部分:
package com.zeo.manman;
import com.tencent.mm.sdk.modelmsg.SendMessageToWX;
import com.tencent.mm.sdk.modelmsg.WXMediaMessage;
import com.tencent.mm.sdk.modelmsg.WXWebpageObject;
import com.tencent.mm.sdk.openapi.IWXAPI;
import com.tencent.mm.sdk.openapi.WXAPIFactory;
import android.os.Bundle;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity implements OnClickListener{
private Button wxh;
private Button wxp;
//IWXAPI 是第三方(也就是你的)app和微信通信的openapi接口
private IWXAPI wxApi;
private static final String WXAPP_ID="wx30aeae8473fe6b69";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();//控件的初始化
wXfenxiang();//向微信注册
}
/**
* 初始化控件
*/
private void init() {
wxh = (Button)findViewById(R.id.wxh);
wxp = (Button)findViewById(R.id.wxp);
wxh.setOnClickListener(this);
wxp.setOnClickListener(this);
}
/**
* 注册到微信
*/
private void wXfenxiang(){
//这里是获取IWXAPI实列
wxApi = WXAPIFactory.createWXAPI(this, WXAPP_ID);
//这里就是将应用的APPID注册到微信
wxApi.registerApp(WXAPP_ID);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.wxh:
weiXinFx(0);//这里要实现的是微信好友的分享
break;
case R.id.wxp:
weiXinFx(1);//这里要实现的是微信朋友圈的分享
break;
}
}
/**
* 微信分享
* @param flag flag=0 分享到微信好友 ; flag=1 分享到微信朋友圈
*/
private void weiXinFx(int flag){
WXWebpageObject webpage = new WXWebpageObject();
webpage.webpageUrl = "www.baidu.com";
WXMediaMessage msg = new WXMediaMessage(webpage);
msg.title = "这里填写标题";
msg.description = "这里填写内容";
//这里替换一张自己工程里的图片资源
Bitmap thumb = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
msg.setThumbImage(thumb);
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = String.valueOf(System.currentTimeMillis());
req.message = msg;
/**需要注意的是,SendMessageToWX.Req的scene成员,如果scene填WXSceneSession,那么消息会发送至微信的会话内.如果scene填WXSceneTimeline(微信4.2以上支持,如果需要检查微信版本支持API的情况, 可调用IWXAPI的getWXApupportAPI方法,0x21020001及以上支持发送朋友圈),那么消息会发送至朋友圈。scene默认值为WXSceneSession。*/
req.scene = flag==0?SendMessageToWX.Req.WXSceneSession:SendMessageToWX.Req.WXSceneTimeline;
wxApi.sendReq(req);
}
}
这里要说明的是,我们看官方文档可以看到微信分享有2种方式 sendReq 和 sendResp。他们的不同就是:
sendReq是第三方app主动发送消息给微信,发送完成之后会切回到第三方app界面。
sendResp是微信向第三方app请求数据,第三方app回应数据之后会切回到微信界面。
最后需要做的是:然后建立官方声明的回调类
在你的包名相应目录下新建一个wxapi目录,并在该wxapi目录下新增一个WXEntryActivity类,该类继承自Activity。
然后添加权限和配置该类
<uses-permission android:name="android.permission.INTERNET"/>
<!-- 微信回调需要的配置 -->
<activity
android:name=".wxapi.WXEntryActivity"
android:exported="true"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
微信到这里就结束了。当然如果你觉得发送的图片不是你想要的你可以用网上的图片或者是相机拍摄的又或者是你本地的相册。总之这些的话,你自己要加方法来实现。
接下来我们做QQ的分享 。也是分为2个 一个是QQ好友 一个是QQ空间。
我们在上面这个项目里面添加。首先下载资源包
分别是:open_sdk_r5043.jar
首先还是在布局文件里面添加2个BUTTON(注意这里不是新建,仅仅是添加2个新的button);
然后写代码:
在原有的基础上添加代码,并且在配置文件添加 <!-- QQ分享 -->
<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" />
<!-- 这里的tencent1104739679 不要忘记把数字换成自己申请的APPID -->
<data android:scheme="tencent1104739679" />
</intent-filter>
</activity>
<activity
android:name="com.tencent.connect.common.AssistActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
需要添加的代码有:
在onCreate里面 添加qQfenxiang();方法名
然后写出此方法:
/**
* QQTencet的实例
*/
private void qQfenxiang() {
// Tencent类是SDK的主要实现类,开发者可通过Tencent类访问腾讯开放的OpenAPI。
// 其中APP_ID是分配给第三方应用的appid,类型为String。
mTencent = Tencent.createInstance("1104739679", this.getApplicationContext());
// 1.4版本:此处需新增参数,传入应用程序的全局context,可通过activity的getApplicationContext方法获取
}
然后在onClick(View v)里面的switch里面增加2个判断:
case R.id.qqh:
qqhy();//这里要实现的是微信朋友圈的分享
break;
case R.id.qqp:
qqkj();//这里要实现的是微信朋友圈的分享
break;
然后写出相应的2个方法:
/**
* QQ空间
*/
private void qqkj() {
//Tencent mTencent = Tencent.createInstance("1103995560", getActivity().getApplicationContext());
// 1.4版本:此处需新增参数,传入应用程序的全局context,可通过activity的getApplicationContext方法获取
// 初始化视图
Bundle params = new Bundle();
ArrayList<String> list = new ArrayList<String>();
list.add("http://img.funshion.com/pictures/427/932/427932.jpg");
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");//必填
params.putStringArrayList(QzoneShare.SHARE_TO_QQ_IMAGE_URL, list);
mTencent.shareToQzone(this, params, new BaseUiListener());
}
/**
* QQ好友
*/
private void qqhy() {
// Tencent类是SDK的主要实现类,开发者可通过Tencent类访问腾讯开放的OpenAPI。
// 其中APP_ID是分配给第三方应用的appid,类型为String。
//Tencent mTencent = Tencent.createInstance("1104739679", this.getApplicationContext());
// 1.4版本:此处需新增参数,传入应用程序的全局context,可通过activity的getApplicationContext方法获取
// 初始化视图
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://img.funshion.com/pictures/427/932/427932.jpg");
mTencent.shareToQQ(this, params, new BaseUiListener());
}
然后写一个QQ的回调类:
/**
* 实现此类是作用于QQ 的回调
* @author Zeo
*
*/
public class BaseUiListener implements IUiListener{
@Override
public void onCancel() {
// TODO Auto-generated method stub
}
@Override
public void onComplete(Object arg0) {
// TODO Auto-generated method stub
}
@Override
public void onError(UiError arg0) {
// TODO Auto-generated method stub
}
}
最后重写一个:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
mTencent.onActivityResult(requestCode, resultCode, data);
}
就此QQ的分享也做好了,记住你在写自己的应用时候,别忘记换掉APP_ID
最后一个分享就是新浪微博的分享。这一个是最闹心的分享。
首先是在布局文件增加button控件 并且在代码中设置监听。
然后我们要下载对应的SDK weiboSDKCore_3.1.2.jar
让我们的MainActivity implements IWeiboHandler.Response
你的微博在那个类里面写 你就用相应的类实现此接口
然后是注意事项配置文件的:
这里修改的是你的第一个启动类,也就是MainActivity的 intent-filter 里面改成如下
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.zeo.manman.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY" />
</intent-filter>
</activity>
<!-- 必须注册在微博授权,分享微博时候用到 -->
<activity android:name="com.sina.weibo.sdk.component.WeiboSdkBrowser"
android:configChanges="keyboardHidden|orientation"
android:windowSoftInputMode="adjustResize"
android:exported="false" >
</activity>
代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
init();
qQfenxiang();
wXfenxiang();
wBfenxiang(savedInstanceState);//微博的分享
}
/**
* 这里是新浪微博的分享
* @param savedInstanceState
*/
private void wBfenxiang(Bundle savedInstanceState){
// 创建微博分享接口实例
mWeiboShareAPI = WeiboShareSDK.createWeiboAPI(this, "412779672");
// 获取微博客户端相关信息,如是否安装、支持 SDK 的版本
boolean isInstalledWeibo = mWeiboShareAPI.isWeiboAppInstalled();
int supportApiLevel = mWeiboShareAPI.getWeiboAppSupportAPI();
// 注册第三方应用到微博客户端中,注册成功后该应用将显示在微博的应用列表中。
// 但该附件栏集成分享权限需要合作申请,详情请查看 Demo 提示
// NOTE:请务必提前注册,即界面初始化的时候或是应用程序初始化时,进行注册
mWeiboShareAPI.registerApp();
// 当 Activity 被重新初始化时(该 Activity 处于后台时,可能会由于内存不足被杀掉了),
// 需要调用 {@link IWeiboShareAPI#handleWeiboResponse} 来接收微博客户端返回的数据。
// 执行成功,返回 true,并调用 {@link IWeiboHandler.Response#onResponse};
// 失败返回 false,不调用上述回调
if (savedInstanceState != null) {
mWeiboShareAPI.handleWeiboResponse(getIntent(), this);
}
}
如果以后是你们自己的项目 记得把你们自己申请的APPID 拿来替换上面的 “412779672”
和需要添加的方法:
/**
* 微博的分享
* 第三方应用发送请求消息到微博,唤起微博分享界面。
* @see {@link #sendMultiMessage} 或者 {@link #sendSingleMessage}
*/
private void wbfx() {
if (mWeiboShareAPI.isWeiboAppSupportAPI()) {
int supportApi = mWeiboShareAPI.getWeiboAppSupportAPI();
if (supportApi >= 10351 /*ApiUtils.BUILD_INT_VER_2_2*/) {
sendMultiMessage();
} else {
sendSingleMessage();
}
} else {
Toast.makeText(this, R.string.weibosdk_demo_not_support_api_hint, Toast.LENGTH_SHORT).show();
}
}
/**
* 实现IWeiboHandler.Response接口要重写的方法
*
*/
@Override
public void onResponse(BaseResponse baseResp) {
switch (baseResp.errCode) {
case WBConstants.ErrorCode.ERR_OK:
Toast.makeText(this, R.string.weibosdk_demo_toast_share_success, Toast.LENGTH_LONG).show();
break;
case WBConstants.ErrorCode.ERR_CANCEL:
Toast.makeText(this, R.string.weibosdk_demo_toast_share_canceled, Toast.LENGTH_LONG).show();
break;
case WBConstants.ErrorCode.ERR_FAIL:
Toast.makeText(this,
getString(R.string.weibosdk_demo_toast_share_failed) + "Error Message: " + baseResp.errMsg,
Toast.LENGTH_LONG).show();
break;
}
}
/**
* @see {@link Activity#onNewIntent}
*/
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
// 从当前应用唤起微博并进行分享后,返回到当前应用时,需要在此处调用该函数
// 来接收微博客户端返回的数据;执行成功,返回 true,并调用
// {@link IWeiboHandler.Response#onResponse};失败返回 false,不调用上述回调
mWeiboShareAPI.handleWeiboResponse(intent, this);
}
/**
* 第三方应用发送请求消息到微博,唤起微博分享界面。
* 注意:当 {@link IWeiboShareAPI#getWeiboAppSupportAPI()} >= 10351 时,支持同时分享多条消息,
* 同时可以分享文本、图片以及其它媒体资源(网页、音乐、视频、声音中的一种)。
*
*/
private void sendMultiMessage() {
// 1. 初始化微博的分享消息
WeiboMultiMessage weiboMessage = new WeiboMultiMessage();
weiboMessage.textObject = getTextObj();//指向的是文字
weiboMessage.imageObject = getImageObj();//指向的是图片
// 2. 初始化从第三方到微博的消息请求
SendMultiMessageToWeiboRequest request = new SendMultiMessageToWeiboRequest();
// 用transaction唯一标识一个请求
request.transaction = String.valueOf(System.currentTimeMillis());
request.multiMessage = weiboMessage;
// 3. 发送请求消息到微博,唤起微博分享界面
mWeiboShareAPI.sendRequest(MainActivity.this, request);
}
/**
* 第三方应用发送请求消息到微博,唤起微博分享界面。
*/
private void sendSingleMessage() {
// 1. 初始化微博的分享消息
WeiboMessage weiboMessage = new WeiboMessage();
weiboMessage.mediaObject = getTextObj();
weiboMessage.mediaObject = getImageObj();
// 2. 初始化从第三方到微博的消息请求
SendMessageToWeiboRequest request = new SendMessageToWeiboRequest();
// 用transaction唯一标识一个请求
request.transaction = String.valueOf(System.currentTimeMillis());
request.message = weiboMessage;
// 3. 发送请求消息到微博,唤起微博分享界面
mWeiboShareAPI.sendRequest(MainActivity.this, request);
}
/**
* 获取分享的文本模板。
*
* @return 分享的文本模板
*/
private String getSharedText() {
String format = null;
String text = format;
String demoUrl = getString(R.string.weibosdk_demo_app_url);
format = getString(R.string.weibosdk_demo_share_webpage_template);
text = String.format(format, getString(R.string.weibosdk_demo_share_webpage_demo), demoUrl);
return text;
}
/**
* 创建文本消息对象。
*
* @return 文本消息对象。
*/
private TextObject getTextObj() {
TextObject textObject = new TextObject();
textObject.text = getSharedText();
return textObject;
}
/**
* 创建图片消息对象。
*
* @return 图片消息对象。
*/
private ImageObject getImageObj() {
ImageObject imageObject = new ImageObject();
//BitmapDrawable bitmapDrawable = (BitmapDrawable) mImageView.getDrawable();
// 设置缩略图。 注意:最终压缩过的缩略图大小不得超过 32kb。
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
imageObject.setImageObject(bitmap);
return imageObject;
}
最后一步: 就是在你的项目里面添加文件
到此处5个分享就已经完毕了。
因为在微博上的分享,我现在的思路是这样的如果你们有更好,更简单的思路可以大家一起探讨一下。第一次发帖子希望多多帮助。
这个DEMO新浪微博的APPID 还没申请好。申请好了就上传DEMO