说起微信分享我就忍不住吐槽,
第一:你必须先去官网获取它的WX_APP_ID,不然在你开发阶段根本没法测试(当然你可以试着用测试号,我没有用过的。)。
第二,就是关于微信提供的debug.keystore签名,前提你必须去官网获取认证,否则不可能分享成功。
第三,在你的app中添加了太多微信相关的代码,而且放的相关文件问题还必须放在工程根目录下面。
第四,当你获取开发完开始测试时,你必须把你的微信清空一次,不然你也不可能成功的分享连接。
哎,反正他真的没有qq做的公共借口做的好,配置太麻烦了。不吐槽了,进入正题。
一,进入公众平台注册:
二,微信分享资料官网地址
代码示例连接
jar包以及示例下载地址
(建议最好看官网的资料,其它的资料一个不是最新的,第二个也不安全)
三、资料准备好了,开始开发了噢(记得导入jar包哦)
1.在AndroidManifest.xml中添加下面配置
参考官网示例中的相关文件,只要activity相关,把intent-filter过滤给去掉。
<activity
android:name=".wxapi.WXEntryActivity"
android:label="@string/app_name"
android:exported="true"
android:launchMode="singleTop">
<!--<intent-filter>-->
<!--<action android:name="android.intent.action.MAIN" />-->
<!--<category android:name="android.intent.category.LAUNCHER" />-->
<!--</intent-filter>-->
<!--<intent-filter>-->
<!--<action android:name="android.intent.action.VIEW"/>-->
<!--<category android:name="android.intent.category.DEFAULT"/>-->
<!--<data android:scheme="sdksample"/>-->
<!--</intent-filter>-->
</activity>
2.,copy官网中的示例中的wxapi包
copy到你的工程的中,wxapi必须在你的项目的包名下面。
a.修改WXEntryActivity文件
去掉示例中引用的acitivity以及提示,保留注册以及回调信息等。下面是我修改过的wxEntryActivity示例:
public class WXEntryActivity extends Activity implements IWXAPIEventHandler{
private IWXAPI api;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
api = WXAPIFactory.createWXAPI(this, WX_APP_ID, false);
api.registerApp(WX_APP_ID);
api.handleIntent(getIntent(), this);
}
//
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
api.handleIntent(intent, this);
}
// 微信发送请求到第三方应用时,会回调到该方法
@Override
public void onReq(BaseReq req) {
switch (req.getType()) {
case ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX:
break;
case ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX:
// goToShowMsg((ShowMessageFromWX.Req) req);
break;
default:
break;
}
}
// 第三方应用发送到微信的请求处理后的响应结果,会回调到该方法
@Override
public void onResp(BaseResp resp) {
int result = 0;
switch (resp.errCode) {
case BaseResp.ErrCode.ERR_OK:
result = R.string.errcode_success;
finish();
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
result = R.string.errcode_cancel;
finish();
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED:
result = R.string.errcode_deny;
break;
default:
result = R.string.errcode_unknown;
break;
}
finish();
Toast.makeText(this, result, Toast.LENGTH_LONG).show();
}
b.新建微信WeixinShareManager类,里面官网分享的不同类型的方法总结:
(代码里注意:WeixinShareUtil是微信里的的类,我用的时候改了下名字)。
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.widget.Toast;
import com.tencent.mm.sdk.modelmsg.SendMessageToWX;
import com.tencent.mm.sdk.modelmsg.WXImageObject;
import com.tencent.mm.sdk.modelmsg.WXMediaMessage;
import com.tencent.mm.sdk.modelmsg.WXTextObject;
import com.tencent.mm.sdk.modelmsg.WXWebpageObject;
import com.tencent.mm.sdk.openapi.IWXAPI;
import com.tencent.mm.sdk.openapi.WXAPIFactory;
public class WeixinShareManager {
private static final int THUMB_SIZE = 150;
/**
* 文字
*/
public static final int WEIXIN_SHARE_WAY_TEXT = 1;
/**
* 图片
*/
public static final int WEIXIN_SHARE_WAY_PIC = 2;
/**
* 链接
*/
public static final int WEIXIN_SHARE_WAY_WEBPAGE = 3;
/**
* 会话
*/
public static final int WEIXIN_SHARE_TYPE_TALK = SendMessageToWX.Req.WXSceneSession;
/**
* 朋友圈
*/
public static final int WEIXIN_SHARE_TYPE_FRENDS = SendMessageToWX.Req.WXSceneTimeline;
private static WeixinShareManager instance;
private static String weixinAppId;
private IWXAPI wxApi;
private Context context;
private WeixinShareManager(Context context) {
this.context = context;
//初始化数据
weixinAppId = WX_APP_ID;
//初始化微信分享代码
if (weixinAppId != null) {
initWeixinShare(context);
}
}
/**
* 获取WeixinShareManager实例
* 非线程安全,请在UI线程中操作
*
* @return
*/
public static WeixinShareManager getInstance(Context context) {
if (instance == null) {
instance = new WeixinShareManager(context);
}
return instance;
}
private void initWeixinShare(Context context) {
wxApi = WXAPIFactory.createWXAPI(context, weixinAppId, false);
wxApi.registerApp(weixinAppId);
}
/**
* 通过微信分享
*
* @param shareContent 分享的方式(文本、图片、链接)
* @param shareType 分享的类型(朋友圈,会话)
*/
public void shareByWeixin(ShareContent shareContent, int shareType) {
switch (shareContent.getShareWay()) {
case WEIXIN_SHARE_WAY_TEXT:
shareText(shareType, shareContent);
break;
case WEIXIN_SHARE_WAY_PIC:
sharePicture(shareType, shareContent);
break;
case WEIXIN_SHARE_WAY_WEBPAGE:
shareWebPage(shareType, shareContent);
break;
}
}
/*
* 分享文字
*/
private void shareText(int shareType, ShareContent shareContent) {
String text = shareContent.getContent();
//初始化一个WXTextObject对象
WXTextObject textObj = new WXTextObject();
textObj.text = text;
//用WXTextObject对象初始化一个WXMediaMessage对象
WXMediaMessage msg = new WXMediaMessage();
msg.mediaObject = textObj;
msg.description = text;
//构造一个Req
SendMessageToWX.Req req = new SendMessageToWX.Req();
//transaction字段用于唯一标识一个请求
req.transaction = buildTransaction("textshare");
req.message = msg;
//发送的目标场景, 可以选择发送到会话 WXSceneSession 或者朋友圈 WXSceneTimeline。 默认发送到会话。
req.scene = shareType;
wxApi.sendReq(req);
}
/*
* 分享图片
*/
private void sharePicture(int shareType, ShareContent shareContent) {
WXImageObject imgObj = new WXImageObject(shareContent.getBitmap());
WXMediaMessage msg = new WXMediaMessage();
msg.mediaObject = imgObj;
Bitmap thumbBmp = Bitmap.createScaledBitmap(shareContent.getBitmap(), THUMB_SIZE, THUMB_SIZE, true);
shareContent.getBitmap().recycle();
msg.thumbData = WeixinShareUtil.bmpToByteArray(thumbBmp, true); //设置缩略图
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = buildTransaction("imgshareappdata");
req.message = msg;
req.scene = shareType;
wxApi.sendReq(req);
}
/*
* 分享链接
*/
private void shareWebPage(int shareType, ShareContent shareContent) {
WXWebpageObject webpage = new WXWebpageObject();
webpage.webpageUrl = shareContent.getURL()+"&from=weixin";
WXMediaMessage msg = new WXMediaMessage(webpage);
msg.title = shareContent.getTitle();
msg.description = shareContent.getContent();
if (shareContent.getBitmap() == null) {
Toast.makeText(context, "图片不能为空", Toast.LENGTH_SHORT).show();
} else {
Bitmap thumbBmp = Bitmap.createScaledBitmap(shareContent.getBitmap(), 32, 32, true);
msg.thumbData = WeixinShareUtil.bmpToByteArray(thumbBmp, true);
}
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = buildTransaction("webpage");
req.message = msg;
req.scene = shareType;
wxApi.sendReq(req);
}
private String buildTransaction(final String type) {
return (type == null) ? String.valueOf(System.currentTimeMillis()) : type + System.currentTimeMillis();
}
}
c.相关实体类(这里的实体类和前面文章QQ的分享是共同的类。)
1.抽象实体父类
public abstract class ShareContent implements Serializable {
public abstract int getShareWay();
public abstract String getContent();
public abstract String getTitle();
public abstract String getURL();
public abstract String getPicResource();
public abstract Bitmap getBitmap();
public abstract void setBitmap(Bitmap bitmap);
}
2.继承的分享图片的的实体类
/**
* 设置分享图片的内容
* Created by wyh on 2016/8/16.
*/
public class ShareContentPic extends ShareContent {
private String picResource;
private Bitmap bitmap;
public ShareContentPic(String picResource){
this.picResource = picResource;
}
@Override
public String getContent() {
return null;
}
@Override
public String getTitle() {
return null;
}
@Override
public String getURL() {
return null;
}
@Override
public String getPicResource() {
return picResource;
}
@Override
public Bitmap getBitmap() {
return bitmap;
}
@Override
public void setBitmap(Bitmap bitmap) {
this.bitmap = bitmap;
}
@Override
public int getShareWay() {
return WeixinShareManager.WEIXIN_SHARE_WAY_PIC;
}
}
3.分享文本类:
public class ShareContentText extends ShareContent{
private String content;
/**
* 构造分享文字类
*/
public ShareContentText(String content){
this.content = content;
}
@Override
public String getContent() {
return content;
}
@Override
public String getTitle() {
return null;
}
@Override
public String getURL() {
return null;
}
@Override
public String getPicResource() {
return "-1";
}
@Override
public Bitmap getBitmap() {
return null;
}
@Override
public void setBitmap(Bitmap bitmap) {
}
@Override
public int getShareWay() {
return WeixinShareManager.WEIXIN_SHARE_WAY_TEXT;
}
}
4.分享连接相关实体类:
/**
* 设置分享链接的内容
* Created by on 2016/8/16.
*/
public class ShareContentWebpage extends ShareContent {
private String title;
private String content;
private String url;
private String picResource;
private Bitmap bitmap;
public ShareContentWebpage(String title, String content,
String url, String picResource){
this.title = title;
this.content = content;
this.url = url;
this.picResource = picResource;
}
@Override
public String getContent() {
return content;
}
@Override
public String getTitle() {
return title;
}
@Override
public String getURL() {
return url;
}
@Override
public String getPicResource() {
return picResource;
}
@Override
public Bitmap getBitmap() {
return bitmap;
}
@Override
public void setBitmap(Bitmap bitmap) {
this.bitmap = bitmap;
}
@Override
public int getShareWay() {
return WeixinShareManager.WEIXIN_SHARE_WAY_WEBPAGE;
}
}
d.使用示例:
/**
*分享给微信好友
*/
private void showWeixinhaoyou(View view) {
WeixinShareManager weixinShareManager = getInstance(getActivity());
if (shareContent.getPicResource()!=null) {
shareContent.setBitmap(bitmap);
}
weixinShareManager.shareByWeixin(shareContent, 0);
}
三.总结:
大体就这么多了,util类,我就不贴代码了,自己copy官网的示例就好。主要注意配置和引入包的位置就可。上述主要看weixinShareManager就行。我在使用分享仅用了url连接分享。其它接口的没有测试过。