在帮别的项目干活时遇到了要做微信分享的功能,当时觉得这不就是小case(因为之前都写过),可能是由于那边项目的人不太懂吧,居然没有提前去申请微信app_id,没关系,反正写过,打开之前的项目,复制粘贴,他们申请好了肯定就能用了,先看看我是怎么写的。
1、添加最新的微信分享sdk:
compile'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
2、微信初始化,你可以在Application 里面写,也可以在分享的activity的onCreat方法里面写:
public IWXAPI api; //这个对象是用来向微信发送数据的一个接口,所有的信息发送都是基于这个对象的
public void registerWeChat(Context context) { //向微信注册app
api = WXAPIFactory.createWXAPI(context, APP_ID, true);
api.registerApp(APP_ID);
}
3、就是你写你分享的ui了,具体就不粘贴代码了,下面看一下微信分享的方法,下面以网页分享为例子:
/**
*微信分享
*/
private void wechatShare(int flag,String title,String content,String url) {
WXWebpageObject webpage = new WXWebpageObject();
webpage.webpageUrl = url;//分享的url
WXMediaMessage msg = new WXMediaMessage(webpage);
msg.title=title;//分享的标题
msg.description=content;//分享描述
//这里替换一张自己工程里的图片资源
Bitmapthumb=BitmapFactory.decodeResource(getResources(),R.mipmap.icon_share);
msg.setThumbImage(thumb);
SendMessageToWX.Reqreq=newSendMessageToWX.Req();
req.transaction= buildTransaction("webpage");
req.message=msg;
req.scene=
flag==0?SendMessageToWX.Req.WXSceneSession:SendMessageToWX.Req.WXSceneTimeline;
mIWXAPI.sendReq(req);
}
privateStringbuildTransaction(finalStringtype) {
return(type==null) ?String.valueOf(System.currentTimeMillis())
:type+System.currentTimeMillis();
}
4、最后别忘记了微信分享的回调,一定要在wxapi包下面建一个Activity名字叫WXEntryActivity(固定)
public class WXEntryActivity extends AppCompatActivity implements IWXAPIEventHandler{
private static final String TAG = "WXEntryActivity";
private IWXAPI api;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
api = WXAPIFactory.createWXAPI(this,Constant.WX_APP_ID,false);
//api.registerApp(Constant.WX_APP_ID);
api.handleIntent(getIntent(),this);
}
@Override
protected voidonNewIntent(Intentintent) {
super.onNewIntent(intent);
setIntent(intent);
api.handleIntent(intent,this);
}
@Override
public voidonReq(BaseReq baseReq) {
Log.d(TAG,"we chat in");
}
@Override
public voidonResp(BaseResp baseResp) {
switch(baseResp.errCode) {
case BaseResp.ErrCode.ERR_OK:
//分享成功
Toast.makeText(WXEntryActivity.this,R.string.share_success,Toast.LENGTH_SHORT).show();
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
//分享取消
Toast.makeText(WXEntryActivity.this,R.string.share_cancel,Toast.LENGTH_SHORT).show();
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED:
Toast.makeText(WXEntryActivity.this,R.string.share_denied,Toast.LENGTH_SHORT).show();
break;
case BaseResp.ErrCode.ERR_SENT_FAILED:
Toast.makeText(WXEntryActivity.this,R.string.share_send_failed,Toast.LENGTH_SHORT).show();
break;
case BaseResp.ErrCode.ERR_UNSUPPORT:
Toast.makeText(WXEntryActivity.this,R.string.share_unsupport_error,Toast.LENGTH_SHORT)
.show();
break;
default:
Toast.makeText(WXEntryActivity.this,R.string.share_failed,Toast.LENGTH_SHORT).show();
break;
}
finish();
}
}
5、最后别忘记了在AndroidMainfest.xml里面注册:
<activity
android:name="WXEntryActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar"/>
写完手工,过两天他们告诉我appId申请下来了,填写进去,没问题,一切OK,我果然还是很厉害的,但是事情还没有结束,过了大概一个月他们突然告诉我微信分享不能用了。具体情况是朋友圈可以分享,微信好友分享的时候拉起好友列表以后发现好友列表点击无效。这时候我就不信了,不可能吧,要坏一起坏,要好一起好啊,坏一般啥意思,我代码又没动过,想不明白,这时候我开启了百度之旅。
还真找到了几个同样的问题:
友盟分享,点击微信分享,可以进入微信,也有微信好友,点击要分享的好友,不能成功,混淆什么都加了,不知道什么原因
这个问题困扰了我好久,微信和app都卸载了好几遍,但是一到微信好友界面就是点击后不能跳出弹框,朋友圈直接不能点开!!
最先感觉好像这个靠谱http://bbs.umeng.com/thread-13230-2-1.html是友盟官方论坛,说是没有混淆好,我就千辛万苦混淆了,可是。。。。。不行!!问题依然存在。
接下来我终于找到了解决方法,连接在此:http://bbs.umeng.com/thread-26260-1-1.html:
仔细看了好久,这是3月多的公告啊,我也没用精简版啊,不对不对,接着找。
这个就很像了和我的问题一模一样嘛,赶紧去加混淆,等等,不对,我就没开启混淆加什么加。
就这样困扰了一天,直到晚上睡觉前突然想到,代码我没动,应该没问题,微信那么吊,应该也不会有问题,是不是接口的锅,先到这里赶紧打开电脑 把所有分享信息写死,果然,成功了。
接着开始分析是哪里的问题吧仔细看看看分享的参数:
webpage.webpageUrl=url;
WXMediaMessagemsg=newWXMediaMessage(webpage);
msg.title=title;
msg.description=content;
//这里替换一张自己工程里的图片资源
Bitmapthumb=BitmapFactory.decodeResource(getResources(),R.mipmap.icon_share);
msg.setThumbImage(thumb);
SendMessageToWX.Reqreq=newSendMessageToWX.Req();
req.transaction= buildTransaction("webpage");
req.message=msg;
最终发现接口返回的title是空的,长见识了,原来title为空会导致这样的问题,在此记录一下,以后一定要谨记。