現(xiàn)在項(xiàng)目中用個(gè)第三方登錄,或分享已經(jīng)不是什么稀奇事了,但是要想把這個(gè)功能做好,那可就不容易了。估計(jì)到這里就有人會(huì)說(shuō)了,扯犢子,這玩意,我用第三方sdk,什么umeng,sharesdk分分鐘給你做出來(lái),可是這些第三方sdk只有對(duì)項(xiàng)目的分享要求不高的時(shí)候才適合,如果要定制分享,那我就只能呵呵。雖然第三方登錄或分享沒(méi)什么技術(shù)難度,但是各種配置,而且每一個(gè)都不太一樣,少配置一個(gè)地方代碼就通不過(guò)了,所以基于上問(wèn)題,特寫此文以備不時(shí)之需。
好,上面扯太多了,現(xiàn)在正式上代碼,我們先從QQ入手,你問(wèn)為什么,因?yàn)樗詈?jiǎn)單呀
下載sdk并運(yùn)行demo
首先不得不吐槽一個(gè)問(wèn)題,就是騰訊的文檔是最全的,全的你都找不到在哪里,點(diǎn)擊這里可以查看官方文檔這里下載官方demo下載
另外,由于官方文檔太難找了,特上此圖
首先下載sdk,我下載的版本是Android_SDK_V2.9.4,解壓后目錄如圖所示
其他jar目錄下面是需要添加你的項(xiàng)目依賴中去的jar包,sample就是顧名思義啦,可以直接將他導(dǎo)入eclipse,并更編碼為utf-8,不過(guò)當(dāng)前版本的demo配置有點(diǎn)問(wèn)題,導(dǎo)入完成后會(huì)有如下錯(cuò)誤
不過(guò)別急,我們程序員最擅長(zhǎng)解決這種問(wèn)了,再說(shuō)有什么問(wèn)題能難倒我聰明的程序員呢
首先我們可以隨便打開(kāi)一個(gè)文件,可以查看到時(shí)找不到這樣的包c(diǎn)om.tencent.tauth.IRequestListener,這我們第一反應(yīng)肯定是,沒(méi)有加入依賴包,臥槽,真聰明,恭喜你答對(duì)了,呵呵~
既然這樣那問(wèn)題就簡(jiǎn)單了,直接拷貝jar目錄下面jar包放到libs,并add path(如果需要),這下整個(gè)世界都清凈了,錯(cuò)誤統(tǒng)統(tǒng)滾開(kāi)了,現(xiàn)在就可以運(yùn)行看看效果
各種配置
配置權(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需要用你在開(kāi)放平臺(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都配置完了,接下來(lái)我要實(shí)例化Tencent類,所有的操作都是通過(guò)他來(lái)的,查看demo這個(gè)類的實(shí)例化是在MainActivity#onCreate方法中,并弄成了單例
public static Tencent mTencent;
if (mTencent == null) {
mTencent = Tencent.createInstance(mAppid, this);
}
IUiListener
現(xiàn)在我們需要在分享或登錄的過(guò)程中拿到一些狀態(tài),就需要用到IUiListener,調(diào)用SDK已經(jīng)封裝好的接口時(shí),例如:登錄、快速支付登錄、應(yīng)用分享、應(yīng)用邀請(qǐng)等接口,需傳入該回調(diào)的實(shí)例。
IUiListener qqShareListener = new IUiListener() {
@Override
public void onCancel() {
if (shareType != QQShare.SHARE_TO_QQ_TYPE_IMAGE) {
Util.toastMessage(QQShareActivity.this, "onCancel: ");
}
}
@Override
public void onComplete(Object response) {
// TODO Auto-generated method stub
Util.toastMessage(QQShareActivity.this, "onComplete: " + response.toString());
}
@Override
public void onError(UiError e) {
// TODO Auto-generated method stub
Util.toastMessage(QQShareActivity.this, "onError: " + e.errorMessage, "e");
}
};
//如果要收到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); //打開(kāi)這句話,可以實(shí)現(xiàn)分享純圖到QQ空間
doShareToQQ(params);
}
private void doShareToQQ(final Bundle params) {
// QQ分享要在主線程做
ThreadManager.getMainHandler().post(new Runnable() {
@Override
public void run() {
if (null != mTencent) {
mTencent.shareToQQ(QQActivity.this, params, qqShareListener);
}
}
});
}
分享到QZONE
截止到2016-4-8,QZONE暫不支持純圖片分享,官網(wǎng)文檔這里也有說(shuō)。但是我們可以通過(guò)分享到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); //打開(kāi)這句話,可以實(shí)現(xiàn)分享純圖到QQ空間
doShareToQQ(params);
}
注意:這里有個(gè)很重要的就是,分享本地圖片時(shí)路徑一定不要傳getCacheDir()或getFilesDir()等。不要問(wèn)我為什么,因?yàn)槟慵热皇欠窒韴D片到QQ,他要幫我顯示,但你給他一個(gè)私有目錄,他肯定不能顯示,那種重點(diǎn)來(lái)了,這就到導(dǎo)致很多朋友在做分享時(shí),分享的圖片不能顯示得原因了。別我是怎么知道的,我說(shuō)我猜的,你信么~~
QQ實(shí)例完整代碼,因?yàn)榭隙▎?wèn)了,既然上面貼了部分代碼,為啥下面還要全貼處理,這你就不懂了吧,上面我只貼了部分,但是他們沒(méi)多大的關(guān)聯(lián)性,可能不太好理解,而我希望的就是,大家一看看就明白了,不需要再下載demo再在手機(jī)上跑一遍,就能解決問(wèn)題,效果才是王道
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";
@Override
protected 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); //打開(kāi)這句話,可以實(shí)現(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); //打開(kāi)這句話,可以實(shí)現(xiàn)分享純圖到QQ空間
doShareToQQ(params);
}
private void doShareToQQ(final Bundle params) {
// QQ分享要在主線程做
ThreadManager.getMainHandler().post(new Runnable() {
@Override
public void run() {
if (null != mTencent) {
mTencent.shareToQQ(QQActivity.this, params, qqShareListener);
}
}
});
}
IUiListener qqShareListener = new IUiListener() {
@Override
public void onCancel() {
Util.toastMessage(QQActivity.this, "onCancel: ");
}
@Override
public void onComplete(Object response) {
// TODO Auto-generated method stub
Util.toastMessage(QQActivity.this, "onComplete: " + response.toString());
}
@Override
public void onError(UiError e) {
// TODO Auto-generated method stub
Util.toastMessage(QQActivity.this, "onError: " + e.errorMessage, "e");
}
};
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Tencent.onActivityResultData(requestCode, resultCode, data, qqShareListener);
}
}
Sina(微博)
我們到官方文檔下載相應(yīng)的官方demo并且多看看項(xiàng)目的ReadeMe,寫的很詳細(xì)讓你少走彎路。解壓后項(xiàng)目結(jié)構(gòu)如圖所示:
如果是第一次集成,我們可以直接運(yùn)行WeiboSDKDemo_v3.1.4.apk先查看效果,這樣也方便你對(duì)他的功能和效果有一個(gè)大概了解,當(dāng)如也可以直接導(dǎo)入demo-src目錄下面的代碼,
通過(guò)這種方式運(yùn)行工程時(shí),請(qǐng)務(wù)必替換默認(rèn)的 debug.keystore文件,否則無(wú)法正確的授權(quán)成功。另外,該debug.keysotre 是新浪官方的,除了編譯運(yùn)行官方 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)-基本信息菜單里面填上包名和簽名,簽名通過(guò)簽名工具獲取工具這里獲取
配置權(quán)限,如果已經(jīng)添加了相應(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前,有兩種方式來(lái)集成微博SDK:
- 直接導(dǎo)入weibosdkcore.jar:適用于只需要授權(quán)、分享、網(wǎng)絡(luò)請(qǐng)求框架功能的項(xiàng)目
- 引用WeiboSDK工程(Library):適用于微博授權(quán)、分享,以及需要登陸按鈕、調(diào)用OpenAPI的項(xiàng)目
在這里我采用方式1,因?yàn)槲也恍枰卿洶粹o和直接調(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);
如果配置沒(méi)問(wèn)題的話,到這一步已經(jīng)是可以分享得了,如果遇到什么問(wèn)題,請(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;
@Override
protected 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)用到微博客戶端中,注冊(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} 來(lái)接收微博客戶端返回的數(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);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
// 從當(dāng)前應(yīng)用喚起微博并進(jìn)行分享后,返回到當(dāng)前應(yīng)用時(shí),需要在此處調(diào)用該函數(shù)
// 來(lái)接收微博客戶端返回的數(shù)據(jù);執(zhí)行成功,返回 true,并調(diào)用
// {@link IWeiboHandler.Response#onResponse};失敗返回 false,不調(diào)用上述回調(diào)
mWeiboShareAPI.handleWeiboResponse(intent, this);
}
/**
* 接收微客戶端博請(qǐng)求的數(shù)據(jù)。
* 當(dāng)微博客戶端喚起當(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;
}
}
}
}
微信
說(shuō)道微信又不得不吐槽了,要想獲得微信登錄,還得是企業(yè)賬戶才能申請(qǐng),還得交錢,你說(shuō)這叫什么事
首先我打開(kāi)微信開(kāi)發(fā)者官網(wǎng),注冊(cè)個(gè)賬號(hào)或者用已有的賬號(hào)登錄,在管理中心創(chuàng)建應(yīng)用并提交審核,審?fù)晖瓿扇缦聢D。
可以看到我們已經(jīng)獲得,分享到朋友圈或朋友的權(quán)限,微信登錄等還需要申請(qǐng),那我現(xiàn)在只有先測(cè)試分享了
首先我們來(lái)到開(kāi)發(fā)者官網(wǎng)文檔下載相應(yīng)的sdk和開(kāi)發(fā)文檔
這其中我只下載了如下sdk
第一個(gè)是:獲取簽名的,不過(guò)我感覺(jué)不太好用,因?yàn)樗麤](méi)有復(fù)制簽名的按鈕,每次還得照著一個(gè)一個(gè)打出來(lái),我推薦用微博的簽名工具
第二個(gè)是:使用微信分享、登錄、收藏、支付等功能需要的庫(kù)以及文件
第三個(gè)是:范例代碼,包含了一個(gè)完整的范例工程。該范例的使用可以參閱Android平臺(tái)上手指南
首先我們用eclipse導(dǎo)入示例代碼,替換當(dāng)前目錄下的keystore,然后運(yùn)行就可以查看相關(guān)示例
下面我們就應(yīng)該來(lái)安裝官方文檔來(lái)集成sdk了
首先在官網(wǎng)創(chuàng)建一個(gè)應(yīng)用,獲取到AppId,然后把剛剛下載的sdk包里面的libammsdk.jar拷貝到你的項(xiàng)目libs目錄下,并添加到path(如果需要)
配置權(quán)限:
說(shuō)到這里,有的吐槽了,你看看這個(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 {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wxentry);
}
// 微信發(fā)送請(qǐng)求到第三方應(yīng)用時(shí),會(huì)回調(diào)到該方法
@Override
public void onReq(BaseReq baseReq) {
}
// 第三方應(yīng)用發(fā)送到微信的請(qǐng)求處理后的響應(yīng)結(jié)果,會(huì)回調(diào)到該方法
@Override
public void onResp(BaseResp baseResp) {
}
}
載清單文件里配置你的activity
<activity android:name=".wxapi.WXEntryActivity" android:exported="true">
</activity>
創(chuàng)建實(shí)例,并注冊(cè)到微信
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wxentry);
//如果分享的時(shí)候,該界面沒(méi)有開(kāi)啟,那么微信開(kāi)始這個(gè)activity時(shí),會(huì)調(diào)用onCreate,所以這里要處理微信的返回結(jié)果
WxActivity.api.handleIntent(getIntent(), this);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
//如果分享的時(shí)候,該已經(jīng)開(kāi)啟,那么微信開(kāi)始這個(gè)activity時(shí),會(huì)調(diào)用onNewIntent,所以這里要處理微信的返回結(jié)果
setIntent(intent);
WxActivity.api.handleIntent(intent, this);
}
分享圖片
/**
* @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);
}
朋友
這里就簡(jiǎn)單了,直接調(diào)用上面的方法
share2Wx(true);
朋友圈
share2Wx(false);
這里是這個(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;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wx);
// 通過(guò)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();
}
}
另外說(shuō)點(diǎn)題外話,鑒于我是有點(diǎn)強(qiáng)迫癥的人,所以在代碼以及文字的組織和代碼的格式化都保持良好的風(fēng)格,特別是代碼的格式,我都是每次先自己寫一遍,然后在從開(kāi)發(fā)工具里拷貝出來(lái),有時(shí)還得按tad一點(diǎn)一點(diǎn)點(diǎn)縮進(jìn)(如果哪位大神有更好的方法,希望指教下),才貼到這上面了,以為我覺(jué)得既然要寫博客就要寫好,這要才對(duì)別人有幫助,在我覺(jué)得如果文字排版或者代碼格式亂亂的,就是耍流氓。
以上測(cè)試的代碼我放到github了,有什么問(wèn)題可以直接評(píng)論或者在github上創(chuàng)建issure
如果我的文章對(duì)來(lái)帶來(lái)的幫助,可加我微信,微博,QQ什么啥的交個(gè)朋友也是不錯(cuò)的,另外微信,微博都會(huì)不定期發(fā)一些優(yōu)質(zhì)的文章,感謝大家的支持~~,聯(lián)系方式在我的個(gè)人介紹里啦