Android 实现微信,微博,微信朋友圈,QQ分享的功能

Android 实现微信,微博,微信朋友圈,QQ分享的功能

一、去各自所在的开发者平台注册相应的Key值;引入相关jar包、权限等

二、ShareUtil工具类

import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;

import com.sina.weibo.sdk.api.ImageObject;
import com.sina.weibo.sdk.api.TextObject;
import com.sina.weibo.sdk.api.WeiboMultiMessage;
import com.sina.weibo.sdk.api.share.IWeiboShareAPI;
import com.sina.weibo.sdk.api.share.SendMultiMessageToWeiboRequest;
import com.sina.weibo.sdk.api.share.WeiboShareSDK;
import com.sina.weibo.sdk.auth.AuthInfo;
import com.sina.weibo.sdk.auth.Oauth2AccessToken;
import com.sina.weibo.sdk.auth.WeiboAuthListener;
import com.sina.weibo.sdk.exception.WeiboException;
import com.tencent.connect.share.QQShare;
import com.tencent.mm.sdk.modelmsg.SendMessageToWX;
import com.tencent.mm.sdk.modelmsg.WXMediaMessage;
import com.tencent.mm.sdk.modelmsg.WXWebpageObject;
import com.tencent.mm.sdk.openapi.IWXAPI;
import com.tencent.mm.sdk.openapi.WXAPIFactory;
import com.tencent.tauth.IUiListener;
import com.tencent.tauth.Tencent;

import java.util.List;

import cn.hnshangyu.maker.R;
import cn.hnshangyu.maker.weibo.AccessTokenKeeper;
import cn.hnshangyu.maker.weibo.Constants;

/**
 * ============================================
 * 文件名:ShareUtil.java
 * 日期:2016-08-17 14:58
 * 描述:分享帮助类
 * 版本:1.0
 *
 * ============================================
 */
public class ShareUtil {
  /**
   * 微博微博分享接口实例
   */
  public static IWeiboShareAPI mWeiboShareAPI;
  //微信分享
  public static final String WEIXIN_SHARE_APP_ID = "wx0c********88488d";
  public static IWXAPI weixin_api;

  public static final String QQ_APP_ID = "11****5659";
  public static Tencent mTencent;

  public static void shareQQ(Activity activity, String sharePath, IUiListener listener) {
    //qq分享
    mTencent = Tencent.createInstance(QQ_APP_ID, activity);
    if (isQQClientAvailable(activity)) {

//      String content = activity.getResources().getString(R.string.ivQrcode_content);

      final Bundle params = new Bundle();
      params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_DEFAULT);
      params.putString(QQShare.SHARE_TO_QQ_TITLE, "######");
      params.putString(QQShare.SHARE_TO_QQ_SUMMARY, "#############...");
      params.putString(QQShare.SHARE_TO_QQ_TARGET_URL, sharePath);
//      params.putString(QQShare.SHARE_TO_QQ_IMAGE_URL, "https://www.baidu.com/img/bd_logo1.png");

      mTencent.shareToQQ(activity, params, listener);
    } else {
      UIUtils.showToast(activity, "请检查是否安装最新版QQ!");
    }
  }

  /**
   * 判断qq是否可用
   *
   * @param context
   * @return
   */
  private static boolean isQQClientAvailable(Context context) {
    final PackageManager packageManager = context.getPackageManager();
    List<PackageInfo> pinfo = packageManager.getInstalledPackages(0);
    if (pinfo != null) {
      for (int i = 0; i < pinfo.size(); i++) {
        String pn = pinfo.get(i).packageName;
        if (pn.equals("com.tencent.mobileqq")) {
          return true;
        }
      }
    }
    //**如果返回false qq的轻聊版也会显示安装新版本,true他会自动下载新版本
    return true;
  }

  public static void shareWeiBo(final Activity activity, String sharePath) {
    //微博
    mWeiboShareAPI = WeiboShareSDK.createWeiboAPI(activity, Constants.APP_KEY);

    // 1. 初始化微博的分享消息
    WeiboMultiMessage weiboMessage = new WeiboMultiMessage();
    weiboMessage.mediaObject = getImageObj(activity);
    weiboMessage.textObject = getTextObj(activity, sharePath);

    SendMultiMessageToWeiboRequest request = new SendMultiMessageToWeiboRequest();
    // 用transaction唯一标识一个请求
    request.transaction = String.valueOf(System.currentTimeMillis());
    request.multiMessage = weiboMessage;

    if (mWeiboShareAPI.isWeiboAppInstalled() && mWeiboShareAPI.isWeiboAppSupportAPI()) {
      mWeiboShareAPI.registerApp();  // 将应用注册到微博客户端

      // 3. 发送请求消息到微博,唤起微博分享界面
      mWeiboShareAPI.sendRequest(activity, request);
    } else {
      AuthInfo mAuthInfo = new AuthInfo(activity, Constants.APP_KEY, Constants.REDIRECT_URL, Constants.SCOPE);

      Oauth2AccessToken accessToken = AccessTokenKeeper.readAccessToken(activity);
      String token = "";
      if (accessToken != null) {
        token = accessToken.getToken();
      }
      mWeiboShareAPI.sendRequest(activity, request, mAuthInfo, token, new WeiboAuthListener() {
        @Override
        public void onComplete(Bundle bundle) {
          Oauth2AccessToken newToken = Oauth2AccessToken.parseAccessToken(bundle);
          AccessTokenKeeper.writeAccessToken(activity, newToken);

          UIUtils.showToast(activity, "onAuthorizeComplete token = " + newToken.getToken());
        }

        @Override
        public void onWeiboException(WeiboException e) {
          UIUtils.showToast(activity, "分享出错");
        }

        @Override
        public void onCancel() {
          UIUtils.showToast(activity, "分享取消");
        }
      });
    }
  }

  private static TextObject getTextObj(Activity activity, String sharePath) {
    TextObject textObject = new TextObject();
    textObject.text = "##################...@" + sharePath;
    Bitmap bitmap = BitmapFactory.decodeResource(activity.getResources(), R.mipmap.ic_launcher);
    textObject.setThumbImage(bitmap);
    return textObject;
  }

  /**
   * 创建图片消息对象。
   *
   * @return 图片消息对象。
   */
  private static ImageObject getImageObj(Activity activity) {
    ImageObject imageObject = new ImageObject();
//    BitmapDrawable bitmapDrawable = (BitmapDrawable) mImageView.getDrawable();
    //设置缩略图。 注意:最终压缩过的缩略图大小不得超过 32kb。
    Bitmap bitmap = BitmapFactory.decodeResource(activity.getResources(), R.mipmap.ic_launcher);
    imageObject.setImageObject(bitmap);
    return imageObject;
  }

  static SendMessageToWX.Req req;
  private static final int THUMB_SIZE = 150;

  public static void shareWechatCircle(Activity activity, String sharePath) {
    if (linkWeiXin(activity, sharePath)) {
      req.scene = SendMessageToWX.Req.WXSceneTimeline;
      weixin_api.sendReq(req);
    }
  }

  public static void shareWechat(Activity activity, String sharePath) {
    if (linkWeiXin(activity, sharePath)) {
      req.scene = SendMessageToWX.Req.WXSceneSession;
      weixin_api.sendReq(req);
    }
  }

  //微信分享
  private static boolean linkWeiXin(Activity activity, String sharePath) {
    // 通过WXAPIFactory工厂,获取IWXAPI的实例
    weixin_api = WXAPIFactory.createWXAPI(activity, WEIXIN_SHARE_APP_ID, true);
    if (weixin_api.isWXAppInstalled() && weixin_api.isWXAppSupportAPI()) {
      weixin_api.registerApp(WEIXIN_SHARE_APP_ID);

      WXWebpageObject webpageObject = new WXWebpageObject();
      webpageObject.webpageUrl = sharePath;

      WXMediaMessage msg = new WXMediaMessage();
      msg.mediaObject = webpageObject;
      Bitmap bitmap = BitmapFactory.decodeResource(activity.getResources(), R.mipmap.ic_launcher);
      msg.setThumbImage(bitmap);
      msg.title = "######";
      msg.description = "###################...";

      req = new SendMessageToWX.Req();
      req.transaction = buildTransaction("webpage");
      req.message = msg;

      return true;
    } else {
      UIUtils.showToast(activity, "请检查是否安装最新版微信!");
      return false;
    }
  }

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

三、分享界面

import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.View;
import android.widget.ImageView;

import com.google.zxing.WriterException;
import com.sina.weibo.sdk.api.share.BaseResponse;
import com.sina.weibo.sdk.api.share.IWeiboHandler;
import com.sina.weibo.sdk.api.share.IWeiboShareAPI;
import com.sina.weibo.sdk.api.share.WeiboShareSDK;
import com.sina.weibo.sdk.constant.WBConstants;
import com.tencent.tauth.IUiListener;
import com.tencent.tauth.Tencent;
import com.tencent.tauth.UiError;

import butterknife.BindView;
import cn.hnshangyu.maker.R;
import cn.hnshangyu.maker.base.BaseActivity;
import cn.hnshangyu.maker.ui.personal.zxing.EncodingHandler;
import cn.hnshangyu.maker.util.ShareUtil;
import cn.hnshangyu.maker.util.UIUtils;
import cn.hnshangyu.maker.weibo.Constants;

public class InviteFriendsActivity extends BaseActivity implements IWeiboHandler.Response {

  @BindView(R.id.iv_qrcode)
  ImageView ivQrcode;
  @BindView(R.id.iv_share_qq)
  ImageView ivShareQq;
  @BindView(R.id.iv_share_weibo)
  ImageView ivShareWeibo;
  @BindView(R.id.iv_share_weixin)
  ImageView ivShareWeixin;
  @BindView(R.id.iv_share_circle_friends)
  ImageView ivShareCircleFriends;

  private Bitmap qrcodeBitmap;

  /**
   * 微博微博分享接口实例
   */
  private IWeiboShareAPI mWeiboShareAPI = null;

  //分享链接
  private String sharePath;

  @Override
  protected int getLayoutId() {
    return R.layout.activity_invite_friends;
  }

  @Override
  protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);

    // 从当前应用唤起微博并进行分享后,返回到当前应用时,需要在此处调用该函数
    // 来接收微博客户端返回的数据;执行成功,返回 true,并调用
    // {@link IWeiboHandler.Response#onResponse};失败返回 false,不调用上述回调
    mWeiboShareAPI.handleWeiboResponse(intent, this);
  }

  /**
   * 初始化控件(必须实现此方法)
   */
  @Override
  protected void initView() {
    sharePath = getResources().getString(R.string.ivQrcode_content);
    onShowTopBack(false);
    onShowTitleBack(true);
    setTitleText(R.string.invite_friends);
    showQRCode();

    // 创建微博分享接口实例
    mWeiboShareAPI = WeiboShareSDK.createWeiboAPI(this, Constants.APP_KEY);

    // 注册第三方应用到微博客户端中,注册成功后该应用将显示在微博的应用列表中。
    // 但该附件栏集成分享权限需要合作申请,详情请查看 Demo 提示
    // NOTE:请务必提前注册,即界面初始化的时候或是应用程序初始化时,进行注册
    mWeiboShareAPI.registerApp();

    initListener();
  }

  @Override
  protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // 当 Activity 被重新初始化时(该 Activity 处于后台时,可能会由于内存不足被杀掉了),
    // 需要调用 {@link IWeiboShareAPI#handleWeiboResponse} 来接收微博客户端返回的数据。
    // 执行成功,返回 true,并调用 {@link IWeiboHandler.Response#onResponse};
    // 失败返回 false,不调用上述回调
    if (savedInstanceState != null) {
      mWeiboShareAPI.handleWeiboResponse(getIntent(), this);
    }
  }

  private void showQRCode() {
    //生成二维码图片,第一个参数是二维码的内容,第二个参数是正方形图片的边长,单位是像素
//    String content = "http://m.360buyimg.com/mobilecms/s300x98_jfs/t1363/77/1381395719/60705/ce91ad5c/55dd271aN49efd216.jpg";
//    content = getResources().getString(R.string.ivQrcode_content);
    try {
      qrcodeBitmap = EncodingHandler.createQRCode(sharePath, 400);

      ivQrcode.setImageBitmap(qrcodeBitmap);
    } catch (WriterException e) {
      e.printStackTrace();
    }

  }

  private void initListener() {
    ivShareQq.setOnClickListener(this);
    ivShareWeibo.setOnClickListener(this);
    ivShareWeixin.setOnClickListener(this);
    ivShareCircleFriends.setOnClickListener(this);
  }

  @Override
  protected void onInitClick(View v) {
    super.onInitClick(v);
    switch (v.getId()) {
      case R.id.iv_share_qq:
        ShareUtil.shareQQ(mActivity, sharePath, shareListener);
        break;
      case R.id.iv_share_weibo:
        ShareUtil.shareWeiBo(mActivity, sharePath);
        break;
      case R.id.iv_share_weixin:
        ShareUtil.shareWechat(mActivity, sharePath);
        break;
      case R.id.iv_share_circle_friends:
        ShareUtil.shareWechatCircle(mActivity, sharePath);
        break;
    }
  }

  @Override
  public void onResponse(BaseResponse baseResponse) {
    if (baseResponse != null) {
      switch (baseResponse.errCode) {
        case WBConstants.ErrorCode.ERR_OK:
          UIUtils.showToast(mContext, "分享成功");
          break;
        case WBConstants.ErrorCode.ERR_CANCEL:
          UIUtils.showToast(mContext, "分享取消");
          break;
        case WBConstants.ErrorCode.ERR_FAIL:
          UIUtils.showToast(mContext, "分享失败");
          break;
      }
    }
  }

  private IUiListener shareListener = new IUiListener() {
    @Override
    public void onComplete(Object o) {
      UIUtils.showToast(mContext, "分享成功");
    }

    @Override
    public void onError(UiError uiError) {
      UIUtils.showToast(mContext, "分享出错");
    }

    @Override
    public void onCancel() {
    }
  };

  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == com.tencent.connect.common.Constants.REQUEST_QQ_SHARE) {
      Tencent.onActivityResultData(requestCode, resultCode, data, shareListener);
    }
  }
}

四、Constants类

/**
 * 该类定义了微博授权时所需要的参数。
 */
public interface Constants {

  /**
   * 当前 应用的 APP_KEY,第三方应用应该使用自己的 APP_KEY 替换该 APP_KEY
   */
  public static final String APP_KEY = "16#####007";

  /**
   * 当前 应用的回调页,第三方应用可以使用自己的回调页。
   * <p/>
   * <p>
   * 注:关于授权回调页对移动客户端应用来说对用户是不可见的,所以定义为何种形式都将不影响,
   * 但是没有定义将无法使用 SDK 认证登录。
   * 建议使用默认回调页:https://api.weibo.com/oauth2/default.html
   * </p>
   */
//  public static final String REDIRECT_URL = "http://www.sina.com";
  public static final String REDIRECT_URL = "https://api.weibo.com/oauth2/default.html";
  /**
   * Scope 是 OAuth2.0 授权机制中 authorize 接口的一个参数。通过 Scope,平台将开放更多的微博
   * 核心功能给开发者,同时也加强用户隐私保护,提升了用户体验,用户在新 OAuth2.0 授权页中有权利
   * 选择赋予应用的功能。
   * <p/>
   * 我们通过新浪微博开放平台-->管理中心-->我的应用-->接口管理处,能看到我们目前已有哪些接口的
   * 使用权限,高级权限需要进行申请。
   * <p/>
   * 目前 Scope 支持传入多个 Scope 权限,用逗号分隔。
   * <p/>
   * 有关哪些 OpenAPI 需要权限申请,请查看:http://open.weibo.com/wiki/%E5%BE%AE%E5%8D%9AAPI
   * 关于 Scope 概念及注意事项,请查看:http://open.weibo.com/wiki/Scope
   */
  public static final String SCOPE =
      "email,direct_messages_read,direct_messages_write,"
          + "friendships_groups_read,friendships_groups_write,statuses_to_me_read,"
          + "follow_app_official_microblog," + "invitation_write";
}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • Android实现新浪微博一键分享的实例代码

    写在本章前 愈来愈多的APP支持一键分享至QQ空间.微信朋友圈.新浪微博的功能,同时支持第三方账号登录,如QQ.微信.新浪微博等第三方平台的账号.本章结合当下流行的设计,兼顾免费的开源ShareSDK,结合项目中的实际需求,整合出一套分享源码,版权所有,如需转载请注明转载地址. 1. 开发环境及SDK下载 开发工具:Android studio2.1.3版本 ShareSDK:Mob官网(www.mob.com)下载最新社会化分享ShareSDK2.7.7版本,解压如图示 进入ShareSDK

  • Android 实现微信,微博,微信朋友圈,QQ分享的功能

    Android 实现微信,微博,微信朋友圈,QQ分享的功能 一.去各自所在的开发者平台注册相应的Key值:引入相关jar包.权限等 二.ShareUtil工具类 import android.app.Activity; import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.graphics.Bit

  • Android 高仿微信朋友圈拍照上传功能

    模仿微信朋友圈发布动态,输入文字支持文字多少高度自增,有一个最小输入框高度,输入文字有限制,不过这些都很easy! 1. PhotoPicker的使用 这是一个支持选择多张图片,点击图片放大,图片之间左右滑动互相切换的库,同时支持图片删除的库,效果类似微信. (1) 添加PhotoPicker的架包 (2) 使用 选择图片:安卓6.0以后需要在代码中添加读写sd卡和相机的权限 当然清单文件中也需要添加的 PhotoPicker.builder() .setPhotoCount(maxPhoto)

  • Android仿微信朋友圈全文、收起功能的实例代码

    前言 一般在社交APP中都有类似朋友圈的功能,其中发表的动态内容很长的时候不可能让它全部显示.这里就需要做一个仿微信朋友圈全文.收起功能来解决该问题.在网上看到一个例子-->http://www.jb51.net/article/105251.htm,写的很不错,但是有个bug,他这个Demo只有在条目固定的时候才正常,当增加.删除条目的时候会出现全文.收起显示混乱的问题.原因是他使用了固定的position作为key来保存当前显示的状态.这篇文章在他的基础上进行优化. 效果图 具体代码 (详细

  • Android仿微信朋友圈点赞和评论功能

    最近在做朋友圈的项目,所以写一个Android仿朋友圈点赞和评论功能Demo,代码就是简单实现了一下功能,没有做优化,凑合看 图文排列是用的RecyclerView实现的,弹窗效果是用的自定义的PopupWindow,点赞应该是在本地请求数据库,设置一个flag,获取当前用户的id后,带着id向服务器post一个flag,评论就比较简单了,也是获取当前朋友id(或者昵称),带着内容,向服务器post 贴代码: package com.example.lenovo.dianzandemo; imp

  • Java实现微信公众平台朋友圈分享功能详细代码

    其实分享的方法在微信官网有较为详细的文档说明,现就其中一些比较绕的步骤进行总结,有问题随时交流哈. 首先微信其实已经自带分享到朋友圈,朋友,qq空间等功能,对于开发微信专门提供了一个接口,可以根据需要修改一些配置.例如修改要分享内容的头像,链接,描述等. 开发步骤: 1.在公众平台配置js-sdk接口 "公众号设置"--"功能设置"--"JS接口安全域名" 2.在要分享的页面引入js http://res.wx.qq.com/open/js/jw

  • Android实现微信朋友圈发本地视频功能

    一.前言 前一篇文章已经详细介绍了如何使用Xposed框架编写第一个微信插件:摇骰子和猜拳作弊器 本文继续来介绍如何使用Xposed框架编写第二个微信插件,可以将本地小视频发布到朋友圈的功能.在这之前我们还是要有老套路,准备工作要做好,这里还是使用微信6.3.9版本进行操作,准备工作: 1.使用apktool工具进行反编译,微信没有做加固防护,所以这个版本的微信包反编译是没有任何问题的. 2.借助于可视化反编译工具Jadx打开微信包,后续几乎重要分析都是借助这个工具来操作的. 二.猜想与假设 做

  • Javascript 实现微信分享(QQ、朋友圈、分享给朋友)

    最近做微信开发,对微信公众号的开发,现在好的都是分享到朋友圈,QQ,分享给好友等分享功能,这里记录下,有需要的朋友也可以看下. // 微信分享 var wx = require('wechat-sdk'); rewardsResultService.getWechatInfo().then(function(data) { var conf = data; wx.config({ debug: false, appId: 'wx34e783920b37ee91', timestamp: conf

  • Android自定义TextView仿微信朋友圈文字展开全文功能

    Android自定义TextView仿微信朋友圈文字信息,展开全文功能 代码及注释如下: 首先写一个xml文件 showmore.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical

  • Android GridView扩展仿微信微博发图动态添加删除图片功能

    在平时的开发中,我们会看到不管是微信发朋友圈照片还是微博发布新鲜事,添加图片的时候都是选完后面还有个+号再去选择图片,这样的话比较方便用户去添加图片,有的右上角还有个-号方便用户去删除图片,而一般用户选择的图片多少都是不定的,我们只限制最大张数,我们用gridview去实现,代码可能比较简单,高手请略过. 0.效果图 1.准备资源图片 添加图片的+号图片 删除图片的图片 2.可设置限制用户选择最大张数 /** * 可以动态设置最多上传几张,之后就不显示+号了,用户也无法上传了 * 默认9张 */

  • 微信小程序基于Taro的分享图片功能实践详解

    前言 在各种小程序(微信.百度.支付宝).H5.NativeApp 纷纷扰扰的当下,给大家强烈安利一款基于React的多终端开发利器:京东Taro(泰罗·奥特曼),Taro致力于多终端统一解决方案,一处代码,多处运行. Taro支持以React语言开发小程序,支持CSS预处理器,支持实时编译更新,支持NPM,等等等等,简直不要太爽! 微信小程序分享图片功能是经常在小程序业务中出现的,比如学习打卡分享,推广会员分享,推广商品分享等等.因为小程序是不支持直接分享图片到朋友圈的,一般操作为: 生成包含

随机推荐