史上最具体Android集成QQ,微信,微博分享(不用第三方)持续更新中
- QQ
- 下載sdk并執(zhí)行demo
- 各種配置
- IUiListener
- 分享圖片
- 分享到QQ
- 分享到QZONE
- Sina微博
- 配置
- 選擇集成sdk方式
- 分享圖片
- 微信
- 朋友
- 朋友圈
- QQ
如今項(xiàng)目中用個(gè)第三方登錄。或分享已經(jīng)不是什么稀奇事了。可是要想把這個(gè)功能做好,那可就不easy了。預(yù)計(jì)到這里就有人會(huì)說了,扯犢子,這玩意,我用第三方sdk,什么umeng,sharesdk分分鐘給你做出來,可是這些第三方sdk僅僅有對(duì)項(xiàng)目的分享要求不高的時(shí)候才適合,假設(shè)要定制分享,那我就僅僅能呵呵。盡管第三方登錄或分享沒什么技術(shù)難度,可是各種配置,并且每個(gè)都不太一樣,少配置一個(gè)地方代碼就通只是了,所以基于上問題。特寫此文以備不時(shí)之需。
好。上面扯太多了。如今正式上代碼,我們先從QQ入手,你問為什么,由于他最簡(jiǎn)單呀
下載sdk并執(zhí)行demo
首先不得不吐槽一個(gè)問題,就是騰訊的文檔是最全的,全的你都找不到在哪里,點(diǎn)擊這里能夠查看官方文檔這里下載官方demo下載
另外,由于官方文檔太難找了,特上此圖
首先下載sdk,我下載的版本號(hào)是Android_SDK_V2.9.4,解壓后文件夾如圖所看到的
其它jar文件夾以下是須要加入你的項(xiàng)目依賴中去的jar包。sample就是顧名思義啦。能夠直接將他導(dǎo)入eclipse,并更編碼為utf-8,只是當(dāng)前版本號(hào)的demo配置有點(diǎn)問題。導(dǎo)入完畢后會(huì)有例如以下錯(cuò)誤
只是別急,我們程序猿最擅長解決這樣的問了,再說有什么問題能難倒我聰明的程序猿呢
首先我們能夠隨便打開一個(gè)文件,能夠查看到時(shí)找不到這樣的包c(diǎn)om.tencent.tauth.IRequestListener,這我們第一反應(yīng)肯定是,沒有加入依賴包。臥槽,真聰明,恭喜你答對(duì)了,呵呵~
既然這樣那問題就簡(jiǎn)單了。直接拷貝jar文件夾以下jar包放到libs,并add path(假設(shè)須要),這下整個(gè)世界都清凈了,錯(cuò)誤統(tǒng)統(tǒng)滾開了,如今就能夠執(zhí)行看看效果
各種配置
配置權(quán)限
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- SDK2.1新增獲取用戶位置信息 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <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.GET_TASKS"/>配置activity
<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" /><!-- 這地方的123456須要用你在開放平臺(tái)申請(qǐng)的appid替換 --><data android:scheme="tencent123456" /></intent-filter> </activity><activity android:name="com.tencent.connect.common.AssistActivity"android:configChanges="orientation|keyboardHidden"android:screenOrientation="behind"android:theme="@android:style/Theme.Translucent.NoTitleBar" />到這里我們的清單文件和activity都配置完了,接下來我要實(shí)例化Tencent類,全部的操作都是通過他來的,查看demo這個(gè)類的實(shí)例化是在MainActivity#onCreate方法中,并弄成了單例
public static Tencent mTencent;if (mTencent == null) {mTencent = Tencent.createInstance(mAppid, this); }IUiListener
如今我們須要在分享或登錄的過程中拿到一些狀態(tài),就須要用到IUiListener,調(diào)用SDK已經(jīng)封裝好的接口時(shí)。比如:登錄、高速支付登錄、應(yīng)用分享、應(yīng)用邀請(qǐng)等接口,需傳入該回調(diào)的實(shí)例。
IUiListener qqShareListener = new IUiListener() {@Overridepublic void onCancel() {if (shareType != QQShare.SHARE_TO_QQ_TYPE_IMAGE) {Util.toastMessage(QQShareActivity.this, "onCancel: ");}}@Overridepublic void onComplete(Object response) {// TODO Auto-generated method stubUtil.toastMessage(QQShareActivity.this, "onComplete: " + response.toString());}@Overridepublic void onError(UiError e) {// TODO Auto-generated method stubUtil.toastMessage(QQShareActivity.this, "onError: " + e.errorMessage, "e");} };//假設(shè)要收到QQ分享,或登錄的一些狀態(tài),必須加入代碼 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {Tencent.onActivityResultData(requestCode,resultCode,data,listener); }分享圖片
我這僅僅貼我們今天用到的代碼。其它的大家能夠直接在demo里面復(fù)制。本文主要內(nèi)容是。記錄一些配置。而并非貼代碼
分享到QQ
public void shareOnlyImageOnQQ(View view) {final Bundle params = new Bundle();params.putString(QQShare.SHARE_TO_QQ_IMAGE_LOCAL_URL, Environment.getExternalStorageDirectory().getAbsolutePath().concat("/a.png"));params.putString(QQShare.SHARE_TO_QQ_APP_NAME, "測(cè)試應(yīng)用");params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_IMAGE); // params.putInt(QQShare.SHARE_TO_QQ_EXT_INT, QQShare.SHARE_TO_QQ_FLAG_QZONE_AUTO_OPEN); //打開這句話,能夠?qū)崿F(xiàn)分享純圖到QQ空間doShareToQQ(params); }private void doShareToQQ(final Bundle params) {// QQ分享要在主線程做ThreadManager.getMainHandler().post(new Runnable() {@Overridepublic void run() {if (null != mTencent) {mTencent.shareToQQ(QQActivity.this, params, qqShareListener);}}}); }分享到QZONE
截止到2016-4-8。QZONE暫不支持純圖片分享,官網(wǎng)文檔這里也有說。
可是我們能夠通過分享到QQ時(shí)設(shè)置一個(gè)參數(shù)。就能夠直接分享純圖到QQ空間了
public void shareOnlyImageOnQZone(View view) {final Bundle params = new Bundle();//本地地址一定要傳sdcard路徑,不要什么getCacheDir()或getFilesDir()params.putString(QQShare.SHARE_TO_QQ_IMAGE_LOCAL_URL, Environment.getExternalStorageDirectory().getAbsolutePath().concat("/a.png"));params.putString(QQShare.SHARE_TO_QQ_APP_NAME, "測(cè)試應(yīng)用");params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_IMAGE);params.putInt(QQShare.SHARE_TO_QQ_EXT_INT, QQShare.SHARE_TO_QQ_FLAG_QZONE_AUTO_OPEN); //打開這句話,能夠?qū)崿F(xiàn)分享純圖到QQ空間doShareToQQ(params); }注意:這里有個(gè)非常重要的就是,分享本地圖片時(shí)路徑一定不要傳getCacheDir()或getFilesDir()等。
不要問我為什么,由于你既然是分享圖片到QQ。他要幫我顯示,但你給他一個(gè)私有文件夾。他肯定不能顯示。那種重點(diǎn)來了。這就到導(dǎo)致非常多朋友在做分享時(shí)。分享的圖片不能顯示得原因了。
別我是怎么知道的。我說我猜的,你信么~~
QQ實(shí)例完整代碼,由于肯定問了,既然上面貼了部分代碼,為啥以下還要全貼處理。這你就不懂了吧,上面我僅僅貼了部分,可是他們沒多大的關(guān)聯(lián)性。可能不太好理解,而我希望的就是。大家一看看就明確了,不須要再下載demo再在手機(jī)上跑一遍,就能解決這個(gè)問題。效果才是王道
package cn.woblog.testthirdpartyfunction.activity;import android.content.Intent; import android.os.Bundle; import android.os.Environment; import android.support.v7.app.AppCompatActivity; import android.view.View;import com.tencent.connect.share.QQShare; import com.tencent.open.utils.ThreadManager; import com.tencent.tauth.IUiListener; import com.tencent.tauth.Tencent; import com.tencent.tauth.UiError;import cn.woblog.testthirdpartyfunction.R; import cn.woblog.testthirdpartyfunction.Util;public class QQActivity extends AppCompatActivity {public static Tencent mTencent;private static final String mAppid = "1105245621";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_qq);if (mTencent == null) {mTencent = Tencent.createInstance(mAppid, this);}}public void shareOnlyImageOnQZone(View view) {final Bundle params = new Bundle();//本地地址一定要傳sdcard路徑,不要什么getCacheDir()或getFilesDir()params.putString(QQShare.SHARE_TO_QQ_IMAGE_LOCAL_URL, Environment.getExternalStorageDirectory().getAbsolutePath().concat("/a.png"));params.putString(QQShare.SHARE_TO_QQ_APP_NAME, "測(cè)試應(yīng)用");params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_IMAGE);params.putInt(QQShare.SHARE_TO_QQ_EXT_INT, QQShare.SHARE_TO_QQ_FLAG_QZONE_AUTO_OPEN); //打開這句話,能夠?qū)崿F(xiàn)分享純圖到QQ空間doShareToQQ(params);}public void shareOnlyImageOnQQ(View view) {final Bundle params = new Bundle();params.putString(QQShare.SHARE_TO_QQ_IMAGE_LOCAL_URL, Environment.getExternalStorageDirectory().getAbsolutePath().concat("/a.png"));params.putString(QQShare.SHARE_TO_QQ_APP_NAME, "測(cè)試應(yīng)用");params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_IMAGE); // params.putInt(QQShare.SHARE_TO_QQ_EXT_INT, QQShare.SHARE_TO_QQ_FLAG_QZONE_AUTO_OPEN); //打開這句話。能夠?qū)崿F(xiàn)分享純圖到QQ空間doShareToQQ(params);}private void doShareToQQ(final Bundle params) {// QQ分享要在主線程做ThreadManager.getMainHandler().post(new Runnable() {@Overridepublic void run() {if (null != mTencent) {mTencent.shareToQQ(QQActivity.this, params, qqShareListener);}}});}IUiListener qqShareListener = new IUiListener() {@Overridepublic void onCancel() {Util.toastMessage(QQActivity.this, "onCancel: ");}@Overridepublic void onComplete(Object response) {// TODO Auto-generated method stubUtil.toastMessage(QQActivity.this, "onComplete: " + response.toString());}@Overridepublic void onError(UiError e) {// TODO Auto-generated method stubUtil.toastMessage(QQActivity.this, "onError: " + e.errorMessage, "e");}};@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {Tencent.onActivityResultData(requestCode, resultCode, data, qqShareListener);} }Sina(微博)
我們到官方文檔下載對(duì)應(yīng)的官方demo并且多看看項(xiàng)目的ReadeMe。寫的非常具體讓你少走彎路。
解壓后項(xiàng)目結(jié)構(gòu)如圖所看到的:
假設(shè)是第一次集成。我們能夠直接執(zhí)行WeiboSDKDemo_v3.1.4.apk先查看效果,這樣也方便你對(duì)他的功能和效果有一個(gè)大概了解,當(dāng)如也能夠直接導(dǎo)入demo-src文件夾以下的代碼,
通過這樣的方式執(zhí)行project時(shí),請(qǐng)務(wù)必替換默認(rèn)的 debug.keystore文件,否則無法正確的授權(quán)成功。
另外,該debug.keysotre 是新浪官方的,除了編譯執(zhí)行官方 DEMO 外,請(qǐng)不要直接使用它,出于安全的考慮。您應(yīng)該為自己的應(yīng)用提供一份 keysotre。
在C:\Users\XXXXX.android文件夾下,把Android默認(rèn)的debug.keystore替換成當(dāng)前微博demo里面提供debug.keystore。
配置
在集成微博前,須要到新浪微博官網(wǎng)創(chuàng)建一個(gè)應(yīng)用。在控制臺(tái)-基本信息菜單里面填上包名和簽名,簽名通過簽名工具獲取工具這里獲取
配置權(quán)限,假設(shè)已經(jīng)加入了對(duì)應(yīng)的權(quán)限。就不要反復(fù)加入了
<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.WRITE_EXTERNAL_STORAGE" />配置返回微博的activity
在進(jìn)行微博分享前。須要在AndroidManifest.xml中,在須要接收消息的Activity(喚起微博主程序的類)里聲明對(duì)應(yīng)的Action:ACTION_SDK_REQ_ACTIVITY,例如以下所看到的:
<!--sina--> <activity android:name="com.sina.weibo.sdk.component.WeiboSdkBrowser"android:configChanges="keyboardHidden|orientation"android:windowSoftInputMode="adjustResize"android:exported="false" > </activity> <service android:name="com.sina.weibo.sdk.net.DownloadService"android:exported="false"> </service><!--\sina--><activity android:name=".activity.QQActivity"> </activity> <activity android:name=".activity.SinaActivity"><!-- 調(diào)用新浪原生SDK。須要注冊(cè)的回調(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>選擇集成sdk方式
在集成微博SDK前,有兩種方式來集成微博SDK:
- 直接導(dǎo)入weibosdkcore.jar:適用于僅僅須要授權(quán)、分享、網(wǎng)絡(luò)請(qǐng)求框架功能的項(xiàng)目
- 引用WeiboSDKproject(Library):適用于微博授權(quán)、分享,以及須要登陸button、調(diào)用OpenAPI的項(xiàng)目
在這里我採用方式1。由于我不須要登錄button和直接調(diào)用OpenAPI
分享圖片
WeiboMessage weiboMessage = new WeiboMessage(); ImageObject imageObject = new ImageObject(); Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher); imageObject.setImageObject(bitmap); weiboMessage.mediaObject = imageObject; SendMessageToWeiboRequest request = new SendMessageToWeiboRequest(); request.transaction = String.valueOf(System.currentTimeMillis()); request.message = weiboMessage; mWeiboShareAPI.sendRequest(SinaActivity.this, request);假設(shè)配置沒問題的話,到這一步已經(jīng)是能夠分享得了,假設(shè)遇到什么問題。請(qǐng)?jiān)谙路皆u(píng)論,我一定會(huì)回復(fù)的
package cn.woblog.testthirdpartyfunction.activity;import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Toast;import com.sina.weibo.sdk.api.ImageObject; import com.sina.weibo.sdk.api.WeiboMessage; 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.SendMessageToWeiboRequest; import com.sina.weibo.sdk.api.share.WeiboShareSDK; import com.sina.weibo.sdk.constant.WBConstants;import cn.woblog.testthirdpartyfunction.Constants; import cn.woblog.testthirdpartyfunction.R;public class SinaActivity extends AppCompatActivity implements IWeiboHandler.Response {private IWeiboShareAPI mWeiboShareAPI;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_sina);// 創(chuàng)建微博分享接口實(shí)例mWeiboShareAPI = WeiboShareSDK.createWeiboAPI(this, Constants.APP_KEY);// 注冊(cè)第三方應(yīng)用到微博client中,注冊(cè)成功后該應(yīng)用將顯示在微博的應(yīng)用列表中。// 但該附件欄集成分享權(quán)限須要合作申請(qǐng)。詳情請(qǐng)查看 Demo 提示// NOTE:請(qǐng)務(wù)必提前注冊(cè),即界面初始化的時(shí)候或是應(yīng)用程序初始化時(shí),進(jìn)行注冊(cè)mWeiboShareAPI.registerApp();// 當(dāng) Activity 被又一次初始化時(shí)(該 Activity 處于后臺(tái)時(shí)。可能會(huì)由于內(nèi)存不足被殺掉了)。// 須要調(diào)用 {@link IWeiboShareAPI#handleWeiboResponse} 來接收微博client返回的數(shù)據(jù)。// 執(zhí)行成功,返回 true,并調(diào)用 {@link IWeiboHandler.Response#onResponse};// 失敗返回 false。不調(diào)用上述回調(diào)if (savedInstanceState != null) {mWeiboShareAPI.handleWeiboResponse(getIntent(), this);}}public void testShareImage(View view) {WeiboMessage weiboMessage = new WeiboMessage();ImageObject imageObject = new ImageObject();Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);imageObject.setImageObject(bitmap);weiboMessage.mediaObject = imageObject;SendMessageToWeiboRequest request = new SendMessageToWeiboRequest();request.transaction = String.valueOf(System.currentTimeMillis());request.message = weiboMessage;mWeiboShareAPI.sendRequest(SinaActivity.this, request);}@Overrideprotected void onNewIntent(Intent intent) {super.onNewIntent(intent);// 從當(dāng)前應(yīng)用喚起微博并進(jìn)行分享后。返回到當(dāng)前應(yīng)用時(shí),須要在此處調(diào)用該函數(shù)// 來接收微博client返回的數(shù)據(jù);執(zhí)行成功,返回 true,并調(diào)用// {@link IWeiboHandler.Response#onResponse}。失敗返回 false,不調(diào)用上述回調(diào)mWeiboShareAPI.handleWeiboResponse(intent, this);}/*** 接收微client博請(qǐng)求的數(shù)據(jù)。* 當(dāng)微博client喚起當(dāng)前應(yīng)用并進(jìn)行分享時(shí),該方法被調(diào)用。
* * @param baseResp 微博請(qǐng)求數(shù)據(jù)對(duì)象 * @see {@link IWeiboShareAPI#handleWeiboRequest} */
@Override public void onResponse(BaseResponse baseResp) { if (baseResp != null) { switch (baseResp.errCode) { case WBConstants.ErrorCode.ERR_OK: Toast.makeText(this, "success", Toast.LENGTH_LONG).show(); break; case WBConstants.ErrorCode.ERR_CANCEL: Toast.makeText(this, "cancel", Toast.LENGTH_LONG).show(); break; case WBConstants.ErrorCode.ERR_FAIL: Toast.makeText(this, "Error Message: " + baseResp.errMsg, Toast.LENGTH_LONG).show(); break; } } } }微信
說道微信又不得不吐槽了,要想獲得微信登錄。還得是企業(yè)賬戶才干申請(qǐng)。還得交錢,你說這叫什么事
首先我打開微信開發(fā)人員官網(wǎng),注冊(cè)個(gè)賬號(hào)或者用已有的賬號(hào)登錄,在管理中心創(chuàng)建應(yīng)用并提交審核,審?fù)晖戤吚缫韵聢D。
能夠看到我們已經(jīng)獲得,分享到朋友圈或朋友的權(quán)限,微信登錄等還須要申請(qǐng)。那我如今僅僅有先測(cè)試分享了
首先我們來到開發(fā)人員官網(wǎng)文檔下載對(duì)應(yīng)的sdk和開發(fā)文檔
這當(dāng)中我僅僅下載了例如以下sdk
第一個(gè)是:獲取簽名的,只是我感覺不太好用,由于他沒有復(fù)制簽名的button,每次還得照著一個(gè)一個(gè)打出來,我推薦用微博的簽名工具
第二個(gè)是:使用微信分享、登錄、收藏、支付等功能須要的庫以及文件
第三個(gè)是:范例代碼。包括了一個(gè)完整的范例project。該范例的使用能夠參閱Android平臺(tái)上手指南
首先我們用eclipse導(dǎo)入演示樣例代碼,替換當(dāng)前文件夾下的keystore。然后執(zhí)行就能夠查看相關(guān)演示樣例
以下我們就應(yīng)該來安裝官方文檔來集成sdk了
首先在官網(wǎng)創(chuàng)建一個(gè)應(yīng)用。獲取到AppId,然后把剛剛下載的sdk包里面的libammsdk.jar復(fù)制到你的項(xiàng)目libs文件夾下。并加入到path(假設(shè)須要)
配置權(quán)限:
講到這里,有的吐槽了,你看看這個(gè)排版,簡(jiǎn)直是差評(píng)
在看看我們以下的代碼。這排版,這樣是,一看就是非常帥的人寫的~~
<uses-permission android:name="android.permission.INTERNET"/> <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"/>配置activity
由于我們要接受微信分享的一些信息,比方:分享成功或失敗
這一步非常重要,配置錯(cuò)誤將收不到消息,在你的包名根文件夾下創(chuàng)建wxapi包。然后在該包下創(chuàng)建activity命名為WXEntryActivity并實(shí)現(xiàn)IWXAPIEventHandler接口,基本代碼例如以下:
package cn.woblog.testthirdpartyfunction.wxapi;import android.os.Bundle; import android.support.v7.app.AppCompatActivity;import com.tencent.mm.sdk.openapi.BaseReq; import com.tencent.mm.sdk.openapi.BaseResp; import com.tencent.mm.sdk.openapi.IWXAPIEventHandler;import cn.woblog.testthirdpartyfunction.R;public class WXEntryActivity extends AppCompatActivity implements IWXAPIEventHandler {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_wxentry);}// 微信發(fā)送請(qǐng)求到第三方應(yīng)用時(shí),會(huì)回調(diào)到該方法@Overridepublic void onReq(BaseReq baseReq) {}// 第三方應(yīng)用發(fā)送到微信的請(qǐng)求處理后的響應(yīng)結(jié)果,會(huì)回調(diào)到該方法@Overridepublic void onResp(BaseResp baseResp) {} }載清單文件中配置你的activity
<activity android:name=".wxapi.WXEntryActivity" android:exported="true"> </activity>創(chuàng)建實(shí)例,并注冊(cè)到微信
“`java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wxentry);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
//假設(shè)分享的時(shí)候,該已經(jīng)開啟,那么微信開始這個(gè)activity時(shí)。會(huì)調(diào)用onNewIntent,所以這里要處理微信的返回結(jié)果
setIntent(intent);
WxActivity.api.handleIntent(intent, this);
}
朋友
這里就簡(jiǎn)單了。直接調(diào)用上面的方法
share2Wx(true);
朋友圈
share2Wx(false);<div class="se-preview-section-delimiter"></div>這里是這個(gè)分享的完整代碼
package cn.woblog.testthirdpartyfunction.activity;import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View;import com.tencent.mm.sdk.openapi.IWXAPI; import com.tencent.mm.sdk.openapi.SendMessageToWX; import com.tencent.mm.sdk.openapi.WXAPIFactory; import com.tencent.mm.sdk.openapi.WXImageObject; import com.tencent.mm.sdk.openapi.WXMediaMessage; import com.tencent.mm.sdk.platformtools.Util;import cn.woblog.testthirdpartyfunction.Constants; import cn.woblog.testthirdpartyfunction.R;public class WxActivity extends AppCompatActivity {private static final int THUMB_SIZE = 150;public static IWXAPI api;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_wx);// 通過WXAPIFactory工廠,獲取IWXAPI的實(shí)例api = WXAPIFactory.createWXAPI(this, Constants.WX_APP_ID, false);// 將該app注冊(cè)到微信api.registerApp(Constants.WX_APP_ID);}/*** 分享一張圖片到朋友** @param view*/public void testShareImage2friend(View view) {share2Wx(true);}/*** 分享一張圖片到朋友圈** @param view*/public void testShareImage2friends(View view) {share2Wx(false);}/*** @param isShareFriend true 分享到朋友,false分享到朋友圈*/private void share2Wx(boolean isShareFriend) {Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);WXImageObject imgObj = new WXImageObject(bitmap);WXMediaMessage msg = new WXMediaMessage();msg.mediaObject = imgObj;Bitmap thumbBmp = Bitmap.createScaledBitmap(bitmap, THUMB_SIZE, THUMB_SIZE, true);//縮略圖大小bitmap.recycle();msg.thumbData = Util.bmpToByteArray(thumbBmp, true); // 設(shè)置縮略圖SendMessageToWX.Req req = new SendMessageToWX.Req();req.transaction = buildTransaction("img");req.message = msg;req.scene = isShareFriend ?SendMessageToWX.Req.WXSceneSession : SendMessageToWX.Req.WXSceneTimeline; api.sendReq(req); } private String buildTransaction(final String type) { return (type == null) ? String.valueOf(System.currentTimeMillis()) : type + System.currentTimeMillis(); } }
另外說點(diǎn)題外話。鑒于我是有點(diǎn)強(qiáng)迫癥的人,所以在代碼以及文字的組織和代碼的格式化都保持良好的風(fēng)格,特別是代碼的格式,我都是每次先自己寫一遍,然后在從開發(fā)工具里拷貝出來。有時(shí)還得按tad一點(diǎn)一點(diǎn)點(diǎn)縮進(jìn)(假設(shè)哪位大神有更好的方法。希望不吝賜教下)。才貼到這上面了,以為我認(rèn)為既然要寫博客就要寫好,這要才對(duì)別人有幫助,在我認(rèn)為假設(shè)文字排版或者代碼格式亂亂的,就是耍流氓。
上面的測(cè)試的代碼我放到github了,有什么問題能夠直接評(píng)論或者在github上創(chuàng)建issure
假設(shè)我的文章對(duì)來帶來的幫助,可加我微信。微博,QQ什么啥的交個(gè)朋友也是不錯(cuò)的。另外微信。微博都會(huì)不定期發(fā)一些優(yōu)質(zhì)的文章,感謝大家的支持~~
轉(zhuǎn)載于:https://www.cnblogs.com/jzdwajue/p/7268464.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的史上最具体Android集成QQ,微信,微博分享(不用第三方)持续更新中的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HDU 2072 单词数
- 下一篇: PL/SQL 包的概念及创建使用