近段时间的学习碎片整理(24)

一、唤起QQ和微信分享

        1、QQ分享

                (1)如下为QQ分享工具类

public class QQShareManager {

    /**
     * 链接
     */
    public static final int QQ_SHARE_WAY_WEBPAGE = 3;
    /**
     * QQ
     */
    public static final int QQ_SHARE_TYPE_TALK = 1;
    /**
     * QQ空间
     */
    public static final int QQ_SHARE_TYPE_ZONE = 2;
    /**
     * 分享成功
     */
    public static final int CALLBACK_CODE_SUCCESS = 0;
    /**
     * 取消分享
     */
    public static final int CALLBACK_CODE_CANCEL = 1;
    /**
     * 拒绝访问
     */
    public static final int CALLBACK_CODE_DENY = 2;
    /**
     * 未知
     */
    public static final int CALLBACK_CODE_UNKNOWN = 3;

    /**
     * 图片
     */
    public static final int QQ_SHARE_IMAGE = 4;

    private static String appId;
    private Tencent mTencent;
    private QQShare qqShare;
    private QzoneShare qzoneShare;
    private QQShareResponse qqShareResponse;

    public void registShare(Context context){
        //初始化数据
        if(appId == null){
            appId = Const.QQ_APP_ID;
        }
        //初始化分享代码
        if(appId != null && (qqShare == null || qzoneShare == null)){
            mTencent = Tencent.createInstance(appId, context);
            qqShare = new QQShare(context, mTencent.getQQToken());
            qzoneShare = new QzoneShare(context, mTencent.getQQToken());
        }
    }

    /**
     * 分享qq和空间
     * @param shareContent 分享内容
     * @param shareType  选择类型(qq、空间)
     */
    public void shareByQQ(Activity activity, ShareContent shareContent, int shareType){
        shareWebPage(activity, shareType, shareContent);
    }

    public boolean isQQInstalled(Context context) {
        return mTencent.isQQInstalled(context);
    }

    private void shareWebPage(Activity activity, int shareType, ShareContent shareContent){
        Bundle params = new Bundle();
        if(shareType == QQ_SHARE_TYPE_ZONE){
            shareWebPageQzone(activity, shareContent, params);
        }else{
            shareWebPageQQ(activity, shareContent, params);
        }
    }

    public void shareImage(Activity activity, String path) {
        Bundle params = new Bundle();
        params.putString(QQShare.SHARE_TO_QQ_IMAGE_LOCAL_URL, path); //分享图片地址 最好做个限制大小
        params.putString(QQShare.SHARE_TO_QQ_APP_NAME, "Moon月球");// 应用名称
        params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_IMAGE);//分享类型  分享图片
        doShareToQQ(activity, params, iUiListener);
    }


    private void shareWebPageQQ(Activity activity, ShareContent shareContent, Bundle params) {
        params.putString(QQShare.SHARE_TO_QQ_TITLE, shareContent.getTitle());
        params.putString(QQShare.SHARE_TO_QQ_SUMMARY, shareContent.getContent());
        params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE,
                QQShare.SHARE_TO_QQ_TYPE_DEFAULT);
        params.putString(QQShare.SHARE_TO_QQ_TARGET_URL, shareContent.getURL());
        params.putString(QQShare.SHARE_TO_QQ_IMAGE_URL, shareContent.getPicUrl());

        doShareToQQ(activity, params, iUiListener);
    }

    private void shareWebPageQzone(Activity activity, ShareContent shareContent, Bundle params) {
        params.putString(QzoneShare.SHARE_TO_QQ_TITLE, shareContent.getTitle());
        params.putString(QzoneShare.SHARE_TO_QQ_SUMMARY, shareContent.getContent());
        params.putInt(QzoneShare.SHARE_TO_QZONE_KEY_TYPE,
                QzoneShare.SHARE_TO_QZONE_TYPE_IMAGE_TEXT);
        params.putString(QzoneShare.SHARE_TO_QQ_TARGET_URL, shareContent.getURL());
        ArrayList<String> imageUrls = new ArrayList<String>();
        imageUrls.add(shareContent.getPicUrl());
        params.putStringArrayList(QzoneShare.SHARE_TO_QQ_IMAGE_URL, imageUrls);
        //params.putString(QzoneShare.SHARE_TO_QQ_IMAGE_URL, shareContent.getPicUrl());

        doShareToQzone(activity, params, iUiListener);
    }

    private void doShareToQQ(final Activity activity, final Bundle params, final IUiListener iUiListener) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                if(qqShare != null){
                    qqShare.shareToQQ(activity, params, iUiListener);
                }
            }
        }).start();
    }

    private void doShareToQzone(final Activity activity, final Bundle params, final IUiListener iUiListener) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                if(qzoneShare != null){
                    qzoneShare.shareToQzone(activity, params, iUiListener);
                }
            }
        }).start();
    }

    private final IUiListener iUiListener = new IUiListener() {
        @Override
        public void onCancel() {
            sendRespCode(CALLBACK_CODE_CANCEL);
        }

        @Override
        public void onWarning(int i) {
        }

        @Override
        public void onComplete(Object response) {
            sendRespCode(CALLBACK_CODE_SUCCESS);
        }

        @Override
        public void onError(UiError e) {
            sendRespCode(CALLBACK_CODE_DENY);
        }

        private void sendRespCode(int code) {
            if(qqShareResponse != null){
                qqShareResponse.respCode(code);
            }
        }
    };

    public interface QQShareResponse{
        /**
         * 分享结果
         * @param code 结果码
         */
        public void respCode(int code);
    }

    /**
     * 注册结果回馈
     * @param qqShareResponse
     */
    public void setOnQQShareResponse(QQShareResponse qqShareResponse){
        this.qqShareResponse = qqShareResponse;
    }

}

                (2)使用,需要注意的是,在安卓10及以上时,其他App无法访问本App的缓存文件夹,所以分享的文件应该放在公共模块上。

  private val qqShareManager by lazy {
        QQShareManager()
    }
 override fun initData() {
        //使用前先初始化
        qqShareManager.registShare(this)

    }
    binding.tvShareQq.noFastClick {
            if (qqShareManager.isQQInstalled(this)) {
                if (savePath != "" && File(savePath).exists()) {
                    qqShareManager.shareImage(this, savePath)
                }else {
                    getSharePhotoWithPermissionCheck(SHARE_TYPE_QQ)
                }
            }else {
                toastByTry(getString(R.string.sorry_no_install_mobile_qq))
            }
        }

                2、微信分享

                        (1)微信分享工具类如下:

public class WeChatShareUtils {
    private static final int TIMELINE_SUPPORTED_VERSION = 0x27000D00;  // 判断微信版本是否为7.0.13及以上
    private static final String id = "xxxxx"; //小程序原始id
    private static final String pageUrl = "xxxx"; //兼容低版本的网页链接


    //IWXAPI是第三方app和微信通信的openapi接口
    private IWXAPI api;
    private Context context;
    public static WeChatShareUtils weChatShareUtils;

    public static WeChatShareUtils getInstance(Context context){
        if(weChatShareUtils ==null){
            weChatShareUtils = new WeChatShareUtils();
        }
        if(weChatShareUtils.api !=null){
            weChatShareUtils.api.unregisterApp();;
        }
        weChatShareUtils.context = context;
        weChatShareUtils.regToWx();
        return weChatShareUtils;
    }

    // todo 注册应用id到微信
    private void regToWx(){
        //通过WXAPIFactory工厂,获取IWXAPI的实例
        api = WXAPIFactory.createWXAPI(context, Const.WX_APP_ID,true);
        //将应用的appId注册到微信
        api.registerApp(Const.WX_APP_ID);
    }

    /**
     *todo 分享文字到朋友圈或者好友
     * @param text 文本内容
     * @param scene 分享方式:好友还是朋友圈
     * @return
     */
    public boolean shareText(String text,int scene){
        //初始化一个WXTextObject对象,填写分享的文本对象
        WXTextObject textObject = new WXTextObject();
        textObject.text = text;
        return share(textObject,text,scene);
    }

    /**
     * todo 分享图片到朋友圈或者好友
     * @param bmp  图片的Bitmap对象
     * @param scene 分享方式:好友 WXSceneSession 还是朋友圈 WXSceneTimeline,收藏 WXSceneFavorite
     * @return
     */
    public boolean sharePic(Bitmap bmp, int scene){
        //初始化一个WXImageObject对象
        WXImageObject imageObject = new WXImageObject(bmp);
        //设置缩略图
        Bitmap thump = Bitmap.createScaledBitmap(bmp,300,300,true);
        bmp.recycle();
        return share(imageObject,thump,scene);
    }

    /**
     * todo 分享网页到朋友圈或者好友,视频和音乐的分享和网页大同小异,只是创建的对象不同。
     * @param url 网页的url
     * @param title 显示分享网页的标题
     * @param thumb 图片的缩略图
     * @param description 对网页的描述
     * @param scene 分享方式:好友还是朋友圈
     * @return
     */
    public boolean shareUrl(String url, String title, Bitmap thumb, String description, int scene) {
        //初试话一个WXWebpageObject对象,填写url
        WXWebpageObject webPage = new WXWebpageObject();
        webPage.webpageUrl = url;
        //设置缩略图
        Bitmap tmb = Bitmap.createScaledBitmap(thumb,150,150,true);
        thumb.recycle();
        return share(webPage, title, tmb, description, scene);
    }

    /**
     * todo 分享小程序类型
     * @param url
     * @param title
     * @param thumb
     * @param description
     * @param scene 只支持分享给微信好友
     * @return
     */
    public boolean shareMiniProgram(String url, String title, Bitmap thumb, String description, int scene) {
        //初试话一个WXMiniProgramObject对象,填写url
        WXMiniProgramObject wxMiniProgramObject = new WXMiniProgramObject();
        wxMiniProgramObject.webpageUrl = pageUrl; //兼容低版本的网页链接
        wxMiniProgramObject.miniprogramType = WXMiniProgramObject.MINIPROGRAM_TYPE_TEST; //小程序类型,测试版
        wxMiniProgramObject.userName = id;  //小程序原始id
        wxMiniProgramObject.path = url; //小程序的path

        //设置缩略图
        Bitmap tmb = Bitmap.createScaledBitmap(thumb,300,300,true);
        thumb.recycle();
        return share(wxMiniProgramObject, title, tmb, description, scene);
    }


    private boolean share(WXMediaMessage.IMediaObject mediaObject, Bitmap thumb, int scene) {
        return share(mediaObject, null, thumb, null, scene);
    }

    private boolean share(WXMediaMessage.IMediaObject mediaObject, String description, int scene) {
        return share(mediaObject, null, null, description, scene);
    }

    private boolean share(WXMediaMessage.IMediaObject mediaObject,String title,Bitmap thumb,String description, int scene){
        WXMediaMessage msg = new WXMediaMessage(mediaObject);
        if(title !=null){
            msg.title = title;
        }
        if(description !=null){
            msg.description = description;
        }
        if(thumb !=null){
            msg.thumbData = bmpToByteArray(thumb, true);
        }
        //构造一个Req
        SendMessageToWX.Req req = new SendMessageToWX.Req();
        req.transaction = String.valueOf(System.currentTimeMillis());
        req.message = msg;
        req.scene = scene;
        return api.sendReq(req);
    }

    //判断是否支持转发到朋友圈
    //微信4.2以上支持,如果需要检查微信版本支持API的情况, 可调用IWXAPI的getWXAppSupportAPI方法,0x21020001及以上支持发送朋友圈
    //微信版本:当且仅当通过 IWXAPI.getWXAppSupportAPI() 接口获取到的值 >= 0x27000D00(7.0.13以上),才能支持FileProvider的方式进行分享。
    public boolean isSupportWX(){
        int wxSdkVersion = api.getWXAppSupportAPI();
        return wxSdkVersion >= TIMELINE_SUPPORTED_VERSION;
    }

    // todo Bitmap转换为 byte数组
    private static byte[] bmpToByteArray(final Bitmap bmp, final boolean needRecycle) {
        byte[] data = bmpToByteArray(bmp, 100);
        Timber.d(">>>", "zipBitmap: quality=100" + "   size=" + data.length);
        int i = 100;
        while (data.length > '耀') {             //请勿问我为啥用 '耀' 这个字,这问题问微信 SDK 开发者去,他就是这么判断的
            if (i > 10) {
                i = i - 10;
            } else {
                i = i - 1;
            }
            if (i <= 0) {
                Timber.e(">>>", "zipBitmap: 失败,很无奈清晰度已经降为0,但压缩的图像依然不符合微信的要求,最后size=" + data.length);
                break;
            }
            data = bmpToByteArray(bmp, i);
            Timber.d(">>>", "zipBitmap: quality=" + i + "   size=" + data.length);
        }
        if (needRecycle)
            bmp.recycle();
        return data;
    }

    public static byte[] bmpToByteArray(final Bitmap bmp, int quality) {
        int i;
        int j;
        if (bmp.getHeight() > bmp.getWidth()) {
            i = bmp.getWidth();
            j = bmp.getWidth();
        } else {
            i = bmp.getHeight();
            j = bmp.getHeight();
        }

        Bitmap localBitmap = Bitmap.createBitmap(i, j, Bitmap.Config.RGB_565);
        Canvas localCanvas = new Canvas(localBitmap);

        while (true) {
            localCanvas.drawBitmap(bmp, new Rect(0, 0, i, j), new Rect(0, 0, i, j), null);
            ByteArrayOutputStream localByteArrayOutputStream = new ByteArrayOutputStream();
            localBitmap.compress(Bitmap.CompressFormat.JPEG, quality,
                    localByteArrayOutputStream
            );
            localBitmap.recycle();
            byte[] arrayOfByte = localByteArrayOutputStream.toByteArray();
            try {
                localByteArrayOutputStream.close();
                return arrayOfByte;
            } catch (Exception e) {
                //F.out(e);
            }
            i = bmp.getHeight();
            j = bmp.getHeight();
        }
    }
}

                        (2)使用如下:

                                

 private val weChatShareUtil by lazy {
        WeChatShareUtils.getInstance(this)
    }
binding.tvShareWechat.noFastClick {
            if (weChatShareUtil.isSupportWX) {
                if (savePath != "" && File(savePath).exists()) {
                    val decodeFile = BitmapFactory.decodeFile(savePath)
                    weChatShareUtil.sharePic(decodeFile, SendMessageToWX.Req.WXSceneSession)
                }else {
                    getSharePhotoWithPermissionCheck(SHARE_TYPE_WECHAT)
                }

            }else {
                toastByTry("当前微信版本不支持微信分享")
            }
        }
        binding.tvShareWechatFriend.noFastClick {
            if (weChatShareUtil.isSupportWX) {
                if (savePath != "" && File(savePath).exists()) {
                    val decodeFile = BitmapFactory.decodeFile(savePath)
                    weChatShareUtil.sharePic(decodeFile, SendMessageToWX.Req.WXSceneTimeline)
                }else {
                    getSharePhotoWithPermissionCheck(SHARE_TYPE_WECHAT_FRIEND)
                }
            }else {
                toastByTry("当前微信版本不支持微信分享")
            }
        }

        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值