关于Android实现微信分享的过程和思考
时下微信大热,市面上不少App都接入了微信的API,笔者也赶了这个潮流,尝试调用微信的API来实现分享功能。
在正式开发之前,读者需要到微信开放平台注册一个开发者帐号,创建并审核通过一个应用
读者需要确保你的应用已获得“发送给朋友”和”分享到朋友圈“的权限
此外,读者还需要下载libammsdk.jar。
由于笔者使用的IDE是Android Studio,而目前不少开发者使用的IDE是Eclipse,所以顺带提下把jar包导入Android Studio的方法:在磁盘文件夹中导入libammsdk.jar
然后在Android Studio中添加依赖即可
准备工作做好后,就可以开始开发了。
首先创建一个Android项目,值得注意的是,应用程序的包名应和微信开放平台的包名保持一致,否则无法调用微信的API,此处笔者使用的包名是com.qslx.www
然后开始编写代码:
1、数据域部分:
//应用程序的ID应与微信开放平台保持一致
public static final String APP_ID="wx7c440e16f88aa515";
private IWXAPI api; //第三方app与微信通信的openapi接口
2、在onCreate()中调用:
api= WXAPIFactory.createWXAPI(this,APP_ID); //初始化api
api.registerApp(APP_ID); //将APP_ID注册到微信中
3、启动微信客户端:
api.openWXApp();
4、发送文本:
//创建一个用于封装待分享文本的WXTextObject对象
WXTextObject textObject =newWXTextObject();
textObject.text= text; //text为String类型
//创建WXMediaMessage对象,该对象用于Android客户端向微信发送数据
WXMediaMessage msg =newWXMediaMessage();
msg.mediaObject= textObject;
msg.description= text;//text为String类型,设置描述,可省略
5、发送二进制图像:
//获取二进制图形的Bitmap对象
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.book);
//创建WXImageObject对象,并包装bitmap
WXImageObject imgObj =newWXImageObject(bitmap);
//创建WXMediaMessage对象,并包装创建WXImageObject对象
WXMediaMessage msg =newWXMediaMessage();
msg.mediaObject= imgObj;
//压缩图像
Bitmap thumbBmp = Bitmap.createScaledBitmap(bitmap,120,150, true);
bitmap.recycle();//释放图像所占用的内存资源
msg.thumbData= bmpToByteArray(thumbBmp, true);//设置缩略图
6、发送本地图像:
//判断图像文件是否存在
String path ="/sdcard/book.png";
File file =newFile(path);
if(!file.exists()) {
Toast.makeText(this,"/sdcard/book.png不存在!",Toast.LENGTH_LONG).show();
return;
}
//创建WXImageObject对象,并设置文件路径
WXImageObject imgObj =newWXImageObject();
//设置图像文件的路径
imgObj.setImagePath(path);
//创建WXMediaMessage对象,并包装创建WXImageObject对象
WXMediaMessage msg =newWXMediaMessage();
msg.mediaObject= imgObj;
//压缩图像
Bitmap bitmap = BitmapFactory.decodeFile(path);
Bitmap thumbBmp = Bitmap.createScaledBitmap(bitmap,120,150, true);
bitmap.recycle();//释放图像所占用的内存资源
msg.thumbData= bmpToByteArray(thumbBmp, true);//设置缩略图
7、发送Url图像:
//注意此方法必须在一个新的线程中调用,不能直接在UI线程中调用
String url ="http://h.hiphotos.baidu.com/image/pic/item/6c224f4a20a446239e8d311c9b22720e0cf3d70d.jpg";
WXImageObject imgObj =newWXImageObject();
imgObj.imageUrl= url;//设置图像的Url;
//创建WXMediaMessage对象,并包装创建WXImageObject对象
WXMediaMessage msg =newWXMediaMessage();
msg.mediaObject= imgObj;
//压缩图像
//此方法可以自动下载url图像
Bitmap bitmap = BitmapFactory.decodeStream(newURL(url).openStream());
Bitmap thumbBmp = Bitmap.createScaledBitmap(bitmap,120,150, true);
bitmap.recycle();//释放图像所占用的内存资源
msg.thumbData= bmpToByteArray(thumbBmp, true);//设置缩略图
8、发送Url音频
//创建WXMusicObject对象,用来指定音频Url
WXMusicObject music =newWXMusicObject();
music.musicUrl="http://music.baidu.com/song/11111110";
//创建WXMediaMessage对象
WXMediaMessage msg =newWXMediaMessage();
msg.mediaObject= music;
msg.title="aaa";
msg.description="bbb";
//设置缩略图
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.music);
Bitmap thumbBmp = Bitmap.createScaledBitmap(bitmap,120,150, true);
msg.thumbData= bmpToByteArray(thumbBmp, true);
9、发送Url视频
//创建WXVideoObject对象,用于指定视频Url
WXVideoObject video =newWXVideoObject();
video.videoUrl="http://v.youku.com/v_show/id_aaaaaaa.html";
//创建WXMediaMessage对象
WXMediaMessage msg =newWXMediaMessage();
msg.mediaObject= video;
msg.title="aaa";
msg.description="bbb";
//设置缩略图
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.video);
Bitmap thumbBmp = Bitmap.createScaledBitmap(bitmap,120,150, true);
msg.thumbData= bmpToByteArray(thumbBmp, true);
10、发送URL链接
//创建一个WXWebPageObject对象,用于封装要发送的Url
WXWebpageObject webpage =newWXWebpageObject();
webpage.webpageUrl="http://www.qslx.com/";
//创建一个WXMediaMessage对象
WXMediaMessage msg =newWXMediaMessage(webpage);
msg.title="qslx";
msg.description="qslx";
//3、设置缩略图
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.url);
Bitmap thumbBmp = Bitmap.createScaledBitmap(bitmap,120,150, true);
msg.thumbData= bmpToByteArray(thumbBmp, true);
11、发送表情
//创建一个WXEmojiObject对象,用于封装表情文件的路径
String EMOJI_FILE_PATH ="/sdcard/emotion.gif";
File file =newFile(EMOJI_FILE_PATH);
if(!file.exists()) {
Toast.makeText(this,"/sdcard/emotion.gif不存在!",Toast.LENGTH_LONG).show();
return;
}
WXEmojiObject emoji =newWXEmojiObject();
emoji.emojiPath= EMOJI_FILE_PATH;
//创建一个WXMediaMessage对象
WXMediaMessage msg =newWXMediaMessage(emoji);
msg.title="表情标题";
msg.description="表情描述";
//设置缩略图
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.music);
Bitmap thumbBmp = Bitmap.createScaledBitmap(bitmap,120,150, true);
msg.thumbData= bmpToByteArray(thumbBmp, true);
//在此提供设置缩略图的方法,将bitmap转换成byte格式的数组
private byte[]bmpToByteArray(finalBitmap bitmap, final booleanneedRecycle) {
ByteArrayOutputStream output =newByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG,100,output);
if(needRecycle) bitmap.recycle();
byte[] result = output.toByteArray();
try{
output.close();
}catch(Exception e) {
e.printStackTrace();
}
returnresult;
}
收尾部分:
//创建一个用于请求微信客户端的SendMessageToWX对象
SendMessageToWX.Req req =newSendMessageToWX.Req();
req.message= msg;
//transaction字段用于唯一标识一个请求,这个必须有,否则会出错
//type为String类型,作为区分类型的标志
req.transaction= type+ System.currentTimeMillis();
设置场景:
//表示发送给朋友圈
req.scene= SendMessageToWX.Req.WXSceneTimeline:
//表示发送给朋友
req.scene=SendMessageToWX.Req.WXSceneSession;
//发送给微信客户端
api.sendReq(req);
在开发过程中,可能需要用到本地图片,在此提供向SD卡中写入图片的方法:
//将图片写入SD卡
public voidputBmpInSD(String bmpName, intbmpSourceID) {
String path ="";
File file =null;
//判断外部存储卡是否存在
if(Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
//得到外部存储卡的路径
path = Environment.getExternalStorageDirectory().toString();
file =newFile(path,bmpName);
}
//如bmpName="book.png"
//如bmpSourceID = R.drawable.book;
//从资源文件中选择一张图片作为将要写入的源文件
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),bmpSourceID);
try{
FileOutputStream out =newFileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.PNG,100,out);
out.flush();
out.close();
}catch(Exception e) {
e.printStackTrace();
}
}
值得注意的问题:
【1】一定要注意压缩图片,不然会功能失效,api.sendReq(req)会返回false。所以总是调用Bitmap thumbBmp = Bitmap.createScaledBitmap(bitmap,120,150, true);来压缩图像。
【2】发送Url形式的图像,要确保该图片网址一定要在手机端能打开(有可能出现电脑端能打开而手机端不能打开的情况)
【3】点击分享时闪退的原因:签名不一致。
解决方法如下:
1、把MD5获取工具.apk安装到测试手机。
2、通过打包APK或直接通过IDE运行,安装应用到手机。
3、打开MD5获取工具,输入应用包名,获取应用签名。
4、把微信开放平台对应的应用签名改成上述获取的签名。
5、再次安装应用。
笔者在开发过程中遗留不能解决的问题:
1、Url图像分享到朋友圈时,图像不显示
2、表情分享到朋友圈时,会闪退
如读者有解决笔者问题的好建议或好方法,有劳留言解答,笔者将万分感谢!
如读者有微信分享开发过程中遇到问题和疑难,也欢迎留言,笔者将努力解答!