分享到微信好友或朋友圈

这周末学习了如何将图片,文本,分享到微信好友或者是朋友圈,自己亲手敲了一把。结果一个bug让我很不爽。待会来谈谈bug是什么。

好了,写代码之前必须做这几件事情。在微信开发者网站上注册账号,填写app名称,包名,应用签名。第三个应用签名本以为自己随便写一个,其实不然,需要下载签名生成工具,然后安装到手机上(此为我的愚蠢Bug,后来看微信官网才解决了),还需要下载Android开发工具包,里面有个jar包需要导入到Android Studio中。注意,申请ok后会展示:

下面演示下Demo:

先来展示下布局效果吧:

再来看一下工程目录:

话说,展示效果也他妈太大了吧。

代码如下:

public class MainActivity extends Activity {
    private IWXAPI api;
    private CheckBox mCheckBox;
    private static final String App_ID = "wxbb5a317744264a34";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        api = WXAPIFactory.createWXAPI(this, App_ID);
        //注册ID
        api.registerApp(App_ID);
        mCheckBox = (CheckBox) findViewById(R.id.checkBox);
    }

    //启动微信客户端
    public void btn_open_weixin(View view) {
        //唯一标识符,采用text+当前时间{
        //开启微信
        api.openWXApp();
    }
//生成唯一标识符
    public String onlySign(final String text) {
        //当前时间+字符串
        return (text == null ? String.valueOf(System.currentTimeMillis()) : String.valueOf(text + System.currentTimeMillis()));

    }

    public void btn_send(View view) {
        //分享文本到好友或者朋友圈,如果checkbox未选中,则发送给好友,否则,发送到朋友圈。
        //创建EditText
        final EditText mEditText = new EditText(this);
        mEditText.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,
                RelativeLayout.LayoutParams.WRAP_CONTENT));
        mEditText.setText("默认的分享的文本");
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setIcon(R.mipmap.ic_launcher);
        builder.setTitle("分享");
        builder.setMessage("请输入要分享的文本");
        builder.setView(mEditText);
        builder.setPositiveButton("分享", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                //获取要分享的内容
                String text = mEditText.getText().toString();
                if (text == null || text.length() == 0) {
                    return;
                }
                //第一步:创建WXTextObject对象,用于封装text
                WXTextObject object = new WXTextObject();
                object.text = text;

                //第二步:拿到WXMediaMessage对象,用于客户端向微信发送数据
                WXMediaMessage msg = new WXMediaMessage();
                msg.mediaObject = object;
                msg.description = text;

                //第三步:拿到SendMessageToWX.Req对象,用于请求微信客户端
                SendMessageToWX.Req req = new SendMessageToWX.Req();
                req.message = msg;
                //生成唯一标识符
                req.transaction = onlySign("text");

                //建立场景,到底是发送给朋友还是朋友圈
                req.scene = mCheckBox.isChecked() ? SendMessageToWX.Req.WXSceneTimeline : SendMessageToWX.Req.WXSceneSession;
                //这次真的发送了

                Toast.makeText(MainActivity.this, String.valueOf(api.sendReq(req)), Toast.LENGTH_LONG).show();

            }
        });
        builder.setNegativeButton("取消", null);
        AlertDialog alertDialog = builder.create();
        alertDialog.show();

    }

    //将Bitmap装换成Byte数组,用来压缩图片
    private byte[] BmpToByteArray(final Bitmap bitmap, final boolean isRecycle) {
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream);
        if (isRecycle) {
            bitmap.recycle();
        }
        byte[] result = outputStream.toByteArray();
        try {
            outputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }

    //发送二进制图片
    public void btn_send_binary_image(View view) {
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.robot);
        WXImageObject object = new WXImageObject(bitmap);

        WXMediaMessage message = new WXMediaMessage();
        message.mediaObject = object;

        Bitmap thumbBmp = Bitmap.createScaledBitmap(bitmap, 80, 80, true);
        bitmap.recycle();

        message.thumbData = BmpToByteArray(thumbBmp, true);

        SendMessageToWX.Req req = new SendMessageToWX.Req();
        req.message = message;
        req.scene = mCheckBox.isChecked() ? SendMessageToWX.Req.WXSceneTimeline : SendMessageToWX.Req.WXSceneSession;
        req.transaction = onlySign("BinaryImage");

        Toast.makeText(MainActivity.this, String.valueOf(api.sendReq(req)), Toast.LENGTH_LONG).show();

    }

    public void btn_send_local_Image(View view) {
        String path = "/sdcard/1461370355308.jpeg";

        File file = new File(path);
        if (!file.exists()) {
            Toast.makeText(this, "图片不存在", Toast.LENGTH_LONG).show();
            return;
        }

        WXImageObject object = new WXImageObject();
        object.setImagePath(path);
        WXMediaMessage message = new WXMediaMessage();
        message.mediaObject = object;
        Bitmap bitmap = BitmapFactory.decodeFile(path);
        Bitmap thumbBmp = Bitmap.createScaledBitmap(bitmap, 80, 80, true);
        bitmap.recycle();

        message.thumbData = BmpToByteArray(thumbBmp, true);

        SendMessageToWX.Req req = new SendMessageToWX.Req();
        req.message = message;
        req.scene = mCheckBox.isChecked() ? SendMessageToWX.Req.WXSceneTimeline : SendMessageToWX.Req.WXSceneSession;
        req.transaction = onlySign("LocalImage");

        Toast.makeText(MainActivity.this, String.valueOf(api.sendReq(req)), Toast.LENGTH_LONG).show();

    }

    public void btn_send_Internet_image(View view) {
     Thread thread  = new Thread(new Runnable() {
         @Override
         public void run() {
             try {
                 String uri   = "http://img1.imgtn.bdimg.com/it/u=2468413383,2378712674&fm=21&gp=0.jpg";
                 WXImageObject object  = new WXImageObject();
                // object.imageUrl = uri;
                 object.setImagePath(uri);

                 WXMediaMessage message  = new WXMediaMessage();
                 message.mediaObject  =object;
                 Bitmap bitmap  =BitmapFactory.decodeStream(new URL(uri).openStream());
                 Bitmap thumbBmp  = Bitmap.createScaledBitmap(bitmap,80,80,true);
                 bitmap.recycle();

                 message.thumbData  = BmpToByteArray(thumbBmp,true);

                 SendMessageToWX.Req req =  new SendMessageToWX.Req();
                 req.message  = message;
                 req.scene = mCheckBox.isChecked()?SendMessageToWX.Req.WXSceneTimeline:SendMessageToWX.Req.WXSceneSession;
                 req.transaction =  onlySign("URLImage");

                 Toast.makeText(MainActivity.this,String.valueOf(api.sendReq(req)),Toast.LENGTH_LONG).show();
             }catch (Exception e)
             {
                 e.printStackTrace();
             }
         }

     });
thread.start();
    }
    public void btn_send_audio(View view){
        WXMusicObject object  =new WXMusicObject();
        object.musicUrl = "http://music.baidu.com/song/290008";

        WXMediaMessage msg  = new WXMediaMessage();
        msg.title="我只在乎你";
        msg.description="演唱者:邓丽君";
        msg.mediaObject = object;
        Bitmap thumbBit = BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher);
        msg.thumbData = BmpToByteArray(thumbBit,true);
        SendMessageToWX.Req req =  new SendMessageToWX.Req();
        req.message  = msg;
        req.scene = mCheckBox.isChecked()?SendMessageToWX.Req.WXSceneTimeline:SendMessageToWX.Req.WXSceneSession;
        req.transaction =  onlySign("URLAudio");

        Toast.makeText(MainActivity.this,String.valueOf(api.sendReq(req)),Toast.LENGTH_LONG).show();
    }
    public void btn_send_video(View view){
        WXVideoObject object = new WXVideoObject();
        object.videoUrl="http://open.163.com/movie/2016/4/C/K/MBJEDVIOI_MBJEE9UCK.html";
        WXMediaMessage msg  = new WXMediaMessage();
        msg.title="一切只需十分钟的专注";
        msg.description="TED";
        msg.mediaObject = object;
        Bitmap thumbBit = BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher);
        msg.thumbData = BmpToByteArray(thumbBit,true);
        SendMessageToWX.Req req =  new SendMessageToWX.Req();
        req.message  = msg;
        req.scene = mCheckBox.isChecked()?SendMessageToWX.Req.WXSceneTimeline:SendMessageToWX.Req.WXSceneSession;
        req.transaction =  onlySign("URLvideo");

        Toast.makeText(MainActivity.this,String.valueOf(api.sendReq(req)),Toast.LENGTH_LONG).show();
    }
    public void  btn_share_weburi(View view){
        WXWebpageObject object = new WXWebpageObject();
        object.webpageUrl ="http://open.163.com/ted/";
        WXMediaMessage msg  = new WXMediaMessage();
        msg.title="网易公开课";
        msg.description="TED";
        msg.mediaObject = object;

        Bitmap thumbBit = BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher);
        msg.thumbData = BmpToByteArray(thumbBit,true);
        SendMessageToWX.Req req =  new SendMessageToWX.Req();
        req.message  = msg;
        req.scene = mCheckBox.isChecked()?SendMessageToWX.Req.WXSceneTimeline:SendMessageToWX.Req.WXSceneSession;
        req.transaction =  onlySign("WEBuri");

        Toast.makeText(MainActivity.this,String.valueOf(api.sendReq(req)),Toast.LENGTH_LONG).show();
    }
}

这里代码比较多,但都是差不多的,就创建对象时几个sdk不太一样罢了。这里其实可以将相同代码封装在方法中。更有维护性与可阅读性。

最后,展示下一部分效果吧

对于初学者来说或许会有一点问题,比如api.sendReq(req)明明返回true,可是没有调起微信朋友圈,或者分享图片时同样掉不起来,那么这时需要查清楚包名,APPID,应用签名是否一致,缩略图大小不能超过32k。如果再有问题欢迎留言或者推荐看这套视频(李宁微信分享)[http://www.imooc.com/learn/455].

时间: 2025-01-09 08:19:04

分享到微信好友或朋友圈的相关文章

请问android使用友盟分享,分享到微信好友和朋友圈详细步骤是什么,我现在分享之后没结果。

============问题描述============ 请问android使用友盟分享,分享到微信好友和朋友圈详细步骤是什么,我现在分享之后没结果.弹出来图片大小超过32kb,然后分享中 就没反应了 ============解决方案1============ 引用 楼主 zpq19870824 的回复: 请问android使用友盟分享,分享到微信好友和朋友圈详细步骤是什么,我现在分享之后没结果.弹出来图片大小超过32kb,然后分享中 就没反应了 我也不知道,帮你顶一下吧...

h5网页在微信里打开 右上角分享到微信好友或者朋友圈

首先你需要一个分享接口地址,然后在自定义图片 标题 描述 如下: <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script> <script> $(function() { //微信分享 $.ajax({ "url":"https://***.***.com/getJsAPITicket", //接口地址 "type&qu

如何让你的网页链接潇洒地在微信好友和朋友圈中传播

嗨,大家好,我是大花猫! 想必大家都在自己的微信朋友圈看到过别人分享的一些网页链接消息,但是你注意了吗?有些链接的图标是用的微信一张蓝色的默认图片,但是有些链接的图标却有着各自专门的图标(注:公众号的图文消息不在本文讨论行列中.),而且标题也和链接里面网站的标题不一样!(想想前段时间那个风靡朋友圈的贱贱的神经猫吧!)好啦!今天要跟大家分享的就是如何让自己的网页在微信分享朋友圈中拥有一个自己个性的图标以及自定义分享中的描述文字.(开始想着加这个功能是在学习了慕课网的<2048私人定制>以后做了第

android 应用实现微信好友或朋友圈分享

官方的文档连接:https://open.weixin.qq.com/cgi-bin/frame?t=resource/res_main_tmpl&lang=zh_CN Java代码 private IWXAPI api; Java代码 // 微信注册初始化 api = WXAPIFactory.createWXAPI(this, "wx5ce2ffa100e3f587", true); api.registerApp("wx5ce2ffa100e3f587"

解决iOS app集成分享到QQ空间,微信好友,朋友圈等功能,苹果审核无法通过的问题

最近在提交应用到App Store时,因为App集成QQ登录,分享到QQ空间.微信等功能,而被拒,十分郁闷:百思之下,想到一个办法,可以解决此问题. 在将要显示分享平台列表时,根据判断当前设备是否安装了某款App,而进行动态调整,具体操作如下: 首先导入相关头文件 #import <TencentOpenAPI/TencentApiInterface.h> #import "WXApi.h" NSMutableArray *platforms = [[NSMutableAr

微信好友,朋友圈,QQ好友,QQ空间分享遇到的一些问题。

分享在APP中是非常普遍的一个功能,对于新手来说如果不熟练或不注意也是很容易出错的. 1,模拟器是不能进行微信QQ分享的,一定要用真机.新浪能用模拟器分享. 2,一定要保证分享的key值正确,一个APP有一个唯一的key. 3,当你把分享的sdk导入工程,代码,key都没问题,这时还需要再info.plist文件中设置URL type,LSApplicationQueriesSchemes.如图: 这就可以分享了.

微信网页版朋友圈在哪?怎么找不到

之前ytkah有介绍了微信网页版,确实方便了很多,直接浏览器就可以操作,不用安装其他程序.用过的朋友都在问微信网页版朋友圈在哪?现在我们一起来找找吧 如下图所示,左侧:第一行的右上角是菜单,分别是发起聊天.关闭桌面通知.关闭声音.意见反馈.退出:第二行是搜索框,可以搜索微信好友.公众号.聊天记录:第三行是微信聊天列表.公众号列表.通讯录列表:右侧:聊天窗口.公众号文章显示.通讯录显示 比较遗憾,微信网页版朋友圈这个功能确实找不到,也许微信团队原本就没打算把它加进去,本着极简的原则,让你提高效率,

怎么样在【微信会员】朋友圈中获得更多的赞?

微信已经是我们生活中必不可少的生活.交流平台.微信会员在朋友圈中的分享.倾诉更是我们心灵平台,在微信朋友圈中被点赞多的洋洋得意,获赞少的难免失意.怎么样才可以让自己在朋友圈中获得更多的关注和点赞?朋友圈吸赞方式一:自拍如果你是男神或女神,如果你360度自拍无死角,那么发自拍照就足以获得一片“赞”声.那些明恋或暗恋的粉丝就可以顺理成章地用点赞来求关注了.也许点赞还不够,再加一句评论“美爆了”.“帅哭了”来表达激动的心情.请注意,矮矬穷.颜值负分者,请自觉跳过这一招式.朋友圈吸赞方式二:炫富对于一般

java微信分享config:invalid signature,自定义右上角菜单(只保留分享给好友和朋友圈)

微信提供的API位置:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115&token=&lang=zh_CN 先照着文档复制: JSSDK使用步骤 步骤一:绑定域名 先登录微信公众平台进入"公众号设置"的"功能设置"里填写"JS接口安全域名". 备注:登录后可在"开发者中心"查看对应的接口权限. 说明:登录公共平台https