Android 第三方登錄、分享(ShareSDK、友盟)
為下邊的項(xiàng)目做準(zhǔn)備,寫一個第三方登錄、分享的demo。分別使用sharesdk和友盟來實(shí)現(xiàn)。
先說一下我對兩者的使用上的感覺,個人感覺sharesdk比友盟更好一點(diǎn),好在哪里呢?好在人工服務(wù)上。在集成的過程中遇到了各種問題,但是sharesdk的人工服務(wù)做的很好,能給答疑解惑,提供解決問題的方法!
接下來上代碼(本文使用android studio開發(fā),sharesdk版本v2.7.7,友盟版本v6.0.0):
一、使用sharesdk(sharesdk版本v2.7.7)來集成:
1、要去官網(wǎng):http://www.mob.com/ 注冊賬號、添加應(yīng)用、下載sdk、分別去新浪、微信、QQ開放平臺注冊應(yīng)用,拿到key。準(zhǔn)備好這些,就讓咱們開始吧!
2、在清單文件中添加如下權(quán)限:
<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"/> <!-- 藍(lán)牙分享所需的權(quán)限 --> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
3、繼續(xù)添加Activity的信息,**此處注意tencent后面的appid要保持和您配置的QQ的appid一致**:
<!-- 調(diào)用QQ,需要注冊的回調(diào)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> <!-- 調(diào)用新浪原生SDK,需要注冊的回調(diào)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> <!-- 調(diào)用微信,需要注冊的回調(diào)activity --> <!--微信分享回調(diào) --> <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目錄下修改準(zhǔn)備好的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的值和微博應(yīng)用信息處的授權(quán)回調(diào)頁保持一致
5、去添加微信的回調(diào)
5.1、在包名的下邊建立一個名字為“wxapi”的包
5.2、把demo中的“WXEntryActivity”放進(jìn)去,注意,這個類不需要動,不需要手動調(diào)用??!

6、去寫代碼吧
提前準(zhǔn)備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 標(biāo)題 * @param text 內(nèi)容 * @param picurl 圖片鏈接 * * QQ和QQ空間設(shè)置分享鏈接使用setTitleUrl(); * 設(shè)置標(biāo)題:setTitle * 設(shè)置內(nèi)容:setText * 設(shè)置網(wǎng)絡(luò)圖片:oks.setImageUrl("http://f1.sharesdk.cn/imgs/2014/02/26/owWpLZo_638x960.jpg"); * 設(shè)置本地圖片: //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(); //關(guān)閉sso授權(quán) oks.disableSSOWhenAuthorize(); oks.setTitle(title); oks.setText(text); if(picurl!=null){ oks.setImageUrl(picurl); } // 啟動分享GUI oks.show(this); }
6.2、分享到指定平臺(此處使用微信和微博為例)
/** * 微信 在微信分享中,需要設(shè)置setShareType屬性,此處應(yīng)注意 * @param title * @param content * @param PicUrl * @param titleUrl * Platform.SHARE_TEXT(分享文本), Platform.SHARE_IMAGE(分享圖片), Platform.SHARE_WEBPAGE(分享網(wǎng)頁,既圖文分享), Platform.SHARE_MUSIC(分享音頻), Platform.SHARE_VIDEO(分享視頻), Platform.SHARE_APPS(分享應(yīng)用,僅微信支持), 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); // 標(biāo)題的超鏈接 } 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); // 設(shè)置分享事件回調(diào) // 執(zhí)行圖文分享 wx.share(sp); }
/** * 分享到微博 * @param text 文本內(nèi)容 * @param picUrl 網(wǎng)絡(luò)圖片 (文檔中說明分享圖片需要審核通過,測試中體現(xiàn)不需要) */ 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); // 設(shè)置分享事件回調(diào) // 執(zhí)行圖文分享 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();//單獨(dú)授權(quán),OnComplete返回的hashmap是空的 mPlatform.showUser(null);//授權(quán)并獲取用戶信息 }
6.4登錄和分享回調(diào)(此處分享和登錄使用的一個監(jiān)聽)
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集成常見分三種登錄分享方式就完成了,整個過程沒有遇到嚴(yán)重的問題,整體體驗(yàn)效果還不錯。上整體代碼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 文本內(nèi)容 * @param picUrl 網(wǎng)絡(luò)圖片 (通過審核后才能添加) */ 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); // 設(shè)置分享事件回調(diào) // 執(zhí)行圖文分享 weibo.share(sp); } /** * 分享到QQ空間 * @param title 標(biāo)題 * @param content 內(nèi)容 * @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); // 標(biāo)題的超鏈接 } if(PicUrl!=null){ sp.setImageUrl(PicUrl); } Platform qzone = PublicStaticData.myShareSDK.getPlatform (QZone.NAME); qzone. setPlatformActionListener (mPlatformActionListener); // 設(shè)置分享事件回調(diào) // 執(zhí)行圖文分享 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); // 標(biāo)題的超鏈接 } if(PicUrl!=null){ sp.setImageUrl(PicUrl); } Platform qq = PublicStaticData.myShareSDK.getPlatform (QQ.NAME); qq. setPlatformActionListener (mPlatformActionListener); // 設(shè)置分享事件回調(diào) // 執(zhí)行圖文分享 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); // 標(biāo)題的超鏈接 } 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); // 設(shè)置分享事件回調(diào) // 執(zhí)行圖文分享 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); // 標(biāo)題的超鏈接 } 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); // 設(shè)置分享事件回調(diào) // 執(zhí)行圖文分享 qq.share(sp); } /** * 微信 * @param title * @param content * @param PicUrl * @param titleUrl * Platform.SHARE_TEXT(分享文本), Platform.SHARE_IMAGE(分享圖片), Platform.SHARE_WEBPAGE(分享網(wǎng)頁,既圖文分享), Platform.SHARE_MUSIC(分享音頻), Platform.SHARE_VIDEO(分享視頻), Platform.SHARE_APPS(分享應(yīng)用,僅微信支持), 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); // 標(biāo)題的超鏈接 } 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); // 設(shè)置分享事件回調(diào) // 執(zhí)行圖文分享 wx.share(sp); } /** * 登錄 */ public static void Login(String name){ type="login"; Platform mPlatform = ShareSDK.getPlatform(name); mPlatform.setPlatformActionListener(mPlatformActionListener); mPlatform.authorize();//單獨(dú)授權(quán),OnComplete返回的hashmap是空的 mPlatform.showUser(null);//授權(quán)并獲取用戶信息 } 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://打開分享面板,直接調(diào)用上邊寫到的方法 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("微信收藏分享測試標(biāo)題sharesdk","微信收藏分享測試內(nèi)容sharesdk",picurl,null); break; case R.id.WXfriendsshare://朋友圈分享(微信需要有圖片) ShareSDKUtils.shareWXM("朋友圈分享測試標(biāo)題sharesdk","朋友圈分享測試內(nèi)容sharesdk",picurl,null); break; case R.id.WXshare://微信分享(微信需要有圖片) ShareSDKUtils.shareWX("微信分享測試標(biāo)題sharesdk","微信分享測試內(nèi)容sharesdk",picurl,null); break; case R.id.Sinashare://微博分享 ShareSDKUtils.shareSina("Sina分享測試sharesdk",null,MainActivity.this); break; case R.id.QZONEshare://空間 ShareSDKUtils.shareQzone("Qzone分享測試標(biāo)題sharesdk","Qzone分享測試內(nèi)容sharesdk",picurl,null); break; case R.id.QQshare://QQ ShareSDKUtils.shareQQ("Qzone分享測試標(biāo)題sharesdk","Qzone分享測試內(nèi)容sharesdk",picurl,null); break;
二、使用友盟來集成(友盟版本v6.0.0(精簡版)):
1、此處省略注冊、下載sdk、準(zhǔn)備key的過程,直接從集成開始。
2、權(quán)限:
<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信息(此處使用微博精簡版,新浪微博不需要回調(diào)Activity)**此處注意tencent后面的appid要保持和您配置的QQ的appid一致**:
<!-- ###################添加UmengAppkey###################### --> <meta-data android:name="UMENG_APPKEY" android:value="577c404367e58e6b1f001a40"> </meta-data> <!-- 調(diào)用微信,需要注冊的回調(diào)activity --> <activity android:name=".wxapi.WXEntryActivity" android:configChanges="keyboardHidden|orientation|screenSize" android:exported="true" android:screenOrientation="portrait" android:theme="@android:style/Theme.Translucent.NoTitleBar" /> <!-- 調(diào)用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";//您新浪后臺的回調(diào)地址 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 標(biāo)題 * @param context 內(nèi)容 * @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分享監(jiān)聽回調(diào)
/** * 分享監(jiān)聽 */ 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 登錄回調(diào)
/** * 第三方登錄監(jiān)聽 */ public static UMAuthListener umAuthListener = new UMAuthListener() { @Override public void onComplete(SHARE_MEDIA platform, int action, Map<String, String> data) { Toast.makeText(myActivity, "授權(quán)成功", Toast.LENGTH_SHORT).show(); Log.e("data",data.toString()); } @Override public void onError(SHARE_MEDIA platform, int action, Throwable t) { Toast.makeText( myActivity, "授權(quán)失敗", Toast.LENGTH_SHORT).show(); Log.e("data",t.toString()+""); } @Override public void onCancel(SHARE_MEDIA platform, int action) { Toast.makeText( myActivity, "關(guān)閉授權(quán)", Toast.LENGTH_SHORT).show(); Log.e("data","關(guān)閉授權(quán)"); } };
5.在一些低端手機(jī)上可能會出現(xiàn)QQ沒有回調(diào)的情況,需要在Activity中添加如下代碼:
/** * 友盟QQ登錄需要的回調(diào) 在有些低端手機(jī)上登錄之后不走回調(diào),需要這個方法 * @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、同樣是沒有回調(diào),這次是微信,需要在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 標(biāo)題 * @param context 內(nèi)容 * @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); } /** * 第三方登錄監(jiān)聽 */ public static UMAuthListener umAuthListener = new UMAuthListener() { @Override public void onComplete(SHARE_MEDIA platform, int action, Map<String, String> data) { Toast.makeText(myActivity, "授權(quán)成功", Toast.LENGTH_SHORT).show(); Log.e("data",data.toString()); } @Override public void onError(SHARE_MEDIA platform, int action, Throwable t) { Toast.makeText( myActivity, "授權(quán)失敗", Toast.LENGTH_SHORT).show(); Log.e("data",t.toString()+""); } @Override public void onCancel(SHARE_MEDIA platform, int action) { Toast.makeText( myActivity, "關(guān)閉授權(quán)", Toast.LENGTH_SHORT).show(); Log.e("data","關(guān)閉授權(quán)"); } }; /** * 分享監(jiān)聽 */ 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,"測試收藏","測試收藏內(nèi)容",SHARE_MEDIA.WEIXIN_FAVORITE,picurl); break; case R.id.WXfriendsshareUmeng://朋友圈分享(微信需要有圖片) UmengShare.SharePic(MainActivity.this,"測試朋友圈","測試朋友圈內(nèi)容",SHARE_MEDIA.WEIXIN_CIRCLE,picurl); break; case R.id.WXshareUmeng://微信分享(微信需要有圖片) UmengShare.SharePic(MainActivity.this,"測試分享","測試分享內(nèi)容",SHARE_MEDIA.WEIXIN,picurl); break; case R.id.SinashareUmeng://微博分享 UmengShare.SharePic(MainActivity.this,"測試微博","測試微博內(nèi)容",SHARE_MEDIA.SINA,null); break; case R.id.QZONEshareUmeng://空間 UmengShare.SharePic(MainActivity.this,"測試空間","測試空間內(nèi)容",SHARE_MEDIA.QZONE,null); break; case R.id.QQshareUmeng://QQ UmengShare.SharePic(MainActivity.this,"測試QQ","測試QQ內(nèi)容",SHARE_MEDIA.QQ,null); break;
最后,兩種方式都集成好了,小伙伴們趕緊去使用吧。本人能力有效,如果bug純屬正常!建議使用ShareSDK!
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android仿泡泡窗實(shí)現(xiàn)下拉菜單條實(shí)例代碼
最近參與android的項(xiàng)目開發(fā),其中遇到這樣的需求:點(diǎn)擊下拉按鈕,顯示出所有的條目,有刪除和點(diǎn)擊功能,點(diǎn)擊后將條目顯示。下面通過實(shí)例代碼給大家介紹下Android仿泡泡窗實(shí)現(xiàn)下拉菜單條效果,需要的朋友參考下吧2017-05-05Android自定義View實(shí)現(xiàn)閃耀字體效果
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)閃耀字體效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-01-01Android RxJava異步數(shù)據(jù)處理庫使用詳解
RxJava是一種異步數(shù)據(jù)處理庫,也是一種擴(kuò)展的觀察者模式。對于Android開發(fā)者來說,使用RxJava時也會搭配RxAndroid,它是RxJava針對Android平臺的一個擴(kuò)展,用于Android 開發(fā),它提供了響應(yīng)式擴(kuò)展組件,使用RxAndroid的調(diào)度器可以解決Android多線程問題2022-11-11Kotlin方法與Lambda表達(dá)式實(shí)踐使用介紹
這篇文章主要介紹了Kotlin方法與Lambda表達(dá)式實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-09-09Android TabLayout設(shè)置指示器寬度的方法
本篇文章主要介紹了Android TabLayout設(shè)置指示器寬度的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-04-04Android性能調(diào)優(yōu)利器StrictMode應(yīng)用分析
StrictMode意思為嚴(yán)格模式,是用來檢測程序中違例情況的開發(fā)者工具。最常用的場景就是檢測主線程中本地磁盤和網(wǎng)絡(luò)讀寫等耗時的操作。這篇文章給大家介紹Android性能調(diào)優(yōu)利器StrictMode應(yīng)用分析,感興趣的朋友一起看看吧2018-01-01Android利用CircleImageView實(shí)現(xiàn)圓形頭像的方法
這篇文章主要介紹了Android利用CircleImageView實(shí)現(xiàn)圓形頭像的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-10-10淺談Android開發(fā)Webview的Loading使用效果
這篇文章主要為大家介紹了淺談Android開發(fā)Webview的Loading使用效果詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02