提要: QQ ,微信分享 ,新浪分享(需要授权后分享)
最后导包效果(原生的包比较小,方法数少,更干净):
其中:open_sdk_r5756_lite.jar 是QQ 的,weiboSDKCore_3.14.jar是微博的(包括其余的*.os 文件) ,libammsdk.jar 是微信的
说一下,android studio 导入 *.os文件需要配置 app --》build.gradle 的
android {
compileSdkVersion 24
buildToolsVersion '24.0.1'
defaultConfig {
applicationId "com.lskj.rrhr.shortkeytest"
minSdkVersion 15
targetSdkVersion 24
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
}
红色部分至指定 jni 加载目录,当然还有更高级的做法,自己去找吧。
添加权限部分:
QQ分享:
QQ开发者平台登录网址:(免登录分享)
http://open.qq.com/login
QQ文档:
详细文档参考:
1.13 分享消息到QQ(无需QQ登录)
分享消息到QQ的接口,可将新闻、图片、文字、应用等分享给QQ好友、群和讨论组。Tencent类的shareToQQ函数可直接调用,不用用户授权(使用手机QQ当前的登录态)。调用将打开分享的界面,用户选择好友、群或讨论组之后,点击确定即可完成分享,并进入与该好友进行对话的窗口。
本接口支持3种模式,每种模式的参数设置不同,下面分别进行介绍:
(1) 分享图文消息
调用分享接口的示例代码如下:
private void onClickShare() { final 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.qq.com/news/1.html"); params.putString(QQShare.SHARE_TO_QQ_IMAGE_URL,"http://imgcache.qq.com/qzone/space_item/pre/0/66768.gif"); params.putString(QQShare.SHARE_TO_QQ_APP_NAME, "测试应用222222"); params.putInt(QQShare.SHARE_TO_QQ_EXT_INT, "其他附加功能"); mTencent.shareToQQ(MainActivity.this, params, new BaseUiListener()); }
调用分享接口的params参数说明如下:
参数 | 是否必传 | 类型 | 参数说明 |
---|---|---|---|
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的对话框。 |
(2) 分享纯图片
调用分享接口的示例代码如下:
private void onClickShare() { 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(MainActivity.this, params, new BaseUiListener()); }
参数 | 是否必传 | 类型 | 参数说明 |
---|---|---|---|
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的对话框。 |
(3) 分享音乐
音乐分享后,发送方和接收方在聊天窗口中点击消息气泡即可开始播放音乐。
调用分享接口的示例代码如下:
private void onClickAudioShare() { 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.qq.com/news/1.html"); params.putString(QQShare.SHARE_TO_QQ_IMAGE_URL, "http://imgcache.qq.com/qzone/space_item/pre/0/66768.gif"); 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(MainActivity.this, params, new BaseUiListener()); }
调用分享接口的params参数说明如下:
参数 | 是否必传 | 类型 | 参数说明 |
---|---|---|---|
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的对话框。 |
(4) 分享应用
应用分享后,发送方和接收方在聊天窗口中点击消息气泡即可进入应用的详情页。
调用分享接口的示例代码如下:
private void onClickAppShare() { 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://imgcache.qq.com/qzone/space_item/pre/0/66768.gif"); params.putString(QQShare.SHARE_TO_QQ_APP_NAME, "测试应用222222"); mTencent.shareToQQ(MainActivity.this, params, new BaseUiListener()); }
调用分享接口的params参数说明如下:
参数 | 是否必传 | 类型 | 参数说明 |
---|---|---|---|
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的对话框。 |
1.14 分享到QQ空间(无需QQ登录)
完善了分享到QZone功能,分享类型参数Tencent.SHARE_TO_QQ_KEY_TYPE,目前只支持图文分享。Tencent. shareToQzone()函数可直接调用,不用用户授权(使用手机QQ当前的登录态)。调用后将打开手机QQ内QQ空间的界面,或者用浏览器打开QQ空间页面进行分享操作。
示例代码如下:
private void shareToQzone () { //分享类型 params.putString(QzoneShare.SHARE_TO_QQ_KEY_TYPE,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, "跳转URL");//必填 params.putStringArrayList(QzoneShare.SHARE_TO_QQ_IMAGE_URL, "图片链接ArrayList"); mTencent.shareToQzone(activity, params, new BaseUiListener()); }
params参数说明如下:
参数 | 是否必传 | 类型 | 参数说明 |
---|---|---|---|
QzoneShare.SHARE_TO_QQ_KEY_TYPE | 选填 | Int | SHARE_TO_QZONE_TYPE_IMAGE_TEXT(图文) |
QzoneShare.SHARE_TO_QQ_TITLE | 必填 | Int | 分享的标题,最多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张图片,多余的图片会被丢弃)。 |
注意:QZone接口暂不支持发送多张图片的能力,若传入多张图片,则会自动选入第一张图片作为预览图。多图的能力将会在以后支持。:
AndroidManifest.xml:中添加一下代码
<!--QQ QQZone-->
<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="tencent1105559447" /> 红色部分填入你的 QQ appid
</intent-filter>
</activity>
<activity
android:name="com.tencent.connect.common.AssistActivity"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
AndroidManifest.xml
代码部分:
//腾讯分享调用的
private Tencent mTencent = null;
//注册应用
mTencent = Tencent.createInstance(ShareConfig.QQ_APPID, mContext);
//自行构件要分享的内容
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, "https://www.baidu.com");//必填
// 注意:QZone接口暂不支持发送多张图片的能力,若传入多张图片,则会自动选入第一张图片作为预览图。多图的能力将会在以后支持。:
params.putStringArrayList(QzoneShare.SHARE_TO_QQ_IMAGE_URL, imges);
mTencent.shareToQQ((Activity) mContext, mParansBundle, new IUiListener() { @Override
public void onComplete(Object o) {
Timber.d(o.toString());
Toast.makeText(mContext, "onComplete", Toast.LENGTH_SHORT).show();
}
@Override
public void onError(UiError uiError) {
Timber.d(uiError.errorCode + uiError.errorDetail + uiError.errorMessage);
Toast.makeText(mContext, "onError", Toast.LENGTH_SHORT).show();
}
@Override
public void onCancel() {
Toast.makeText(mContext, "onCancel", Toast.LENGTH_SHORT).show();
}
});
QQ分享文档还是比较清晰的 就是不太好找。
微信分享:
资源下载:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319167&token=abc9f1cf46bab8ac24d0de78399250bf41dddbd1&lang=zh_CN
分享与收藏功能开发文档(Android应用)
微信分享及收藏是指第三方App通过接入该功能,让用户可以从App分享文字、图片、音乐、视频、网页至微信好友会话、朋友圈或添加到微信收藏。
微信分享及收藏功能已向全体开发者开放,开发者在微信开放平台帐号下申请App并通过审核后,即可获得微信分享及收藏权限。
微信分享及收藏目前支持文字、图片、音乐、视频、网页共五种类型。开发者在App中在集成微信SDK后,可调用接口实现,以下依次是文字分享、图片分享、音乐分享、视频分享、网站分享的示例。
分享或收藏的目标场景,通过修改scene场景值实现。
发送到聊天界面——WXSceneSession
发送到朋友圈——WXSceneTimeline
添加到微信收藏——WXSceneFavorite
一、文字类型分享示例
二、图片类型分享示例
三、音乐类型分享示例
注意:分享至微信的音乐,直接点击好友会话或朋友圈下的分享内容会跳转至第三方 APP,点击会话列表顶部的音乐分享内容将跳转至微信原生音乐播放器播放。
四、视频类型分享示例
五、网页类型分享示例
文档很清晰:
代码部分:
文件中添加 微信回调:
package="com.lskj.rrhr.shortkeytest" 在你的应用根包下 添加新包 包名:wxapi 不要改。--》新建类
WXEntryActivity:
package com.lskj.rrhr.shortkeytest.wxapi;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;
import com.lskj.rrhr.shortkeytest.modules.share.ShareConfig;
import com.tencent.mm.sdk.modelbase.BaseReq;
import com.tencent.mm.sdk.modelbase.BaseResp;
import com.tencent.mm.sdk.openapi.IWXAPI;
import com.tencent.mm.sdk.openapi.IWXAPIEventHandler;
import com.tencent.mm.sdk.openapi.WXAPIFactory;
/**
* Created by Home on 16/8/22.
*/
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
private IWXAPI api;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
api = WXAPIFactory.createWXAPI(this, ShareConfig.WX_APPID, false);
api.registerApp(ShareConfig.WX_APPID);
api.handleIntent(getIntent(), this);
}
@Override
public void onReq(BaseReq baseReq) {
finish();
}
@Override
public void onResp(BaseResp baseResp) {
String result = "";
switch (baseResp.errCode) {
case BaseResp.ErrCode.ERR_OK:
result = "分享成功";
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
result = "取消分享";
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED:
result = "认证失败";
break;
default:
result = "未知错误";
break;
}
Toast.makeText(this, result, Toast.LENGTH_LONG).show();
finish();
}
}
AndroidManifest.xml 添加:
<!--微信回调-->
<activity
android:name=".wxapi.WXEntryActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
配置完成。
//与微信的通信接口
private IWXAPI mIWXAPI = null;
//注册应用
mIWXAPI = WXAPIFactory.createWXAPI(context, ShareConfig.WX_APPID, false);
mIWXAPI.registerApp(ShareConfig.WX_APPID);
//此处你自己构建Message
我自己的示例代码是:
WXTextObject textObject = new WXTextObject();
textObject.text = "我要分享";
WXMediaMessage msg = new WXMediaMessage();
msg.mediaObject = textObject;
msg.description = "我是分享表述";
SendMessageToWX.Req request = new SendMessageToWX.Req();
request.message = msg;
request.transaction = buildTransaction("文本分享");
request.scene = SendMessageToWX.Req.WXSceneSession;
request.toBundle(params);
SendMessageToWX.Req request = new SendMessageToWX.Req();
request.fromBundle(mParansBundle);
mIWXAPI.sendReq(request);
为什么要用红色部分--》因为我不是在一个页面完成的,涉及到页面的传值。 它提供了这个方法(微信,新浪有)
微博分享:(如果只需要分享功能不需要审核)
1.注册开发者账号
进入新浪微博提供的开放平台 注册新浪账号:http://open.weibo.com/
在管理中心需要创建一个应用,得到Appkey,如果只是实现分享的功能也不需要提交审核。
2.应用信息
基本信息页面:需要填写Android签名
签名工具下载地址:https://github.com/mobileresearch/weibo_android_sdk/blob/master/app_signatures.apk
安装到手机,打开签名工具输入包名,生成一个唯一的MD5校验码,填写即可。
高级信息页面:需要填写授权回调页面,需要与程序代码中的REDIRECT_URL一致,如下图所示
3.讲WeiboSDK引入到自己的项目当中
WeiboSDK下载地址:http://open.weibo.com/wiki/SDK#Android_SDK
4.实现认证及分享
<pre name="code" class="java">
/**
* 该类演示了第三方应用如何通过微博客户端分享内容。
* 执行流程: 从本应用->微博->本应用
*/
public class WBShareActivity extends Activity implements Response,
OnClickListener {
/** 微博分享按钮 */
private Button mShareButton;
/** 微博实例 */
private AuthInfo mAuthInfo;
/** 注意:SsoHandler 仅当 SDK 支持 SSO 时有效 */
private SsoHandler mSsoHandler;
/** 封装了 "access_token","expires_in","refresh_token",并提供了他们的管理功能 */
private Oauth2AccessToken mAccessToken;
/** 是否安装微博*/
private boolean isInstalledWeibo;
/** 支持Api级别*/
private int supportApiLevel;
/** 微博分享的接口实例 */
private IWeiboShareAPI mWeiboShareAPI;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wbshare);
//点击执行分享操作
mShareButton = (Button) findViewById(R.id.register_app_to_weibo);
mShareButton.setOnClickListener(this);
}
@Override
public void onClick(View v) {
// 创建微博实例
mAuthInfo = new AuthInfo(this, Constants.WB_APP_KEY,
Constants.REDIRECT_URL, Constants.SCOPE);
mSsoHandler = new SsoHandler(this, mAuthInfo);
// SSO 授权, 仅客户端
mSsoHandler.authorizeClientSso(new AuthListener());
// 创建微博 SDK 接口实例
mWeiboShareAPI = WeiboShareSDK.createWeiboAPI(this,
Constants.WB_APP_KEY);
// 注册第三方应用到微博客户端中,注册成功后该应用将显示在微博的应用列表中。
// 但该附件栏集成分享权限需要合作申请,详情请查看 Demo 提示
// NOTE:请务必提前注册,即界面初始化的时候或是应用程序初始化时,进行注册
mWeiboShareAPI.registerApp();
// 当 Activity 被重新初始化时(该 Activity 处于后台时,可能会由于内存不足被杀掉了),
// 需要调用 {@link IWeiboShareAPI#handleWeiboResponse} 来接收微博客户端返回的数据。
// 执行成功,返回 true,并调用 {@link IWeiboHandler.Response#onResponse};
// 失败返回 false,不调用上述回调
mWeiboShareAPI.handleWeiboResponse(getIntent(), this);
// 获取微博客户端是否安装
isInstalledWeibo = mWeiboShareAPI.isWeiboAppInstalled();
// 支持 SDK 的版本
supportApiLevel = mWeiboShareAPI.getWeiboAppSupportAPI();
}
/**
* 微博认证授权回调类。 1. SSO 授权时,需要在 {@link #onActivityResult} 中调用
* {@link SsoHandler#authorizeCallBack} 后, 该回调才会被执行。 2. 非 SSO
* 授权时,当授权结束后,该回调就会被执行。 当授权成功后,请保存该 access_token、expires_in、uid 等信息到
* SharedPreferences 中。
*/
class AuthListener implements WeiboAuthListener {
@Override
public void onComplete(Bundle values) {
// 从 Bundle 中解析 Token
mAccessToken = Oauth2AccessToken.parseAccessToken(values);
// 判断AccessToken是否有效
if (mAccessToken.isSessionValid()) {
// 保存 Token 到 SharedPreferences
AccessTokenKeeper.writeAccessToken(WBShareActivity.this,mAccessToken);
Toast.makeText(WBShareActivity.this, "获取token成功",Toast.LENGTH_SHORT).show();
shareToWeiBo();
} else {
System.out.println("认证失败");
}
}
@Override
public void onCancel() {
Toast.makeText(WBShareActivity.this, "取消", Toast.LENGTH_LONG)
.show();
}
@Override
public void onWeiboException(WeiboException e) {
Toast.makeText(WBShareActivity.this,
"Auth exception : " + e.getMessage(), Toast.LENGTH_LONG)
.show();
}
}
/**
* 分享到微博
*/
private void shareToWeiBo() {
if (isInstalledWeibo) {
if (mWeiboShareAPI.isWeiboAppSupportAPI()) {
if (supportApiLevel >= 10351 /* ApiUtils.BUILD_INT_VER_2_2 */) {
// 1. 初始化微博的分享消息
WeiboMultiMessage weiboMessage = new WeiboMultiMessage();
//这里指实现了分享文本內容 还可以分享 图片 视频 音乐 声音 网页 详见WeiboSDKDemo
TextObject textObject = new TextObject();
textObject.text = "分享消息";
weiboMessage.textObject = textObject;
// 2. 初始化从第三方到微博的消息请求
SendMultiMessageToWeiboRequest request = new SendMultiMessageToWeiboRequest();
// 用transaction唯一标识一个请求
request.transaction = String.valueOf(System
.currentTimeMillis());
request.multiMessage = weiboMessage;
// 3. 发送请求消息到微博,唤起微博分享界面
mWeiboShareAPI.sendRequest(WBShareActivity.this, request);
}
} else {
Toast.makeText(this, "SDK不支持", Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(this, "没有安装新浪微博客户端", Toast.LENGTH_LONG).show();
}
遇到的问题:
授权时:
文件不存在 c8998
有两种情况:应用的签名不一致,微博回调 不一致
解决办法:新浪开发者-》我的应用(上方)--》应用信息--》高级信息(子目录)--》)
OAuth2.0 授权设置
授权回调页:
mAuthInfo = new AuthInfo(this, Constants.WB_APP_KEY,
Constants.REDIRECT_URL, Constants.SCOPE); Constants.REDIRECT_URL 要一致。
第二种就是签名问题了。分享时,需要先打包(或者配置debug 签名)。
还要注意下:
好坑的说。
<activity
android:name=".modules.share.ShareActivity"
android:configChanges="keyboard|keyboardHidden|orientation"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
最后贴一下我自己写的:
动态权限
private String[] mPermissionList = new String[]
{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.CALL_PHONE,
Manifest.permission.READ_LOGS, Manifest.permission.READ_PHONE_STATE,
Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.SET_DEBUG_APP,
Manifest.permission.SYSTEM_ALERT_WINDOW, Manifest.permission.GET_ACCOUNTS};
/**
* 微博实例
*/
private AuthInfo mAuthInfo;
/**
* 注意:SsoHandler 仅当 SDK 支持 SSO 时有效
*/
private SsoHandler mSsoHandler;
/**
* 封装了 "access_token","expires_in","refresh_token",并提供了他们的管理功能
*/
private Oauth2AccessToken mAccessToken;
/**
* 是否安装微博
*/
private boolean isInstalledWeibo;
/**
* 支持Api级别
*/
private int supportApiLevel;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//sina 授权回调
if (mSsoHandler != null) {
mSsoHandler.authorizeCallBack(requestCode, resultCode, data);
}
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
// 从当前应用唤起微博并进行分享后,返回到当前应用时,需要在此处调用该函数
// 来接收微博客户端返回的数据;执行成功,返回 true,并调用
// {@link IWeiboHandler.Response#onResponse};失败返回 false,不调用上述回调
iWeiboShareAPI.handleWeiboResponse(intent, this);
}
View onClick 后执行:
iWeiboShareAPI = WeiboShareSDK.createWeiboAPI(ShareActivity.this,
ShareConfig.XL_APPID);
// 注册第三方应用到微博客户端中,注册成功后该应用将显示在微博的应用列表中。
// 但该附件栏集成分享权限需要合作申请,详情请查看 Demo 提示
// NOTE:请务必提前注册,即界面初始化的时候或是应用程序初始化时,进行注册
iWeiboShareAPI.registerApp();
// 获取微博客户端是否安装
isInstalledWeibo = iWeiboShareAPI.isWeiboAppInstalled();
// 支持 SDK 的版本
supportApiLevel = iWeiboShareAPI.getWeiboAppSupportAPI();
//socpe 参考地址:http://open.weibo.com/wiki/Scope#scope.E6.9D.83.E9.99.90.E6.8E.A5.E5.8F.A3
mAuthInfo = new AuthInfo(this, ShareConfig.XL_APPID,
"http://www.sina.com", "all");
mSsoHandler = new SsoHandler(this, mAuthInfo);
// SSO 授权, 仅客户端
mSsoHandler.authorizeClientSso(new WeiboAuthListener() {
@Override
public void onComplete(Bundle bundle) {
// 从 Bundle 中解析 Token
mAccessToken = Oauth2AccessToken.parseAccessToken(bundle);
// 判断AccessToken是否有效
if (mAccessToken.isSessionValid()) {
// 保存 Token 到 SharedPreferences
AccessTokenKeeper.writeAccessToken(ShareActivity.this, mAccessToken);
Toast.makeText(ShareActivity.this, "获取token成功", Toast.LENGTH_SHORT).show();
shareToWeiBo();
} else {
System.out.println("获取Token失败!");
}
}
@Override
public void onWeiboException(WeiboException e) {
Toast.makeText(ShareActivity.this,
"Auth exception : " + e.getMessage(), Toast.LENGTH_LONG)
.show();
}
@Override
public void onCancel() {
Toast.makeText(ShareActivity.this, "sina 授权取消", Toast.LENGTH_SHORT).show();
}
});
private void shareToWeiBo() {
if (isInstalledWeibo) {
if (iWeiboShareAPI.isWeiboAppSupportAPI()) {
//mulitMessage
if (supportApiLevel >= 10351 /* ApiUtils.BUILD_INT_VER_2_2 */) {
TextObject textObject4 = new TextObject();
textObject4.text = "要分享的文字";
Timber.d(">10351 mulitmessage");
// sendMultiMessage(hasText, hasImage, hasWebpage, hasMusic, hasVideo, hasVoice);
WeiboMultiMessage multiMessage = new WeiboMultiMessage();
multiMessage.textObject = textObject4;
SendMultiMessageToWeiboRequest request5 = new SendMultiMessageToWeiboRequest();
request5.multiMessage = multiMessage;
request5.transaction = String.valueOf(System.currentTimeMillis());
boolean result = iWeiboShareAPI.sendRequest(this, request5);
Timber.d("start mulit share...." + result);
} else {//singe messge
Toast.makeText(ShareActivity.this, "start single share...", Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(ShareActivity.this, "SDK 不支持!", Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(ShareActivity.this, "没有安装客户端!", Toast.LENGTH_SHORT).show();
}
}