Android 第三方登录、分享(ShareSDK、友盟)

为下边的项目做准备,写一个第三方登录、分享的demo。分别使用sharesdk和友盟来实现。

先说一下我对两者的使用上的感觉,个人感觉sharesdk比友盟更好一点,好在哪里呢?好在人工服务上。在集成的过程中遇到了各种问题,但是sharesdk的人工服务做的很好,能给答疑解惑,提供解决问题的方法!
接下来上代码(本文使用android studio开发,sharesdk版本v2.7.7,友盟版本v6.0.0):

一、使用sharesdk(sharesdk版本v2.7.7)来集成:

1、要去官网:http://www.mob.com/  注册账号、添加应用、下载sdk、分别去新浪、微信、QQ开放平台注册应用,拿到key。准备好这些,就让咱们开始吧!
2、在清单文件中添加如下权限:

<uses-permission android:name="android.permission.GET_TASKS" />
 <uses-permission android:name="android.permission.INTERNET" />
 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
 <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 <uses-permission android:name="android.permission.READ_PHONE_STATE" />
 <uses-permission android:name="android.permission.MANAGE_ACCOUNTS"/>
 <uses-permission android:name="android.permission.GET_ACCOUNTS"/>
 <!-- 蓝牙分享所需的权限 -->
 <uses-permission android:name="android.permission.BLUETOOTH" />
 <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

3、继续添加Activity的信息,**此处注意tencent后面的appid要保持和您配置的QQ的appid一致**:

 <!-- 调用QQ,需要注册的回调activity -->
<activity android:name="com.mob.tools.MobUIShell" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:configChanges="keyboardHidden|orientation|screenSize" android:screenOrientation="portrait" android:windowSoftInputMode="stateHidden|adjustResize" >
   <intent-filter>
     <data android:scheme="tencent100371282" />
     <action android:name="android.intent.action.VIEW" />
     <category android:name="android.intent.category.BROWSABLE" />
     <category android:name="android.intent.category.DEFAULT" />
   </intent-filter>
  <!-- 调用新浪原生SDK,需要注册的回调activity -->
  <intent-filter>
    <action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY" />
    <category android:name="android.intent.category.DEFAULT" />
  </intent-filter>
 </activity>
<!-- 调用微信,需要注册的回调activity -->
<!--微信分享回调 -->
 <activity android:name=".wxapi.WXEntryActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:configChanges="keyboardHidden|orientation|screenSize" android:exported="true" android:screenOrientation="portrait" />

4、去assets目录下的ShareSdk.xml目录下修改准备好的QQ、微信、微博的key。
在此处注意:4.1、assets文件夹在main的根目录下。
          4.2、QQ和QZone使用的同一个AppId、AppKey
          4.3、微信和朋友圈、收藏使用同一个 AppId、AppSecret
          4.4、微博除去配置AppKey、AppSecret之外,还需要配置
    RedirectUrl="http://sns.whalecloud.com/sina2/callback"
    RedirectUrl的值和微博应用信息处的授权回调页保持一致

5、去添加微信的回调
    5.1、在包名的下边建立一个名字为“wxapi”的包
    5.2、把demo中的“WXEntryActivity”放进去,注意,这个类不需要动,不需要手动调用!!
    ![WXEntryActivity的位置](http://img.blog.csdn.net/20161015153103561)

6、去写代码吧
    提前准备PublicStaticData.java:

package com.example.lql.sharesdk.utils;

import com.umeng.socialize.UMShareAPI;

import cn.sharesdk.framework.ShareSDK;

public class PublicStaticData {
  public static ShareSDK myShareSDK;
  public static UMShareAPI mShareAPI;
}

6.0初始化
        PublicStaticData.myShareSDK= new ShareSDK();
        PublicStaticData.myShareSDK.initSDK(getApplicationContext());
    6.1、打开分享面板

/** * @param title 标题 * @param text 内容 * @param picurl 图片链接 * * QQ和QQ空间设置分享链接使用setTitleUrl(); * 设置标题:setTitle * 设置内容:setText * 设置网络图片:oks.setImageUrl("http://f1.sharesdk.cn/imgs/2014/02/26/owWpLZo_638x960.jpg"); * 设置本地图片: //oks.setImagePath("/sdcard/test.jpg");//确保SDcard下面存在此张图片 * * 微信 * url仅在微信(包括好友和朋友圈)中使用 * oks.setUrl("http://qq.com"); */
  private void showShare(String title,String text,String picurl) {
    OnekeyShare oks = new OnekeyShare();
    //关闭sso授权
    oks.disableSSOWhenAuthorize();
    oks.setTitle(title);
    oks.setText(text);
    if(picurl!=null){
      oks.setImageUrl(picurl);
    }
    // 启动分享GUI
    oks.show(this);
  }

6.2、分享到指定平台(此处使用微信和微博为例)

 /** * 微信 在微信分享中,需要设置setShareType属性,此处应注意 * @param title * @param content * @param PicUrl * @param titleUrl * Platform.SHARE_TEXT(分享文本), Platform.SHARE_IMAGE(分享图片), Platform.SHARE_WEBPAGE(分享网页,既图文分享), Platform.SHARE_MUSIC(分享音频), Platform.SHARE_VIDEO(分享视频), Platform.SHARE_APPS(分享应用,仅微信支持), Platform.SHARE_FILE(分享文件,仅微信支持) Platform.SHARE_EMOJI(分享表情,仅微信支持) */
  public static void shareWX(String title,String content,String PicUrl,String titleUrl){
    type="share";
    Wechat.ShareParams sp=new Wechat.ShareParams();
    sp.setTitle(title);
    sp.setText(content);
    if(titleUrl!=null){
      sp.setTitleUrl(titleUrl); // 标题的超链接
    }
    if(PicUrl!=null){
      sp.setImageUrl(PicUrl);// 图片地址
    }
    sp.setShareType(Platform.SHARE_IMAGE);
    sp.setUrl("http://qq.com");
    Platform wx = PublicStaticData.myShareSDK.getPlatform (Wechat.NAME);
    wx. setPlatformActionListener (mPlatformActionListener); // 设置分享事件回调
    // 执行图文分享
    wx.share(sp);
  }
  /** * 分享到微博 * @param text 文本内容 * @param picUrl 网络图片 (文档中说明分享图片需要审核通过,测试中体现不需要) */
  public static void shareSina(String text,String picUrl){
    type="share";
    SinaWeibo.ShareParams sp = new SinaWeibo.ShareParams();
    sp.setText(text);
    if(picUrl!=null){
      sp.setImageUrl(picUrl);
    }
    Platform weibo = PublicStaticData.myShareSDK.getPlatform(SinaWeibo.NAME);
    weibo.setPlatformActionListener(mPlatformActionListener); // 设置分享事件回调
// 执行图文分享
    weibo.share(sp);
  }

6.3第三方登录

  /** * 登录 * @param name 登录方式(QQ.NAME、Wechat.NAME、SinaWeibo.NAME) */
  public static void Login(String name){
    type="login";
    Platform mPlatform = ShareSDK.getPlatform(name);
    mPlatform.setPlatformActionListener(mPlatformActionListener);
    mPlatform.authorize();//单独授权,OnComplete返回的hashmap是空的
    mPlatform.showUser(null);//授权并获取用户信息
  }

6.4登录和分享回调(此处分享和登录使用的一个监听)

  public static PlatformActionListener mPlatformActionListener= new PlatformActionListener() {
    @Override
    public void onComplete(Platform platform, int i, HashMap<String, Object> hashMap) {
      if(type.equals("login")){
        Log.e("onComplete","登录成功");
        Log.e("openid",platform.getDb().getUserId());//拿到登录后的openid
        Log.e("username",platform.getDb().getUserName());//拿到登录用户的昵称
      }else{
        Log.e("onComplete","分享成功");
      }
    }

    @Override
    public void onError(Platform platform, int i, Throwable throwable) {
      Log.e("onError",throwable.toString()+"");
      if(type.equals("login")){
        Log.e("onError","登录失败"+throwable.toString());
      }else{
        Log.e("onError","分享失败"+throwable.toString());
      }
    }

    @Override
    public void onCancel(Platform platform, int i) {
      if(type.equals("login")){
        Log.e("onCancel","登录取消");
      }else{
        Log.e("onCancel","分享取消");
      }
    }
  };

7、至此使用ShareSDK集成常见分三种登录分享方式就完成了,整个过程没有遇到严重的问题,整体体验效果还不错。上整体代码ShareSDKUtils.java:

package com.example.lql.sharesdk.utils;

import android.content.Context;
import android.util.Log;

import java.util.HashMap;

import cn.sharesdk.framework.Platform;
import cn.sharesdk.framework.PlatformActionListener;
import cn.sharesdk.framework.ShareSDK;
import cn.sharesdk.sina.weibo.SinaWeibo;
import cn.sharesdk.tencent.qq.QQ;
import cn.sharesdk.tencent.qzone.QZone;
import cn.sharesdk.wechat.favorite.WechatFavorite;
import cn.sharesdk.wechat.friends.Wechat;
import cn.sharesdk.wechat.moments.WechatMoments;

/** * Created by LQL on 2016/10/14. */

public class ShareSDKUtils {
private static String type="";

  /** * 分享到微博 * @param text 文本内容 * @param picUrl 网络图片 (通过审核后才能添加) */
  public static void shareSina(String text,String picUrl,Context context){
    type="share";
    SinaWeibo.ShareParams sp = new SinaWeibo.ShareParams();
    sp.setText(text);
    if(picUrl!=null){
      sp.setImageUrl(picUrl);
    }
    Platform weibo = PublicStaticData.myShareSDK.getPlatform(SinaWeibo.NAME);
    weibo.setPlatformActionListener(mPlatformActionListener); // 设置分享事件回调
// 执行图文分享
    weibo.share(sp);
  }

  /** * 分享到QQ空间 * @param title 标题 * @param content 内容 * @param PicUrl 图片 * @param titleUrl title链接 */
  public static void shareQzone(String title,String content,String PicUrl,String titleUrl){
    type="share";
    QZone.ShareParams sp = new QZone.ShareParams();
    sp.setTitle(title);
    sp.setText(content);
    if(titleUrl!=null){
      sp.setTitleUrl(titleUrl); // 标题的超链接
    }
    if(PicUrl!=null){
      sp.setImageUrl(PicUrl);
    }
    Platform qzone = PublicStaticData.myShareSDK.getPlatform (QZone.NAME);
    qzone. setPlatformActionListener (mPlatformActionListener); // 设置分享事件回调
    // 执行图文分享
    qzone.share(sp);
  }

  /** * QQ * @param title * @param content * @param PicUrl * @param titleUrl */
  public static void shareQQ(String title,String content,String PicUrl,String titleUrl){
    type="share";
    QQ.ShareParams sp=new  QQ.ShareParams();
    sp.setTitle(title);
    sp.setText(content);
    if(titleUrl!=null){
      sp.setTitleUrl(titleUrl); // 标题的超链接
    }
    if(PicUrl!=null){
      sp.setImageUrl(PicUrl);
    }
    Platform qq = PublicStaticData.myShareSDK.getPlatform (QQ.NAME);
    qq. setPlatformActionListener (mPlatformActionListener); // 设置分享事件回调
    // 执行图文分享
    qq.share(sp);
  }

  /** * 收藏 * @param title * @param content * @param PicUrl * @param titleUrl */
  public static void shareWXF(String title,String content,String PicUrl,String titleUrl){
    type="share";
    WechatFavorite.ShareParams sp=new WechatFavorite.ShareParams();
    sp.setTitle(title);
    sp.setText(content);
    if(titleUrl!=null){
      sp.setTitleUrl(titleUrl); // 标题的超链接
    }
    if(PicUrl!=null){
      sp.setImageUrl(PicUrl);
    }
    sp.setShareType(Platform.SHARE_IMAGE);
    sp.setUrl("http://www.163.com/");
    Platform qq = PublicStaticData.myShareSDK.getPlatform (WechatFavorite.NAME);
    qq. setPlatformActionListener (mPlatformActionListener); // 设置分享事件回调
    // 执行图文分享
    qq.share(sp);
  }

  /** * 朋友圈 * @param title * @param content * @param PicUrl * @param titleUrl */
  public static void shareWXM(String title,String content,String PicUrl,String titleUrl){
    type="share";
    WechatMoments.ShareParams sp=new WechatMoments.ShareParams();
    sp.setTitle(title);
    sp.setText(content);
    if(titleUrl!=null){
      sp.setTitleUrl(titleUrl); // 标题的超链接
    }
    if(PicUrl!=null){
      sp.setImageUrl(PicUrl);
    }
    sp.setShareType(Platform.SHARE_IMAGE);
    sp.setUrl("http://www.sina.com.cn");
    Platform qq = PublicStaticData.myShareSDK.getPlatform (WechatMoments.NAME);
    qq. setPlatformActionListener (mPlatformActionListener); // 设置分享事件回调
    // 执行图文分享
    qq.share(sp);
  }

  /** * 微信 * @param title * @param content * @param PicUrl * @param titleUrl * Platform.SHARE_TEXT(分享文本), Platform.SHARE_IMAGE(分享图片), Platform.SHARE_WEBPAGE(分享网页,既图文分享), Platform.SHARE_MUSIC(分享音频), Platform.SHARE_VIDEO(分享视频), Platform.SHARE_APPS(分享应用,仅微信支持), Platform.SHARE_FILE(分享文件,仅微信支持) Platform.SHARE_EMOJI(分享表情,仅微信支持) */
  public static void shareWX(String title,String content,String PicUrl,String titleUrl){
    type="share";
    Wechat.ShareParams sp=new Wechat.ShareParams();
    sp.setTitle(title);
    sp.setText(content);
    if(titleUrl!=null){
      sp.setTitleUrl(titleUrl); // 标题的超链接
    }
    if(PicUrl!=null){
      sp.setImageUrl(PicUrl);
    }
    sp.setShareType(Platform.SHARE_IMAGE);
    sp.setUrl("http://qq.com");
    Platform wx = PublicStaticData.myShareSDK.getPlatform (Wechat.NAME);
    wx. setPlatformActionListener (mPlatformActionListener); // 设置分享事件回调
    // 执行图文分享
    wx.share(sp);
  }
  /** * 登录 */
  public static void Login(String name){
    type="login";
    Platform mPlatform = ShareSDK.getPlatform(name);
    mPlatform.setPlatformActionListener(mPlatformActionListener);
    mPlatform.authorize();//单独授权,OnComplete返回的hashmap是空的
    mPlatform.showUser(null);//授权并获取用户信息
  }

  public static PlatformActionListener mPlatformActionListener= new PlatformActionListener() {
    @Override
    public void onComplete(Platform platform, int i, HashMap<String, Object> hashMap) {
      if(type.equals("login")){
        Log.e("onComplete","登录成功");
        Log.e("openid",platform.getDb().getUserId());//拿到登录后的openid
        Log.e("username",platform.getDb().getUserName());//拿到登录用户的昵称
      }else{
        Log.e("onComplete","分享成功");
      }
    }

    @Override
    public void onError(Platform platform, int i, Throwable throwable) {
      Log.e("onError",throwable.toString()+"");
      if(type.equals("login")){
        Log.e("onError","登录失败"+throwable.toString());
      }else{
        Log.e("onError","分享失败"+throwable.toString());
      }
    }

    @Override
    public void onCancel(Platform platform, int i) {
      if(type.equals("login")){
        Log.e("onCancel","登录取消");
      }else{
        Log.e("onCancel","分享取消");
      }
    }
  };
}

在Activity中的使用

String picurl="http://f1.sharesdk.cn/imgs/2014/02/26/owWpLZo_638x960.jpg";
 case R.id.openShare://打开分享面板,直接调用上边写到的方法
        showShare("sharesdk测试","sharesdk测试",picurl);
        break;
      case R.id.QQLogin://QQ登录
        ShareSDKUtils.Login(QQ.NAME);
        break;
      case R.id.WXLogin://微信登录
        ShareSDKUtils.Login(Wechat.NAME);
        break;
      case R.id.SinaLogin://微博登录
        ShareSDKUtils.Login(SinaWeibo.NAME);
        break;
      case R.id.WXLike://收藏分享(微信需要有图片)
        ShareSDKUtils.shareWXF("微信收藏分享测试标题sharesdk","微信收藏分享测试内容sharesdk",picurl,null);
        break;
      case R.id.WXfriendsshare://朋友圈分享(微信需要有图片)
        ShareSDKUtils.shareWXM("朋友圈分享测试标题sharesdk","朋友圈分享测试内容sharesdk",picurl,null);
        break;
      case R.id.WXshare://微信分享(微信需要有图片)
        ShareSDKUtils.shareWX("微信分享测试标题sharesdk","微信分享测试内容sharesdk",picurl,null);
        break;
      case R.id.Sinashare://微博分享
        ShareSDKUtils.shareSina("Sina分享测试sharesdk",null,MainActivity.this);
        break;
      case R.id.QZONEshare://空间
        ShareSDKUtils.shareQzone("Qzone分享测试标题sharesdk","Qzone分享测试内容sharesdk",picurl,null);
        break;
      case R.id.QQshare://QQ
        ShareSDKUtils.shareQQ("Qzone分享测试标题sharesdk","Qzone分享测试内容sharesdk",picurl,null);
        break;

二、使用友盟来集成(友盟版本v6.0.0(精简版)):

1、此处省略注册、下载sdk、准备key的过程,直接从集成开始。
2、权限:

<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" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_LOGS" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.SET_DEBUG_APP" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />

3、添加Activity信息(此处使用微博精简版,新浪微博不需要回调Activity)**此处注意tencent后面的appid要保持和您配置的QQ的appid一致**:

<!-- ###################添加UmengAppkey###################### -->
    <meta-data android:name="UMENG_APPKEY" android:value="577c404367e58e6b1f001a40">
    </meta-data>
<!-- 调用微信,需要注册的回调activity -->
<activity android:name=".wxapi.WXEntryActivity" android:configChanges="keyboardHidden|orientation|screenSize" android:exported="true" android:screenOrientation="portrait" android:theme="@android:style/Theme.Translucent.NoTitleBar" />
<!-- 调用QQ -->
<activity android:name="com.tencent.tauth.AuthActivity" android:launchMode="singleTask" android:noHistory="true" >
    <intent-filter>
      <action android:name="android.intent.action.VIEW" />

      <category android:name="android.intent.category.DEFAULT" />
      <category android:name="android.intent.category.BROWSABLE" />

      <data android:scheme="tencent100424468" />
    </intent-filter>
  </activity>
  <activity android:name="com.tencent.connect.common.AssistActivity" android:screenOrientation="portrait" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:configChanges="orientation|keyboardHidden|screenSize"/>

4、上代码:

4.0初始化:

    PlatformConfig.setWeixin("wx282305cc871b77bc", "bdf0b6e3ff283ec29a12abf40ff62c1a");
    PlatformConfig.setSinaWeibo("170221996", "75314930606f946864ee0d7aeecc46ed");
    Config.REDIRECT_URL = "http://sns.whalecloud.com/sina2/callback";//您新浪后台的回调地址
    PlatformConfig.setQQZone("1105747496", "EVHTBI0P5NDpuNIZ");
    UMShareAPI.get(this);

4.1打开分享面板

 new ShareAction(MainActivity.this).withText("测试啊测试啊")
            .withTitle("测试啊测试啊")
            .withMedia(new UMImage(MainActivity.this, picurl))           .setDisplayList(SHARE_MEDIA.SINA,SHARE_MEDIA.QQ,SHARE_MEDIA.WEIXIN,SHARE_MEDIA.QZONE,SHARE_MEDIA.WEIXIN_CIRCLE,SHARE_MEDIA.WEIXIN_FAVORITE)
            .setCallback(umShareListener).open();

4.2分享到置顶平台

  /** * 分享 * @param mActivity * @param title 标题 * @param context 内容 * @param Sharetype 分享方式 * SHARE_MEDIA.WEIXIN_FAVORITE * SHARE_MEDIA.WEIXIN_CIRCLE * SHARE_MEDIA.WEIXIN * SHARE_MEDIA.SINA * SHARE_MEDIA.QZONE * SHARE_MEDIA.QQ * @param picurl 图片地址 */
  public static void SharePic(Activity mActivity,String title,String context,SHARE_MEDIA Sharetype,String picurl){
    UmengShare.myActivity=mActivity;
    if(picurl!=null){
      new ShareAction(mActivity).setPlatform(Sharetype)
          .withText(context)
          .withTitle(title)
          .withMedia(new UMImage(mActivity,picurl))
          .setCallback(umShareListener)
          .share();
    }else{
      new ShareAction(mActivity).setPlatform(Sharetype)
          .withText(context)
          .withTitle(title)
          .setCallback(umShareListener)
          .share();
    }
  }

4.3分享监听回调

 /** * 分享监听 */
  public static UMShareListener umShareListener = new UMShareListener() {
    @Override
    public void onResult(SHARE_MEDIA platform) {
      Log.d("plat","platform"+platform);
      Toast.makeText(myActivity, platform + " 分享成功啦", Toast.LENGTH_SHORT).show();
    }
    @Override
    public void onError(SHARE_MEDIA platform, Throwable t) {
      Toast.makeText(myActivity,platform + " 分享失败啦", Toast.LENGTH_SHORT).show();
      if(t!=null){
        Log.d("throw","throw:"+t.getMessage());
      }
    }
    @Override
    public void onCancel(SHARE_MEDIA platform) {
      Toast.makeText(myActivity,platform + " 分享取消了", Toast.LENGTH_SHORT).show();
    }
  };

4.4 登录

  /** * 第三方登录 * @param mActivity * @param type 登录方式 * SHARE_MEDIA.QQ * SHARE_MEDIA.WEIXIN * SHARE_MEDIA.SINA */
  public static void UmengLogin(Activity mActivity,SHARE_MEDIA type){
    UmengShare.myActivity=mActivity;
    PublicStaticData.mShareAPI = UMShareAPI.get( mActivity );
    PublicStaticData.mShareAPI.doOauthVerify(mActivity,type, umAuthListener);
  }

4.5 登录回调

  /** * 第三方登录监听 */
  public static UMAuthListener umAuthListener = new UMAuthListener() {
    @Override
    public void onComplete(SHARE_MEDIA platform, int action, Map<String, String> data) {
      Toast.makeText(myActivity, "授权成功", Toast.LENGTH_SHORT).show();
      Log.e("data",data.toString());
    }
    @Override
    public void onError(SHARE_MEDIA platform, int action, Throwable t) {
      Toast.makeText( myActivity, "授权失败", Toast.LENGTH_SHORT).show();
      Log.e("data",t.toString()+"");
    }

    @Override
    public void onCancel(SHARE_MEDIA platform, int action) {
      Toast.makeText( myActivity, "关闭授权", Toast.LENGTH_SHORT).show();
      Log.e("data","关闭授权");
    }
  };

5.在一些低端手机上可能会出现QQ没有回调的情况,需要在Activity中添加如下代码:

  /** * 友盟QQ登录需要的回调 在有些低端手机上登录之后不走回调,需要这个方法 * @param requestCode * @param resultCode * @param data */
  @Override
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    UMShareAPI.get(this).HandleQQError(MainActivity.this,requestCode,umAuthListener);
    PublicStaticData.mShareAPI.onActivityResult(requestCode, resultCode, data);
  }

6、同样是没有回调,这次是微信,需要在WXEntryActivity中加入代码:

  @Override
  protected void handleIntent(Intent intent){

    mWxHandler.setAuthListener(new UMAuthListener() {
      @Override
      public void onComplete(SHARE_MEDIA platform, int action, Map<String, String> data) {
        Log.e("UMWXHandler fsdfsdfs"+data.toString());
      }

      @Override
      public void onError(SHARE_MEDIA platform, int action, Throwable t) {
        Log.e("UMWXHandler fsdfsdfs",t.toString());
      }

      @Override
      public void onCancel(SHARE_MEDIA platform, int action) {
        Log.e("UMWXHandler fsdfsdfs","onCancel");
      }
    });
    super.handleIntent(intent);
  }

7、至此使用友盟集成常见分三种登录分享方式就完成了。上整体代码UmengShare.java:

package com.example.lql.sharesdk.utils;

import android.Manifest;
import android.app.Activity;
import android.os.Build;
import android.support.v4.app.ActivityCompat;
import android.util.Log;
import android.widget.Toast;

import com.umeng.socialize.ShareAction;
import com.umeng.socialize.UMAuthListener;
import com.umeng.socialize.UMShareAPI;
import com.umeng.socialize.UMShareListener;
import com.umeng.socialize.bean.SHARE_MEDIA;
import com.umeng.socialize.media.UMImage;

import java.util.Map;

/** * Created by LQL on 2016/10/15. */

public class UmengShare {
  private static Activity myActivity;

  /** * 分享 * @param mActivity * @param title 标题 * @param context 内容 * @param Sharetype 分享方式 * SHARE_MEDIA.WEIXIN_FAVORITE * SHARE_MEDIA.WEIXIN_CIRCLE * SHARE_MEDIA.WEIXIN * SHARE_MEDIA.SINA * SHARE_MEDIA.QZONE * SHARE_MEDIA.QQ * @param picurl 图片地址 */
  public static void SharePic(Activity mActivity,String title,String context,SHARE_MEDIA Sharetype,String picurl){
    UmengShare.myActivity=mActivity;
    if(picurl!=null){
      new ShareAction(mActivity).setPlatform(Sharetype)
          .withText(context)
          .withTitle(title)
          .withMedia(new UMImage(mActivity,picurl))
          .setCallback(umShareListener)
          .share();
    }else{
      new ShareAction(mActivity).setPlatform(Sharetype)
          .withText(context)
          .withTitle(title)
          .setCallback(umShareListener)
          .share();
    }
  }

  /** * 第三方登录 * @param mActivity * @param type 登录方式 * SHARE_MEDIA.QQ * SHARE_MEDIA.WEIXIN * SHARE_MEDIA.SINA */
  public static void UmengLogin(Activity mActivity,SHARE_MEDIA type){
    UmengShare.myActivity=mActivity;
    PublicStaticData.mShareAPI = UMShareAPI.get( mActivity );
    PublicStaticData.mShareAPI.doOauthVerify(mActivity,type, umAuthListener);
  }

  /** * 第三方登录监听 */
  public static UMAuthListener umAuthListener = new UMAuthListener() {
    @Override
    public void onComplete(SHARE_MEDIA platform, int action, Map<String, String> data) {
      Toast.makeText(myActivity, "授权成功", Toast.LENGTH_SHORT).show();
      Log.e("data",data.toString());
    }
    @Override
    public void onError(SHARE_MEDIA platform, int action, Throwable t) {
      Toast.makeText( myActivity, "授权失败", Toast.LENGTH_SHORT).show();
      Log.e("data",t.toString()+"");
    }

    @Override
    public void onCancel(SHARE_MEDIA platform, int action) {
      Toast.makeText( myActivity, "关闭授权", Toast.LENGTH_SHORT).show();
      Log.e("data","关闭授权");
    }
  };

  /** * 分享监听 */
  public static UMShareListener umShareListener = new UMShareListener() {
    @Override
    public void onResult(SHARE_MEDIA platform) {
      Log.d("plat","platform"+platform);
      Toast.makeText(myActivity, platform + " 分享成功啦", Toast.LENGTH_SHORT).show();
    }
    @Override
    public void onError(SHARE_MEDIA platform, Throwable t) {
      Toast.makeText(myActivity,platform + " 分享失败啦", Toast.LENGTH_SHORT).show();
      if(t!=null){
        Log.d("throw","throw:"+t.getMessage());
      }
    }
    @Override
    public void onCancel(SHARE_MEDIA platform) {
      Toast.makeText(myActivity,platform + " 分享取消了", Toast.LENGTH_SHORT).show();
    }
  };
}

在Activity中使用:

 case R.id.openShareUmeng://分享面板
        new ShareAction(MainActivity.this).withText("测试啊测试啊")
            .withTitle("测试啊测试啊")
            .withMedia(new UMImage(MainActivity.this, picurl))
            .setDisplayList(SHARE_MEDIA.SINA,SHARE_MEDIA.QQ,SHARE_MEDIA.WEIXIN,SHARE_MEDIA.QZONE,SHARE_MEDIA.WEIXIN_CIRCLE,SHARE_MEDIA.WEIXIN_FAVORITE)
            .setCallback(umShareListener).open();
        break;
      case R.id.QQLoginUmeng://QQ登录
        UmengShare.UmengLogin(MainActivity.this,SHARE_MEDIA.QQ);
        break;
      case R.id.WXLoginUmeng://微信登录
        UmengShare.UmengLogin(MainActivity.this,SHARE_MEDIA.WEIXIN);
        break;
      case R.id.SinaLoginUmeng://微博登录
        UmengShare.UmengLogin(MainActivity.this,SHARE_MEDIA.SINA);
        break;
      case R.id.WXLikeUmeng://收藏分享(微信需要有图片)
        UmengShare.SharePic(MainActivity.this,"测试收藏","测试收藏内容",SHARE_MEDIA.WEIXIN_FAVORITE,picurl);
        break;
      case R.id.WXfriendsshareUmeng://朋友圈分享(微信需要有图片)
        UmengShare.SharePic(MainActivity.this,"测试朋友圈","测试朋友圈内容",SHARE_MEDIA.WEIXIN_CIRCLE,picurl);
        break;
      case R.id.WXshareUmeng://微信分享(微信需要有图片)
        UmengShare.SharePic(MainActivity.this,"测试分享","测试分享内容",SHARE_MEDIA.WEIXIN,picurl);
        break;
      case R.id.SinashareUmeng://微博分享
        UmengShare.SharePic(MainActivity.this,"测试微博","测试微博内容",SHARE_MEDIA.SINA,null);
        break;
      case R.id.QZONEshareUmeng://空间
        UmengShare.SharePic(MainActivity.this,"测试空间","测试空间内容",SHARE_MEDIA.QZONE,null);
        break;
      case R.id.QQshareUmeng://QQ
        UmengShare.SharePic(MainActivity.this,"测试QQ","测试QQ内容",SHARE_MEDIA.QQ,null);
        break;

最后,两种方式都集成好了,小伙伴们赶紧去使用吧。本人能力有效,如果bug纯属正常!建议使用ShareSDK!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 微信第三方登录Android实现代码

    记录一下微信第三方实现登录的方法.还是比较简单. 一.必要的准备工作 1.首先需要注册并被审核通过的微信开放平台帐号,然后创建一个移动应用,也需要被审核: 2.然后到资源中心下载开发微信所需的工具: 下载的网址:点击打开链接,有一个是SDK,一个是签名生成工具还有一个范例代码. 3.将SDK文件夹lib下的jar文件libammsdk.jar导入到项目工程中: 4.你的测试手机需要装好微信客户端: 5.在项目的AndroidManifest.xml文件中添加如下的权限: <uses-permis

  • Android集成新浪微博第三方登录的方法

    本文实例讲述了Android集成新浪微博第三方登录的方法.分享给大家供大家参考.具体实现方法如下: 1.下载微博的sdk ,导入微博的jar包两个 android-support-v4.jar和weibosdkcore.jar两个包 2.把新浪微博中的demo_src中SDK中的com,导入到项目中 3.用demo中的constants,主要是参数设置,将里面的参数改成自己的参数. 4.编写代码,主要步骤如下: 复制代码 代码如下: // 初始化微博对象 mWeiboAuth = new Wei

  • Android实现使用微信登录第三方APP的方法

    本文实例讲述了Android实现使用微信登录第三方APP的方法.分享给大家供大家参考,具体如下: 使用微信登录APP,免去注册过程,现在已经有很多的类似应用了.集成该功能过程不复杂,但还是有一些地方需要注意的. 开始之前,需要做下面的准备工作. 1.到微信开放平台注册你的APP,并申请开通微信登录的权限.参考这里: https://open.weixin.qq.com// 2.下载Android SDK和签名查看工具,请参考: https://open.weixin.qq.com/cgi-bin

  • Android第三方登录之腾讯QQ登录的实例代码

    布局文件 <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="登录成功" android:textSize="25sp" android:layout_marginTop="100dp" /> 清单文件中的配置 <activity android:n

  • Android实现第三方登录的上拉展开,下拉隐藏,下拉隐藏示例

    Android的UI和交互是很重要的一部分,直接影响到用户对软件的体验.随着项目经验的积累,发现Android中动画的运用越来越重要.本篇文章抽出了项目登录界面中实现的第三方登录,用户可以上拉展开,下拉隐藏第三方登录这么一个效果,提高用户和软件的交互性. 实现效果: (1)activity_main.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=&q

  • Android实现第三方授权登录、分享以及获取用户资料

    由于公司项目的需要,要实现在项目中使用第三方授权登录以及分享文字和图片等这样的效果,几经波折,查阅了一番资料,做了一个Demo.实现起来的效果还是不错的,不敢独享,决定写一个总结的教程,供大家互相交流.学习和参考,只求能和大家共同进步.希望能多多支持! 这篇文章中,我们使用到了Share SDK,它是为iOS.Android.WP8的APP提供社会化功能的一个组件,目前支持如QQ.微信.新浪微博.腾讯微博.开心网.人人网.豆瓣.网易微博.搜狐微博.facebook.twitter.google+

  • Android微信第三方登录(个人笔记)

    今天在写微信登录,花了半天时间搞定.然后写下自己的笔记,希望帮助更多的人.欢迎各位指教. 微信授权登录,官方说的不是很清楚.所以导致有一部分的坑. 微信注册应用平台的应用签名,下载 微信签名生成工具 输入项目的packageName也可以查看到. (注意:debug.Release 一定要区分,因为2种生成的微信签名不一致,会导致没有跳转.回调....一般在微信开发者上面注册的是正式环境打包好的.) 申请微信开发者账号.应用申请省略. 1. AndroidManifest.xml 权限 <!--

  • Android调用第三方QQ登录代码分享

    本文为大家分享了调用QQ登录的相关代码,希望对大家有帮助,减少项目开发的时间,具体内容如下 1.去QQ开放平台注册帐号(http://open.qq.com/),为应用申请QQ的APP_ID , 并下载相关的jar包,放到工程的lib目录下. 2.在Manifest.xml里注册QQ相关的Activity,代码如下 <activity android:name="com.tencent.connect.common.AssistActivity" android:screenOr

  • Android第三方登录之QQ登录

    本文实例为大家分享了Android第三方登录之QQ的具体代码,供大家参考,具体内容如下 第三方登录之QQ 代码区 public class MainActivity extends AppCompatActivity { private Button btn; private TextView tv; private ImageView image; @Override protected void onCreate(Bundle savedInstanceState) { super.onCr

  • Android 第三方登录、分享(ShareSDK、友盟)

    为下边的项目做准备,写一个第三方登录.分享的demo.分别使用sharesdk和友盟来实现. 先说一下我对两者的使用上的感觉,个人感觉sharesdk比友盟更好一点,好在哪里呢?好在人工服务上.在集成的过程中遇到了各种问题,但是sharesdk的人工服务做的很好,能给答疑解惑,提供解决问题的方法! 接下来上代码(本文使用android studio开发,sharesdk版本v2.7.7,友盟版本v6.0.0): 一.使用sharesdk(sharesdk版本v2.7.7)来集成: 1.要去官网:

  • Android使用友盟集成QQ、微信、微博等第三方分享与登录方法详解

    最近项目需要加入第三方分享和登录功能,之前其他项目的第三方分享和登录一直都使用ShareSDK实现的.为了统一使用友盟的全家桶,所以三方分享和登录也就选择了友盟.这里记录一下完整的集成与使用流程. 1.申请友盟Appkey 直接到友盟官网申请即可 2.下载SDK 下载地址:http://dev.umeng.com/social/android/sdk-download 下载的时候根据自己需求进行选择,我这里选择选择的是精简版(包含常用的分享与登录功能),只测试微信,QQ,新浪微博. 下载后解压出

  • Android 友盟第三方登录与分享的实现代码

    前言 最近项目中又一次需要集成友盟的三方登录与分享,之前没有记录过,所以这次来写一下... 准备工作 1.注册友盟账号创建应用,获取key:申请地址 http://www.umeng.com 2.对对应的平台(腾讯.微信.新浪等等)申请第三方账号,获取key和密码 集成步骤 因为shareSDK分享与第三方登录集成方式类似(共用jar包),所以我就一起说了. 1.下载shareSDK分享的SDK 下载地址: https://developer.umeng.com/sdk 2.导入jar与res

  • Android实现QQ的第三方登录和分享

    本文实例为大家分享了Android实现QQ的第三方登录的具体代码,供大家参考,具体内容如下 MainActivity.java /** * 实现QQ的第三方登录 * 1.搭建环境 (添加Jar包,添加Res图片,布局,Values资源,添加权限,配置Activity信息,修改Key值,build签名配置,Application初始化) * 2.写布局 * 3.登录的代码 * 注意:必须用真机测试 */ public class MainActivity extends AppCompatActi

  • Android 多渠道(友盟)打包教程分享

    我们在 app 正式发布的时候一定会使用正式签名的方式来打包,这种方式只能生成唯一的一个包,但是如今的应用商店非常多,如:小米.OPPO.360.百度.豌豆荚.应用宝等等.而我们只有一个 apk 文件要投入到这么多的应用商店中去,如果你的公司不需要统计每个应用商店的实际下载使用量的话,那倒是不会有这样的问题. 但是,如果你的公司就是需要统计每个商店的实际下载使用情况,那么你将如何去识别当前用户是从哪一个商店下载来的呢?出现问题原因是:我们使用的 apk 安装包当前仅有一个. 假设,我们可以向 a

  • React Native第三方平台分享的实例(Android,IOS双平台)

    本文主要介绍了React Native第三方平台分享的实例(Android,IOS双平台),分享给大家,具体如下: 源码已开源到Github,地址请点击:react-native-share[一行代码,双平台分享] 目前支持分享的平台有[QQ][QQ空间][微信][朋友圈][微博][FaceBook]  欢迎大家star,fork..... [ Android平台配置 ] 1. app目录下创建 libs 文件夹,添加依赖文件[直接复制源码中 libs 目录即可] 2. app / src /

  • 使用Android Studio Gradle实现友盟多渠道打包

    最新项目中要求在友盟后台看到不同渠道的统计,Android大大小小的应用市场要几百个,要一个一个手工打包那一天也干不完,还好是有大牛的,弄出了好多解决方法,就Gradle做一下记录和分享,首先看一些理论知识: 1.应用的打包签名 什么是打包? 打包就是根据签名和其他标识生成安装包. 签名是什么? 1.在android应用文件(apk)中保存的一个特别字符串 2.用来标识不同的应用开发者:开发者A,开发者B 3.一个应用开发者开发的多款应用使用同一个签名 就好比是一个人写文章,签名就相当于作者的署

随机推荐