发表于: 2018-10-26 23:07:56

0 824


一、今天完成的事情

     实现了分享内容到微信联系人和朋友圈。

     微信提供的开发文档太简陋,踩了不少坑。

     首先添加依赖,二选一,前者包含统计功能

implementation 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'

implementation 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'

    然后是一堆权限,之前基本都给过了。

<uses-permission android:name="android.permission.INTERNET"/>

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

     初始化,这里的APP_ID需要到微信开放平台提前申请,通过审核后才能使用。

private static final String APP_ID = "APP_ID";
private IWXAPI mIWXAPI;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle saveInsatnceState) {
View square = inflater.inflate(R.layout.fragment_home, container, false);

   //注册到微信终端
   mIWXAPI = WXAPIFactory.createWXAPI(getContext(), APP_ID);
   mIWXAPI.registerApp(APP_ID);

   initView(square);
   return square;
}

    接下来就是根据官方文档写分享功能了,微信分享及收藏目前支持文字、图片、音乐、视频、网页共五种类型,先贴一个分享文本的官方文档,分享文本内容:

//初始化一个WXTextObject对象,填写分享的文本内容 
PTXTextObject textObj = new PTXTextObj ect (); 
textObj.text = text;
//WXTextObject对象初始化一个WXMediaMessage对象
WXMediaMessage msg = new WXMediaMessage(); 
msg.mediaObject = textObj; 
msg.description = text;
//构造一个Req
SendMessageToWX.Req req = new SendMessageToWX.Req(); 
req.transaction = buildTransaction(“Text”);
//transaction字段用于唯一标识_个请求 
req.message = msg;
Req.scene = isTimelineCb.isChecked() ?
SendMessageToWX.Req.WXSceneTimeline :
SendMessageToWX.Req.WXSceneSession;
//分享到朋友圈 Req.scene = SendMessageToWX.Req.WXSceneTimeline 
//分享到好友会话 Req.scene = SendlfessageToWX.Req.WXSceneTimeline
//调用api接口发送数据到微信

api.sendReq(req);

    注意这个buildTransaction(),这是一个自定义方法,没有集成在微信的SDK中,而且文档里并没有告诉我们这个方法到底干了什么,从网上找了半天才扒出来,

private String buildTransaction(final String type) {
    return (type == null) ? String.valueOf(System.currentTimeMillis())
          : type + System.currentTimeMillis();
}  

下面是可以正常运行的代码

public void shareText(String text) {
   //初始化WXTextObject对象,传入text
   WXTextObject textObj = new WXTextObject();
   textObj.text = text;

   //初始化WXMediaMessage对象
   WXMediaMessage msg = new WXMediaMessage();
   msg.mediaObject = textObj;
   msg.description = text;

   //唯一标识一个请求
   reqText.transaction = String.valueOf(System.currentTimeMillis());
   reqText.message = msg;
   //分享给微信联系人
   reqText.scene = SendMessageToWX.Req.WXSceneSession;
   //分享到微信朋友圈
   // reqText.scene = SendMessageToWX.Req.WXSceneTimeline;
   mIWXAPI.sendReq(reqText);
}

再来一个分享图片的官档:

Bitmap bmp = BitmapFactory .decodeReso\irce (getResources (), R.drawable.send_img);
//初始化 WXImageOb j ect 和WXMediaMessage 对象 
PTXImageObj ect imgObj = new PTXImageObj ect (birp);
WXMediaMessage msg = new WXMediaMessage(); 
msg.mediaObj ect = imgObj;
//设晋缩略图
Bitmap thxunbStip = Bitmap.createScaledBitmap(bmp, THUMB_SIZE, THUMB_SIZE, true);
bmp.recycle ();
msg.thxainbData = Util .bmpToByteArray (thxanbBmp, true);
//构造一个Req
SendMessageToPTX.Req req = new SendMessageToPTX.Req();
req.transaction = buildTransaction("img") ;
//transaction字段用
于唯一标识一个请求
req.message = msg;
req.scene = isTimelineCb.isChecked() ?
SendMessageToPTX.Req.WXSceneTimeline :
SendMessageToPTX.Req.WXSceneSession;
//调用api接口发送数据到微信
api.sendReq(req);

    还是一个不明方法,Util.bmoToByteArray(), 又是一顿找......找到了

public static byte[] bmpToByteArray(final Bitmap bmp, final boolean needRecycle) {
ByteArrayOutputStream output = new ByteArrayOutputStream();
   bmp.compress(Bitmap.CompressFormat.PNG, 100, output);
   if (needRecycle) {
      bmp.recycle();
   }
   byte[] result = output.toByteArray();
   try {
     output.close();
   } catch (Exception e) {
     e.printStackTrace();
   }
   return result;
}

    下面是可以正常运行的代码

public void shareImage(String imagePath) 
   Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
   //初始化WXTextObject对象,传入text
   WXImageObject imageObj = new WXImageObject(bitmap);
   //初始化WXMediaMessage对象
   WXMediaMessage msg = new WXMediaMessage();
   msg.mediaObject = imageObj;
   //设置缩略图
   Bitmap thumbBitmap = Bitmap.createScaledBitmap(bitmap, 120, 120, true);
   bitmap.recycle();
   msg.thumbData = bmpToByteArray(thumbBitmap, true);
   //唯一标识一个请求
   reqImage.transaction = String.valueOf(System.currentTimeMillis());
   reqImage.message = msg;
   //分享给微信联系人
   reqImage.scene = SendMessageToWX.Req.WXSceneSession;
   //分享到微信朋友圈
   //reqImage.scene = SendMessageToWX.Req.WXSceneTimeline;
   mIWXAPI.sendReq(reqImage);
}


大写的注意

    一定要签名打包再安装到手机或模拟器上运行,不能直接在AndroidStudio上Run‘app’,否则是无法跳转到微信实现分享的,因为在申请接口时候,需要填写应用签名,然后每次调用接口微信都会检查本地应用的签名和注册时填写的是否一致,如果不一致或者没有签名(比如直接将应用从AS推到手机上是没有签名的),页面会闪一下,但不会跳转。


二、明天计划的事情

     提交任务五


三、遇到的问题 

编译时会出现下面的报错,什么都不改,再编译一次就通过了

所有的活动和服务都在AndroidManifest中注册了,主活动的设置也没有问题

错误: 找不到符号

符号: 类 DownloadTestActivity
位置: 类 MainActivity


四、收获

      踩着坑完成了简单的微信享功能




返回列表 返回列表
评论

    分享到