微信的分享文本,音频,视频,链接,表情,图片功能

转载自http://blog.csdn.net/u013064109/article/details/48215885  

这次主要讲解带你一步一步开发微信的分享文本,音频,视频,链接,表情,图片功能,以及给出一些关于网上朋友们提出的微信分享闪退,微信分享失败等问题的解决办法。

第一实现调用打开微信客户端:

首先到微信开放平台(https://open.weixin.qq.com )上注册一个账号,然后在上面创建一个Android应用,并填写好配置信息
在填写配置信息的时候应注意:
1 在填写应用签名时,需要到微信平台上去下载一个签名包(apk)(https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319167&token=f1f7a64c1e41365231e943cb0b11ffcc83700f4b&lang=zh_CN ),安装在手机上,然后在里面输入包名(例如:com.XXX.weichat,
注意此时的包名一定要和自己android项目包名一样)
然后就会生成一个字符串,这就是应用签名,然后提交,等待审核
2 如果审核过了的话那就我们应该可以获得appid,APPKEY
3 接下来我们就可以开发我们的Android程序
新建一个Android工程,然后我们工程目录下libs导入一个libammsdk.jar并且添加到path中去
4 代码实现:
 首先,定义一个字符串用于接收注册后获得的appid,然后再去定义一个IWXAPI 类型的API对象
 然后去创建这个对象,并把appid作为参数传入,再用定义好的API对象去注册微信,并传入参数appid
 注册完后。可以通过API对象去调用openWXApp()打开微信客户端
public static String App_Id="wx6c7d2f78e58ef49a";//这是APP_ID
 private Button btn;
 private IWXAPI api;//定义一个IWXAPI类型的API变量
 private CheckBox mShareFriends;
 private Button sendText;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  btn=(Button) findViewById(R.id.button1);
  sendText=(Button) findViewById(R.id.button2);
  mShareFriends=(CheckBox) findViewById(R.id.checkBox1);
  api=WXAPIFactory.createWXAPI(this, App_Id);//创建一个API
  api.registerApp(App_Id);//将App_id注册到微信中
  btn.setOnClickListener(this);
  sendText.setOnClickListener(this);
 }
 private String buliderTransaction(final String type){
  return (type==null)?String.valueOf(System.currentTimeMillis()):type+System.currentTimeMillis();
 }
 @Override
 public void onClick(View v) {
   switch (v.getId()) {
 case R.id.button1://打开微信客户端
  boolean flag=api.openWXApp();//通过api对象调用打开微信客户端,如果能打开就返回一个true,否则返回false;
  if (flag) {
   Toast.makeText(this, "微信打开成功", Toast.LENGTH_LONG).show();//注意:Toast控件对象不能再内部类事件监听方法使用,要把this改为MainActivity.this即可
  }else{
   Toast.makeText(this, "微信打开失败", Toast.LENGTH_LONG).show();
  }
 运行结果:

微信的分享文本,音频,视频,链接,表情,图片功能微信的分享文本,音频,视频,链接,表情,图片功能微信的分享文本,音频,视频,链接,表情,图片功能

第二实现分享文本:

case R.id.button2://分享文本
 
     //动态的创建一个EditText控件,用来分享文本内容
  final EditText editText=new EditText(this);
  //动态的创建一个线性布局,并且同时设置布局的高度和宽度
  editText.setLayoutParams(new LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT) );
  editText.setText("默认的分享文本");
  //用一个Dialog alert实现弹出一个EditText
  final AlertDialog.Builder builder=new AlertDialog.Builder(this);//动态创建一个UI控件用final修饰
  //设置弹出的Dialog的图标
  builder.setIcon(android.R.drawable.ic_dialog_info);
  builder.setTitle("分享文本");//设置标题
  //将EditText控件与对话框绑定
  builder.setView(editText);
  builder.setMessage("请输入分享的内容...");
  //在对话框再创建两个按钮一个确认发送,一个是去取消发送按钮
  builder.setPositiveButton("分享", new DialogInterface.OnClickListener() {
   
   @Override
   public void onClick(DialogInterface dialog, int which) {
   //首先获得EditText中的文本
   String text=editText.getText().toString();
    if (text==null||text.length()==0) {//如果文本为空直接结束方法
     return ;
    }
    //第一步:创建一个用于封装接收等待分享的文本的WXTextObject对象
    WXTextObject textObject=new WXTextObject();
    
    textObject.text=text;
    
    //第二步:创建WXMediaMessage对象,用于Android客户端向微信传输文本内容
    WXMediaMessage msg=new WXMediaMessage();
    msg.mediaObject=textObject;
    msg.description=text;//设置描述
    
    //第三步:创建一个用于请求的对象SendMessage用于与微信客户端进行交互
    SendMessageToWX.Req req=new SendMessageToWX.Req();
    req.message=msg;
    //设置唯一的标识
    req.transaction=buliderTransaction("text");//创建一个唯一标识
    //表示是发送给朋友还是朋友圈
    /*req.scene=SendMessageToWX.Req.WXSceneSession;//表示发送会话给朋友
    req.scene=SendMessageToWX.Req.WXSceneTimeline;//表示发送到朋友圈
*/       req.scene=(mShareFriends.isChecked())?SendMessageToWX.Req.WXSceneTimeline:SendMessageToWX.Req.WXSceneSession;
   //第四步:发送给客户端
   boolean sendState=api.sendReq(req);//发送成功返回true,否则返回false
   if(sendState){
    Toast.makeText(MainActivity.this, "分享内容成功", Toast.LENGTH_LONG).show();
   }else{
    Toast.makeText(MainActivity.this, "分享内容失败", Toast.LENGTH_LONG).show();
   }
   }
  });
  builder.setNegativeButton("取消", null);//创建取消按钮,点击事件为空,即退出
  //接着就是把AlertDialog创建出来,然后就是把它显示出来即可
  final AlertDialog alert=builder.create();
  alert.show();
  break;
 }

实现效果:

微信的分享文本,音频,视频,链接,表情,图片功能微信的分享文本,音频,视频,链接,表情,图片功能微信的分享文本,音频,视频,链接,表情,图片功能微信的分享文本,音频,视频,链接,表情,图片功能

微信的分享文本,音频,视频,链接,表情,图片功能微信的分享文本,音频,视频,链接,表情,图片功能微信的分享文本,音频,视频,链接,表情,图片功能

第三实现音乐分享:

 case R.id.music:
  {
   //第一步创建:WXmusicObject对象,用来指定音频的Url
   WXMusicObject musicObject=new WXMusicObject();
   musicObject.musicUrl="http://music.baidu.com/song/s/02071e66eed085438dcab?pst=sug";
   //第二步:创建WXMediaMessage对象
   WXMediaMessage msg=new WXMediaMessage();
   msg.mediaObject=musicObject;
   msg.title="Mikyou最爱之---是什么让我遇到这样的你";
   msg.description="演唱:白安";
   //第三指定缩略图:
   Bitmap thmuBitmap=BitmapFactory.decodeResource(getResources(), R.drawable.music);
   Bitmap thBitmap=Bitmap.createScaledBitmap(thmuBitmap, 150, 150, true);
   msg.thumbData=bmpByteArray(thBitmap, true);
   //设置发送对象
   SendMessageToWX.Req req=new SendMessageToWX.Req();
   req.transaction=buliderTransaction("music");
   req.message=msg;
   req.scene=(mShareFriends.isChecked())?SendMessageToWX.Req.WXSceneTimeline:SendMessageToWX.Req.WXSceneSession;
   //第六步:发送给客户端
   if (api.sendReq(req)) {//发送成功返回true,否则返回false
    Toast.makeText(MainActivity.this, "分享网络音乐成功", Toast.LENGTH_LONG).show();
   }else{
    Toast.makeText(MainActivity.this, "分享网络音乐失败", Toast.LENGTH_LONG).show();
   }
   finish();

实现结果:

微信的分享文本,音频,视频,链接,表情,图片功能

第四实现分享视频:

 case R.id.video:
  {
   //第一步创建:WXVideoObject对象,用来指定音频的Url
   WXVideoObject videoObject=new WXVideoObject();
   videoObject.videoUrl="http://v.youku.com/v_show/id_XODkyNjAyMzg4.html";
   //第二步:创建WXMediaMessage对象
   WXMediaMessage msg=new WXMediaMessage();
   msg.mediaObject=videoObject;
   msg.title="Mikyou最爱之---秦时明月之帝子降兮";
   msg.description="唯美中国风";
   //第三步指定缩略图:
   Bitmap thmuBitmap=BitmapFactory.decodeResource(getResources(), R.drawable.video);
   Bitmap thBitmap=Bitmap.createScaledBitmap(thmuBitmap, 120, 120, true);//注意:压缩的缩略图的尺寸有限制(视频的缩略图尺寸不能超过:120*120),否则后面的api.sendReq(req)会返回false
   msg.thumbData=bmpByteArray(thBitmap, true);
   //第四步设置SendMessage发送对象
   SendMessageToWX.Req req=new SendMessageToWX.Req();
   req.transaction=buliderTransaction("video");
   req.message=msg;
   req.scene=(mShareFriends.isChecked())?SendMessageToWX.Req.WXSceneTimeline:SendMessageToWX.Req.WXSceneSession;
   //第五步:发送给客户端
   if (api.sendReq(req)) {//发送成功返回true,否则返回false
    Toast.makeText(MainActivity.this, "分享网络视频成功", Toast.LENGTH_LONG).show();
   }else{
    Toast.makeText(MainActivity.this, "分享网络视频失败", Toast.LENGTH_LONG).show();
   }
   finish();

实现效果:

微信的分享文本,音频,视频,链接,表情,图片功能

第五实现链接分享:

 case R.id.URL://分享一个链接到朋友或者朋友圈
  {
  //创建一个WebPageObject对象,并传入相对应的URL,接收相应分享的资源
   String url="http://www.imooc.com/course/list";
   WXWebpageObject webpageObject=new WXWebpageObject();
   webpageObject.webpageUrl=url;
   //第二步:创建WXMediaMessage对象,封装WebPageObject对象,并且设置相应的参数信息
   WXMediaMessage msg=new WXMediaMessage(webpageObject);
      msg.title="慕课网";
      msg.description="Mikyou最喜欢的在线IT学习网站之---imooc";
      //第三步:创建一个缩略图
      Bitmap thmb=BitmapFactory.decodeResource(getResources(),R.drawable.imooc);
      Bitmap thmBitmap=Bitmap.createScaledBitmap(thmb, 120, 120, true);
       msg.thumbData=bmpByteArray(thmBitmap, true);             
      //第四步:创建一个SendMessage对象
       SendMessageToWX.Req req=new SendMessageToWX.Req();
       req.transaction=buliderTransaction("url");
       req.message=msg;
    req.scene=(mShareFriends.isChecked())?SendMessageToWX.Req.WXSceneTimeline:SendMessageToWX.Req.WXSceneSession;
    if (api.sendReq(req)) {//发送成功返回true,否则返回false
    Toast.makeText(MainActivity.this, "分享网络链接成功", Toast.LENGTH_LONG).show();
   }else{
    Toast.makeText(MainActivity.this, "分享网络链接失败", Toast.LENGTH_LONG).show();
   }
   finish();

实现效果:

微信的分享文本,音频,视频,链接,表情,图片功能

第六实现表情分享:

case R.id.emotion:
  {
   //第一个步创建一个WXEmojiObject对象,用于接收表情的对象
   String Emopath="storage/sdcard1/emotion.gif";
   File file =new File(Emopath);
   if(!file.exists()){//判断文件是否存在
    Toast.makeText(this, "该路径文件找不到", Toast.LENGTH_LONG).show();
    return ;
   }
   WXEmojiObject emojiObject =new WXEmojiObject();
   emojiObject.emojiPath=Emopath;
   //第二步:创建WXMediaMessage对象,封装emojiObject对象,并且设置相应的参数信息
   WXMediaMessage msg= new WXMediaMessage(emojiObject);
   msg.title="Mikyou最喜欢之--超可爱的蜡笔小新表情";
   msg.description="表情";
   //第三步创建一个缩略图
   Bitmap thuBitmap= BitmapFactory.decodeResource(getResources(), R.drawable.emotion);
   Bitmap thmBitmap=Bitmap.createScaledBitmap(thuBitmap, 100, 100, true);
   msg.thumbData=bmpByteArray(thmBitmap, true);
   //第四步创建一个发送信息的对象SendMessage
   SendMessageToWX.Req req=new SendMessageToWX.Req();
   req.transaction=buliderTransaction("emotion");
   req.message=msg;
   
   
   req.scene=(mShareFriends.isChecked())?SendMessageToWX.Req.WXSceneTimeline:SendMessageToWX.Req.WXSceneSession;
    if (api.sendReq(req)) {//发送成功返回true,否则返回false
    Toast.makeText(MainActivity.this, "分享表情成功", Toast.LENGTH_LONG).show();
   }else{
    Toast.makeText(MainActivity.this, "分享表情失败", Toast.LENGTH_LONG).show();
   }
   finish();

实现效果:

微信的分享文本,音频,视频,链接,表情,图片功能

第七实现图片分享:

1 二进制图片分享:

case R.id.binary:{//发送二进制格式图像
   //第一步:获得二进制图像对象bitmap
   Bitmap bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);//从资源中得到图像
   //第二步:创建一个WXImageObject对象,用来包装bitmap对象
   WXImageObject imageObject=new WXImageObject(bitmap);
   //第三步:创建对象WXMediaMessage对象,并包装这个对像imageObject
   WXMediaMessage msg=new WXMediaMessage();
   msg.mediaObject=imageObject;

   //第四步压缩图像
   Bitmap thBitmap=Bitmap.createScaledBitmap(bitmap, 120, 150, true);
   bitmap.recycle();//释放图像所占用的图片内存资源
   msg.thumbData=bmpByteArray(thBitmap, true);//设置缩略图
   //发送是缩略图,显示是原图
   //第五步 :创建SendMessageToWX.Req对象,用于发送数据
   SendMessageToWX.Req req=new SendMessageToWX.Req();
   //生成请求唯一标识
   req.transaction=buliderTransaction("img");
   req.message=msg;
   req.scene=(mShareFriends.isChecked())?SendMessageToWX.Req.WXSceneTimeline:SendMessageToWX.Req.WXSceneSession;
   //第六步:发送给客户端
   boolean sendState=api.sendReq(req);//发送成功返回true,否则返回false
   if(sendState){
    Toast.makeText(MainActivity.this, "分享二进制图像成功", Toast.LENGTH_LONG).show();
   }else{
    Toast.makeText(MainActivity.this, "分享二进制图像失败", Toast.LENGTH_LONG).show();
   }
   finish();

实现效果:

微信的分享文本,音频,视频,链接,表情,图片功能

2 本地图片分享:

case R.id.local:{//发送本地图片
   //第一步:判断图像文件是否存在
   String path="/storage/sdcard1/Shot.png";
   File file =new File(path);
   if(!file.exists()){//判断文件是否存在
    Toast.makeText(this, "该路径/storage/sdcard1/Shot.png文件找不到", Toast.LENGTH_LONG).show();
    return ;
   }
   //第二步:创建一个WXImageObject对象
   WXImageObject imageObject=new WXImageObject();
   //设置路径
   imageObject.setImagePath(path);
   //第三步:创建对象WXMediaMessage对象,并包装这个对像imageObject
   WXMediaMessage msg=new WXMediaMessage();
   msg.mediaObject=imageObject;
   //第四步压缩图像
   Bitmap bitmap=BitmapFactory.decodeFile(path);
   Bitmap thBitmap=Bitmap.createScaledBitmap(bitmap, 120, 150, true);
   bitmap.recycle();//释放图像所占用的图片内存资源
   msg.thumbData=bmpByteArray(thBitmap, true);//设置缩略图
   //发送是缩略图,显示是原图
   //第五步 :创建SendMessageToWX.Req对象,用于发送数据
   SendMessageToWX.Req req=new SendMessageToWX.Req();
   //生成请求唯一标识
   req.transaction=buliderTransaction("image");
   req.message=msg;
   req.scene=(mShareFriends.isChecked())?SendMessageToWX.Req.WXSceneTimeline:SendMessageToWX.Req.WXSceneSession;
   //第六步:发送给客户端
   boolean sendState=api.sendReq(req);//发送成功返回true,否则返回false
   if(sendState){
    Toast.makeText(MainActivity.this, "分享本地图像成功", Toast.LENGTH_LONG).show();
   }else{
    Toast.makeText(MainActivity.this, "分享本地图像失败", Toast.LENGTH_LONG).show();
   }
   finish();

实现效果:

微信的分享文本,音频,视频,链接,表情,图片功能

3 网络URL图片分享

 case R.id.url2:
  {
   //通过网络Url去获取图片资源,所以另外去开启一个线程
   Thread thread =new Thread(new Runnable() {//使用内部类实现对Runable接口的实现

    @Override
    public void run() {//重写run方法

     try {
      //http://v.youku.com/v_show/id_XODkyNjAyMzg4.html
      //第一步:创建一个WXImageObject对象,并设置Url
      String Url="http://img0.imgtn.bdimg.com/it/u=991241478,1609207842&fm=21&gp=0.jpg";

      WXImageObject imageObject=new WXImageObject();
      //设置Url
      imageObject.imageUrl=Url;
      //第三步:创建对象WXMediaMessage对象,并包装这个对像imageObject
      WXMediaMessage msg=new WXMediaMessage();
      msg.mediaObject=imageObject;
      //第四步压缩图像
      Bitmap bitmap=BitmapFactory.decodeStream(new URL(Url).openStream());//用网络流获取图片
      Bitmap thBitmap=Bitmap.createScaledBitmap(bitmap, 120, 150, true);
      bitmap.recycle();//释放图像所占用的图片内存资源
      msg.thumbData=bmpByteArray(thBitmap, true);//设置缩略图
      //发送是缩略图,显示是原图
      //第五步 :创建SendMessageToWX.Req对象,用于发送数据
      SendMessageToWX.Req req=new SendMessageToWX.Req();
      //生成请求唯一标识
      req.transaction=buliderTransaction("image");
      req.message=msg;
      req.scene=(mShareFriends.isChecked())?SendMessageToWX.Req.WXSceneTimeline:SendMessageToWX.Req.WXSceneSession;
      //第六步:发送给客户端
      if (api.sendReq(req)) {//发送成功返回true,否则返回false
       Toast.makeText(MainActivity.this, "分享网络图片成功", Toast.LENGTH_LONG).show();
      }else{
       Toast.makeText(MainActivity.this, "分享网络图片失败", Toast.LENGTH_LONG).show();
      }
      finish();

实现效果:

微信的分享文本,音频,视频,链接,表情,图片功能

那么这些都是发送到朋友的效果,最后附上2张分享到朋友圈的:

微信的分享文本,音频,视频,链接,表情,图片功能微信的分享文本,音频,视频,链接,表情,图片功能

最后就是讲解在微信分享中遇到的闪退,分享失败的问题解决方法:

//总结:在实现微信分享这个接口的功能时遇到的需要注意几点:
1 开始时api.SendReq(req)返回的是true,而且微信可以打开,并且闪退回来
原因:可能是签名的不正确,
解决办法:先在微信开放平台下下载签名工具,然后把相应的包名输入进去生成一个新的应用签名,然后把这个应用签名粘贴到微信开发平台
应用设置信息的地方的把原来的覆盖掉就有用了
2 还有就是有时候会出现分享失败也就是api.SendReq(req)返回的是false,为什么是false;
原因:这是因为微信分享接口开发有一定的规定,就是在设置缩略图时候,规定了缩略图的尺寸大小,超过规定的尺寸就会分享失败
解决办法:很简单就是 把相应的尺寸大小设置在规定的范围内:Bitmap thBitmap=Bitmap.createScaledBitmap(thmuBitmap, 120, 120, true);//注意:压缩的缩略图的尺寸有限制(分享视频的缩略图尺寸不能超过:120*120),否则后面的api.sendReq(req)会返回false
分享音乐的缩略图尺寸大小在150*150大小范围内
具体的尺寸大小可以参见分享SDK相关文档规范
3 最后就是总结一下实现微信分享接口关键性的几步,无论是文本分享,音乐分享,视频分享,链接分享,表情分享都是大同小异,主要都是
那关键性的几步:
本例就以音乐url分享为例详解:
第一步:创建:WXmusicObject对象,并指定相应参数的音频的Url;该对象用来接收音乐资源的。
(注意:如果是文本就是用WXTextObject,图片WXImageObject,视频WXVideoObject,链接WXWebpageObject,表情 WXEmojiObject来接收)
WXMusicObject musicObject=new WXMusicObject();
musicObject.musicUrl="http://music.baidu.com/song/s/02071e66eed085438dcab?pst=sug";
第二步:接着就是将第一步中的接收到音乐资源的对象进一步封装成WXMediaMessage类的对象,并设置相应的信息和设置相应的缩略图
WXMediaMessage msg=new WXMediaMessage();
   msg.mediaObject=musicObject;//封装对象
   msg.title="Mikyou最爱之---是什么让我遇到这样的你";//设置分享内容的标题
   msg.description="演唱:白安";//设置分享的描述
第三步:设置缩略图:
Bitmap thmuBitmap=BitmapFactory.decodeResource(getResources(), R.drawable.music);//指定缩略图原图的来源
   Bitmap thBitmap=Bitmap.createScaledBitmap(thmuBitmap, 150, 150, true);//开始压缩,并接收压缩后的图片对象,
   msg.thumbData=bmpByteArray(thBitmap, true);//将压缩后图片对象,转换成二进制对象,并设置msg的thumbData
/**************************将图片转换成二进制对象的方法*****************************/
 private byte[] bmpByteArray(final Bitmap bitmap,final boolean needRecycle) {
  ByteArrayOutputStream output=new ByteArrayOutputStream();//定义一个字节数组输出流对象,用于接收转换后二进制的结果
  bitmap.compress(Bitmap.CompressFormat.PNG, 100,output);//把二进制的结果放在output对象中
  if (needRecycle) {
   bitmap.recycle();//释放图片资源的内存
  }
  byte [] result=output.toByteArray();//把output对象转化成实际的数组
  try {
   output.close();
  } catch (IOException e) {

   e.printStackTrace();
  }
  return result;
 }
第四步:创建一个SendMessageToWX对象去发送第二步接收到的WXMediaMessage类的对象msg
 SendMessageToWX.Req req=new SendMessageToWX.Req();//创建一个发送请求的对象
   req.transaction=buliderTransaction("music");//设置唯一标识,注意这是必须的否则会出错
   req.message=msg;//、
   //以下这步主要设置是否发送到朋友圈默认就是发送到朋友(SendMessageToWX.Req.WXSceneTimeline(发送到朋友圈),SendMessageToWX.Req.WXSceneSession(发送到朋友))
   req.scene=(mShareFriends.isChecked())?SendMessageToWX.Req.WXSceneTimeline:SendMessageToWX.Req.WXSceneSession;
   if (api.sendReq(req)) {//发送成功返回true,否则返回false
    Toast.makeText(MainActivity.this, "分享网络音乐成功", Toast.LENGTH_LONG).show();
   }else{
    Toast.makeText(MainActivity.this, "分享网络音乐失败", Toast.LENGTH_LONG).show();
   }
   finish();
到这里整个分享音乐的结果就成功了,然而其他分享很类似,就这么简单,但是需要注意的细节问题还真不少呢

/************************设置唯一标识的方法******************************************/
private String buliderTransaction(final String type){
  return (type==null)?String.valueOf(System.currentTimeMillis()):type+System.currentTimeMillis();
 }

到这里所有的的内容都结束,这是微信的分享,本人想继续研究关于QQ,QQ空间,新浪微博分享,以后继续更新,有什么问题请留言