史上最詳細(xì)Android集成QQ,微信,微博分享(不用第三方)持續(xù)更新中

現(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)單呀

QQ

下載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è)人介紹里啦

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,967評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,273評(píng)論 3 415
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 175,870評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 62,742評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,527評(píng)論 6 407
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,010評(píng)論 1 322
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,108評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,250評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,769評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,656評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,853評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,371評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,103評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,472評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,717評(píng)論 1 281
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,487評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,815評(píng)論 2 372

推薦閱讀更多精彩內(nèi)容