Android应用添加分享至微信、QQ和微博
转载请保留: http://blog.youkuaiyun.com/lys211/article/details/52002687
最近需要在应用里添加分享至微信、QQ和微博的功能,但是因为除了这些官方的*.jar包,项目中不希望加入其他的第三方sdk,于是只能自己参考官方文档进行添加。
正巧我们的需求只是分享网页链接而已,同时官方文档都讲得比较详细,所以总体感觉这个还是挺简单。
要去腾讯开放平台 http://open.qq.com/ 去申请开发者账号,然后创建一个自己的应用(如果只是测试官方接口的使用,可以只创建并保存应用信息而不提交审核,这样就可以有一个临时可以使用的app id和app key可以使用)。
同理,分享到微信和微博(微博也可以只申请,不提交审核)也需要申请app id。
具体流程可以自行度娘。
我也是参考了网上朋友的做法,侵删。
接着下载各个jar
微信
libammsdk.jar
腾讯qq
mta-sdk-1.6.2.jar
open_sdk_r5756_lite.jar
新浪微博
weiboSDKCore_3.1.4.jar
把以上这些jar加入到工程中。
注:因为开发环境为Android Studio,新浪微博的分享功能除了jar以外,还要在src/main下面新建一个jniLibs文件夹,把.so文件放到这个文件夹下
为了方便添加到各个项目而不怎么影响别的代码,文件结构是这样的:
为了方便,新建一个ShareUtils类
添加变量:
<pre name="code" class="java">public static final String WX_APP_ID = "<span style="font-family: Arial, Helvetica, sans-serif;">你申请的tencent app id</span><span style="font-family: Arial, Helvetica, sans-serif;">";</span>
private static final String SINA_APP_KEY = "你申请的微博app id";
private static final String QQ_APP_ID = "<span style="font-family: Arial, Helvetica, sans-serif;">你申请的tencent app id</span><span style="font-family: Arial, Helvetica, sans-serif;">";</span>
<pre name="code" class="java"><pre name="code" class="java">private IWXAPI _iwxapi;
private Tencent _tencent;
private IWeiboShareAPI _iWeiboShareAPI;
添加注册方法:
public void registerShareUtils(Context context) {
Log.d(_TAG, "registerShareUtils");
_context = context;
registerToQQ(_context);
registerToWechat(_context);
registerToSinaWeibo(_context);
<span style="font-family: Arial, Helvetica, sans-serif;"> }</span>
public void registerToWechat(Context context) {
_iwxapi = WXAPIFactory.createWXAPI(context, WX_APP_ID, true);
_iwxapi.registerApp(WX_APP_ID);
}
public void registerToQQ(Context context) {
_tencent = Tencent.createInstance(QQ_APP_ID, context);
}
public void registerToSinaWeibo(Context context) {
_iWeiboShareAPI = WeiboShareSDK.createWeiboAPI(context, SINA_APP_KEY);
_iWeiboShareAPI.registerApp();
}
各自的分享实现:
1.分享至微信
如果你在微信开放平台上注册的包名是 aaa.bb.ccc,那么你需要在此包下新建一个包 wxapi,结果是这样的(aaa.bb.ccc.wxapi),在此新包下新建一个activity,命名为 WXEntryActivity。
AndroidManifest.xml同时添加:
<activity
android:name=".wxapi.WXEntryActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:exported="true"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
方法实现
<pre name="code" class="java"> private byte[] getBitmapBytes(Bitmap bitmap) {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream);
return byteArrayOutputStream.toByteArray();
}
private byte[] getBitmapBytes(Bitmap bitmap) {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream);
return byteArrayOutputStream.toByteArray();
}
public void shareToWechatSceneSession(@NonNull ShareContentBody message) {
WXWebpageObject webpageObject = new WXWebpageObject();
webpageObject .webpageUrl = message.getLink();
WXMediaMessage wxMediaMessage = new WXMediaMessage(webpageObject);
wxMediaMessage.title = message.getTitle();
wxMediaMessage.description = message.getDescription();
Bitmap bitmap = BitmapFactory.decodeResource(_context.getResources(), R.drawable.app_icon);
Bitmap thumbBitmap = Bitmap.createScaledBitmap(bitmap, 150, 150, true);
wxMediaMessage.thumbData = getBitmapBytes(thumbBitmap);
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = String.valueOf(System.currentTimeMillis());
req.message = wxMediaMessage;
req.scene = SendMessageToWX.Req.WXSceneSession;
_iwxapi.sendReq(req);
}
public void shareToWechatSceneTimeline(@NonNull ShareContentBody message) {
WXWebpageObject webpageObject = new WXWebpageObject();
webpageObject.webpageUrl = message.getLink();
WXMediaMessage mediaMessage = new WXMediaMessage(webpageObject);
mediaMessage.title = message.getTitle();
mediaMessage.description = message.getDescription();
//Bitmap bitmap = BitmapFactory.decodeFile(message.getImageUrl());
Bitmap bitmap = BitmapFactory.decodeResource(_context.getResources(), R.drawable.app_icon);
Bitmap thumbBitmap = Bitmap.createScaledBitmap(bitmap, 150, 150, true);
mediaMessage.thumbData = getBitmapBytes(thumbBitmap);
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = String.valueOf(System.currentTimeMillis());
req.message = mediaMessage;
req.scene = SendMessageToWX.Req.WXSceneTimeline;
_iwxapi.sendReq(req);
}
public void shareToWechatFavorite(@NonNull ShareContentBody message) {
WXWebpageObject webpageObject = new WXWebpageObject();
webpageObject.webpageUrl = message.getLink();
WXMediaMessage wxMediaMessage = new WXMediaMessage(webpageObject);
wxMediaMessage.title = message.getTitle();
wxMediaMessage.description = message.getDescription();
Bitmap bitmap = BitmapFactory.decodeResource(_context.getResources(), R.drawable.app_icon);
Bitmap thumbBitmap = Bitmap.createScaledBitmap(bitmap, 150, 150, true);
wxMediaMessage.thumbData = getBitmapBytes(thumbBitmap);
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = String.valueOf(System.currentTimeMillis());
req.message = wxMediaMessage;
req.scene = SendMessageToWX.Req.WXSceneFavorite;
_iwxapi.sendReq(req);
}
2.分享至QQ和QQ空间
在AndroidManifest.xml中添加如下声明:
<activity
android:name="com.tencent.connect.common.AssistActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
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="tencent你的tencent id" />
</intent-filter>
</activity>
对于上面代码中的这一行:
<data android:scheme="tencent你的tencent id" />
如果你申请到的tencent id是1234567890,那么这行就是这样的:
<data android:scheme="tencent1234567890" />
主要方法实现
public void shareToQQ(@NonNull Activity activity, @NonNull ShareContentBody body, IUiListener iUiListener) {
final Bundle bundle = new Bundle();
bundle.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_DEFAULT);
bundle.putString(QQShare.SHARE_TO_QQ_TARGET_URL, body.getLink());
bundle.putString(QQShare.SHARE_TO_QQ_TITLE, body.getTitle());
bundle.putString(QQShare.SHARE_TO_QQ_SUMMARY, body.getDescription());
bundle.putString(QQShare.SHARE_TO_QQ_IMAGE_URL, body.getImageUrl());
bundle.putString(QQShare.SHARE_TO_QQ_APP_NAME, activity.getString(R.string.app_name));
_tencent.shareToQQ(activity, bundle, iUiListener);
}
public void shareToQQZone(@NonNull Activity activity, @NonNull ShareContentBody body, IUiListener iUiListener) {
final Bundle bundle = new Bundle();
bundle.putInt(QzoneShare.SHARE_TO_QZONE_KEY_TYPE, QzoneShare.SHARE_TO_QZONE_TYPE_IMAGE_TEXT);
bundle.putString(QzoneShare.SHARE_TO_QQ_TARGET_URL, body.getLink());
bundle.putString(QzoneShare.SHARE_TO_QQ_TITLE, body.getTitle());
bundle.putString(QzoneShare.SHARE_TO_QQ_SUMMARY, body.getDescription());
ArrayList<String> imageUrlList = new ArrayList<>();
imageUrlList.add(body.getImageUrl());
bundle.putStringArrayList(QzoneShare.SHARE_TO_QQ_IMAGE_URL, imageUrlList);
bundle.putString(QzoneShare.SHARE_TO_QQ_APP_NAME, activity.getString(R.string.app_name));
_tencent.shareToQzone(activity, bundle, iUiListener);
}
3.分享至微博
private TextObject getTextObject(String shareText) {
TextObject textObject = new TextObject();
textObject.text = shareText;
return textObject;
}
private ImageObject getImageObject(Drawable drawable) {
ImageObject imageObject = new ImageObject();
BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
imageObject.setImageObject(bitmapDrawable.getBitmap());
return imageObject;
}
private WebpageObject getWebpageObject(ShareContentBody message) {
WebpageObject webpageObject = new WebpageObject();
webpageObject.identify = message.getDescription();
webpageObject.title = message.getTitle();
webpageObject.description = message.getDescription();
webpageObject.actionUrl = message.getLink();
webpageObject.defaultText = message.getTitle();
Bitmap bitmap = BitmapFactory.decodeResource(_context.getResources(), R.drawable.app_icon);
Bitmap thumbBitmap = Bitmap.createScaledBitmap(bitmap, 108, 108, true);
webpageObject.setThumbImage(thumbBitmap);
return webpageObject;
}
private void shareSinaWeiboSingleMessage(@NonNull Activity activity, ShareContentBody message, Drawable drawable) {
Log.d(_TAG, "shareSinaWeiboSingleMessage ");
WeiboMessage weiboMessage = new WeiboMessage();
weiboMessage.mediaObject = getTextObject(message.getTitle());
weiboMessage.mediaObject = getImageObject(drawable);
SendMessageToWeiboRequest request = new SendMessageToWeiboRequest();
request.transaction = String.valueOf(System.currentTimeMillis());
request.message = weiboMessage;
_iWeiboShareAPI.sendRequest(activity, request);
}
private void shareSinaWeiboMultiMessage(@NonNull Activity activity, ShareContentBody message, Drawable drawable) {
Log.d(_TAG, "shareSinaWeiboMultiMessage ");
WeiboMultiMessage weiboMultiMessage = new WeiboMultiMessage();
weiboMultiMessage.textObject = getTextObject(message.getTitle());
weiboMultiMessage.imageObject = getImageObject(drawable);
weiboMultiMessage.mediaObject = getWebpageObject(message);
SendMultiMessageToWeiboRequest request = new SendMultiMessageToWeiboRequest();
request.transaction = String.valueOf(System.currentTimeMillis());
request.multiMessage = weiboMultiMessage;
_iWeiboShareAPI.sendRequest(activity, request);
}
public void shareToSinaWeibo(@NonNull Activity activity, ShareContentBody message, Drawable drawable) {
if (drawable == null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
drawable = _context.getDrawable(R.mipmap.app_icon);
} else {
drawable = _context.getResources().getDrawable(R.mipmap.app_icon);
}
}
if (_iWeiboShareAPI.isWeiboAppSupportAPI()) {
int supportAPI = _iWeiboShareAPI.getWeiboAppSupportAPI();
if (supportAPI >= 10351) {
shareSinaWeiboMultiMessage(activity, message, drawable);
} else {
shareSinaWeiboSingleMessage(activity, message, drawable);
}
}
}
ShareContentBody是自己定义的一个消息结构类
public class ShareContentBody extends SharedMessage {
private static final String _TAG = ShareContentBody.class.getSimpleName();
private String _link;
private String _title;
private String _imageUrl;
private String _description;
public ShareContentBody(String link, String title, String description, String imageUrl) {
Log.d(_TAG, "ShareContentBody");
_link = link;
_title = title;
_imageUrl = imageUrl;
_description = description;
}
public void setLink(String link) {
_link = link;
}
public void setTitle(String title) {
_title = title;
}
public void setImageUrl(String imageUrl) {
_imageUrl = imageUrl;
}
public void setDescription(String description) {
_description = description;
}
@Override
public String getLink() {
return _link;
}
@Override
public String getTitle() {
return _title;
}
@Override
public String getImageUrl() {
return _imageUrl;
}
@Override
public String getDescription() {
return _description;
}
}
在MainActivity里,想调用分享功能,只需要添加成员:
private ShareUtils _shareUtils;
然后在onCreate里添加
_shareUtils = new ShareUtils();
_shareUtils.registerShareUtils(getApplicationContext());
接着在需要弹出分享窗的地方添加
SharePopupWindow sharePopupWindow = new SharePopupWindow(this, body, _shareUtils, null);
sharePopupWindow.showAtLocation(getWindow().getDecorView(), Gravity.CENTER | Gravity.CENTER_HORIZONTAL, 0, 0);
以上是主要的分享实现代码了,看文档和各种朋友的分享文章,都很容易实现。跟着文档跑一下demo就可以比较容易的做出来。项目中只需要添加分享网页链接的功能,至于授权登录什么的,忽略了,反正项目里不需要...
点击分享按钮,弹出的效果如下图:
完整工程请参考csdn下载链接:http://download.youkuaiyun.com/detail/lys211/9584596