Android實現(xiàn)新浪微博一鍵分享的實例代碼
寫在本章前
愈來愈多的APP支持一鍵分享至QQ空間、微信朋友圈、新浪微博的功能,同時支持第三方賬號登錄,如QQ、微信、新浪微博等第三方平臺的賬號。本章結(jié)合當(dāng)下流行的設(shè)計,兼顧免費的開源ShareSDK,結(jié)合項目中的實際需求,整合出一套分享源碼,版權(quán)所有,如需轉(zhuǎn)載請注明轉(zhuǎn)載地址。
1. 開發(fā)環(huán)境及SDK下載
開發(fā)工具:Android studio2.1.3版本
ShareSDK:Mob官網(wǎng)(www.mob.com)下載最新社會化分享ShareSDK2.7.7版本,解壓如圖示

進入ShareSDK for Android文件,找到QuickIntegrater.jar文件,根據(jù)官網(wǎng)介紹雙擊打開,根據(jù)需求集成第三方平臺,在某些情況如若雙擊無法打開,windows系統(tǒng)下,進入cmd找到QuickIntegrater.jar所在的當(dāng)前目錄,鍵入java -jar QuickIntegrater.jar,根據(jù)實際需求集成第三方平臺,最后生成Sample的文件夾,包括需要使用到的libs等文件


復(fù)制新生成文件夾Sample下面的全部內(nèi)容到自己所建立的project下,同時需要對加入到libs的jar文件添加庫依賴


Mob進入后臺,申請分享使用權(quán)限,獲取APP key和APP secret

將申請到的APP key替換

2. 配置AndroidManifest.xml
<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"/> <!-- 藍牙分享所需的權(quán)限 --> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
3. 添加必要的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" >
<!-- 調(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>
<!--
<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>
-->
</activity>
<!--微信分享回調(diào)
<activity
android:name="cn.sharesdk.demo.wxapi.WXEntryActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"
android:screenOrientation="portrait" />
-->
備注:上述代碼中,有關(guān)于微信和QQ的分享回調(diào),本文只講述新浪微博的分享使用,QQ和微信的activity添加可供參考
4. 替換mob后臺申請的Appkey與各個平臺申請的key
更換aseests下面的ShareSDK.xml中的APPkey,以及需要添加第三方應(yīng)用需要的APPkey和AppSecret,以新浪微博為例.
4.1 新浪微博key申請
1)登錄新浪微博,申請,填寫賬號,申請注冊等信息,以個人為例,在申請結(jié)束后,獲取“微連接”權(quán)限,點擊“立即創(chuàng)建微連接”;

2)填寫應(yīng)用名稱,勾選應(yīng)用平臺,以Android為例;

3)確認提交即可獲取APP Key和Secret

4)新浪微博獲取APP的Android包名和簽名

5)通過進入申請的應(yīng)用名稱“Android實例”APP下的AndroidManifest.xml中獲取包名;

6)Android簽名的獲取
通過4)中新浪微博提供的簽名工具,github下載的“app_signatures.apk”,安裝到手機,同時將APP“Android實例”安裝到手機,輸入Android包名,即可生成對應(yīng)的Android簽名


7)新浪微博測試權(quán)限
需要注意的是,此時并沒有對APP進行上線,并沒有通過審核,暫時只有測試權(quán)限可以關(guān)聯(lián)15個測試賬號使用;

5. 正式編程
此部分包括一鍵底部彈出對話框,按鈕操作,第三方分享等操作;
5.1 自定義dialog
參考了多個博客,總結(jié)出自己所需要的dialog。
/**
* Created by user on 2016/10/18.
*/
public class ShareDialog extends Dialog{
private Dialog dialog;
private Context context;
private LayoutInflater inflater;
private ImageView iv_share_sina, iv_share_qqzone, iv_share_wxfriend;
public ShareDialog(Context context){
super(context);
init(context);
}
private void init(Context context){
View view = inflater.from(context).inflate(R.layout.bottom_share_dialog, null);
dialog = new Dialog(context, R.style.shareDialog_style);
dialog.setContentView(view);
RelativeLayout rl_dialog_bg = (RelativeLayout)view.findViewById(R.id.rl_dialog_bg);
rl_dialog_bg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
//設(shè)置鋪滿
Window dialogWindow = dialog.getWindow();
dialogWindow.setGravity(Gravity.BOTTOM);//設(shè)置顯示位置
WindowManager.LayoutParams lp = dialogWindow.getAttributes(); // 獲取對話框當(dāng)前的參數(shù)值
// lp.x = 0; // 新位置X坐標(biāo)
// lp.y = -20; // 新位置Y坐標(biāo)
lp.width = WindowManager.LayoutParams.MATCH_PARENT; // 寬度
lp.height = WindowManager.LayoutParams.WRAP_CONTENT; // 高度
lp.alpha = 9f; // 透明度
dialogWindow.setAttributes(lp);
/* //設(shè)置鋪滿
Window window = dialog.getWindow();
WindowManager.LayoutParams wl = window.getAttributes();
wl.x = 0;
wl.y = ((Activity) context).getWindowManager().getDefaultDisplay()
.getHeight();
wl.width = ViewGroup.LayoutParams.MATCH_PARENT;
wl.height = ViewGroup.LayoutParams.WRAP_CONTENT;
// 設(shè)置顯示位置
dialog.onWindowAttributesChanged(wl);*/
iv_share_sina = (ImageView) view.findViewById(R.id.iv_share_sina);
iv_share_qqzone = (ImageView) view.findViewById(R.id.iv_share_qqzone);
iv_share_wxfriend = (ImageView) view.findViewById(R.id.iv_share_wxfriend);
}
/**
* 設(shè)置新浪微博監(jiān)聽事件
*/
public void setSinaClickListener(View.OnClickListener clickListener){
iv_share_sina.setOnClickListener(clickListener);
}
/**
* 設(shè)置QQ空間監(jiān)聽事件
*/
public void setQQZoneClickListener(View.OnClickListener clickListener){
iv_share_qqzone.setOnClickListener(clickListener);
}
/**
* 設(shè)置微信朋友圈監(jiān)聽事件
*/
public void setWXFriendClickListener(View.OnClickListener clickListener){
iv_share_wxfriend.setOnClickListener(clickListener);
}
public void show(){
dialog.show();
}
public void dismiss(){
dialog.dismiss();
}
}
對話框如圖示;

5.2 ShareSDK初始化
在需要activity分享界面,或者在MainActivity的OnCreate()函數(shù)中進行初始化
//ShareSDK初始化 ShareSDK.initSDK(mActivity);
5.3 獲取和保存當(dāng)前屏幕的截圖,用以第三方的分享
作為第三方分享的一個點,如何將屏幕的截圖,通過新浪微博一鍵分享到微博中。
/**
* 獲取和保存當(dāng)前屏幕的截圖
* 用以第三方分享
*/
private Bitmap GetandSavaCurrentImage(Activity activity) {
// 1.獲取windows中最頂層的view
View view = activity.getWindow().getDecorView();
view.buildDrawingCache();
// 2.獲取狀態(tài)欄高度
Rect rect = new Rect();
view.getWindowVisibleDisplayFrame(rect);
int statusBarHeights = rect.top;
Display display = activity.getWindowManager().getDefaultDisplay();
// 3.獲取屏幕寬和高
int widths = display.getWidth();
int heights = display.getHeight();
// 4.允許當(dāng)前窗口保存緩存信息
view.setDrawingCacheEnabled(true);
// 5.去掉狀態(tài)欄
Bitmap bmp = Bitmap.createBitmap(view.getDrawingCache(), 0,
statusBarHeights, widths, heights - statusBarHeights);
// 銷毀緩存信息
view.destroyDrawingCache();
return bmp;
}
/**
* 將截取的圖片保存到sdcard中并且命名
*/
private void saveToSD(Bitmap bmp, String fileName) {
//判斷SD卡是否存在
if (hasSdcard()){
Log.i("wzl", "存儲卡存在,可以調(diào)用。");
try {
File file = new File(fileName);
if (!file.exists()){
file.createNewFile();
}
FileOutputStream fos = new FileOutputStream(file);
if (null != fos){
// 第一參數(shù)是圖片格式,第二個是圖片質(zhì)量,第三個是輸出流
bmp.compress(Bitmap.CompressFormat.PNG, 100, fos);
// 用完關(guān)閉
fos.flush();
fos.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* @return 檢查是否存在SDcard
*/
public static boolean hasSdcard(){
String sdcardstate = Environment.getExternalStorageState();
if (sdcardstate.equals(Environment.MEDIA_MOUNTED)) {
//有存儲的SDCard
return true;
} else {
Log.i("wzl", "沒有檢測到SDCard!");
return false;
}
}
5.4 監(jiān)聽事件
點擊新浪微博,直接彈出圖文分享界面,所需要的圖片為對于當(dāng)前屏幕的截圖,同時加載自己添加的文字以及網(wǎng)址鏈接,這部分可以作為APP分享的網(wǎng)址下載鏈接,下列代碼也給出了新浪微博分享的一些其他使用案例,可以根據(jù)個人喜好或者項目的實際需求進行更改;
/**
*
* 在彈出的9宮格分享頁面中,會有很多平臺,如果有些平臺不希望顯示,可以有兩種方法,
1.刪除項目引用的兩個工程之一的MainLibs目錄下的libs里面對應(yīng)的平臺的jar包,刪除九格宮不要的平臺,只要刪除對應(yīng)平臺的jar就行
2.配置ShareSDK.conf文件,不想顯示的平臺設(shè)置Enable="false"
*/
/**
* ShareSDK集成方法有兩種
* 1、第一種是引用方式,例如引用onekeyshare項目,onekeyshare項目再引用mainlibs庫
* 2、第二種是把onekeyshare和mainlibs集成到項目中,本例子就是用第二種方式
請看“ShareSDK
* 使用說明文檔”,SDK下載目錄中
或者看網(wǎng)絡(luò)集成文檔
* http://wiki.sharesdk.cn/Android_%E5%BF%AB
* %E9%80%9F%E9%9B%86%E6%88%90%E6%8C%87%E5%8D%97
* 3、混淆時,把sample或者本例子的混淆代碼copy過去,在proguard-project.txt文件中
*
* 平臺配置信息有三種方式: 1、在我們后臺配置各個微博平臺的key
* 2、在代碼中配置各個微博平臺的key,http://sharesdk.cn/androidDoc
* /cn/sharesdk/framework/ShareSDK.html
* 3、在配置文件中配置,本例子里面的assets/ShareSDK.xml,
*/
private void showShare() {
//實例化一個OnekeyShare對象
OnekeyShare oks = new OnekeyShare();
// 分享時Notification的圖標(biāo)和文字 2.5.9以后的版本不調(diào)用此方法
//oks.setNotification(R.drawable.ic_launcher, getString(R.string.app_name));
//關(guān)閉sso授權(quán)
oks.disableSSOWhenAuthorize();
//指定微博平臺,如果不添加這行,則彈出9宮格供用戶選擇
oks.setPlatform(SinaWeibo.NAME);
//分享內(nèi)容的標(biāo)題
// title標(biāo)題,印象筆記、郵箱、信息、微信、人人網(wǎng)和QQ空間使用
// oks.setTitle("新浪微博分享");
// titleUrl是標(biāo)題的對應(yīng)的網(wǎng)址鏈接,僅在人人網(wǎng)和QQ空間使用,如果沒有可以不設(shè)置
// oks.setTitleUrl("http://sharesdk.cn");
//分享網(wǎng)絡(luò)圖片,新浪微博分享網(wǎng)絡(luò)圖片需要通過審核后申請高級寫入接口,否則請注釋掉測試新浪微博
//分享網(wǎng)絡(luò)圖片,新浪分享網(wǎng)絡(luò)圖片,需要申請高級權(quán)限,否則會報10014的錯誤
//權(quán)限申請:新浪開放平臺-你的應(yīng)用中-接口管理-權(quán)限申請-微博高級寫入接口-statuses/upload_url_text
//注意:本地圖片和網(wǎng)絡(luò)圖片,同時設(shè)置時,只分享本地圖片
//oks.setImageUrl("http://f1.sharesdk.cn/imgs/2014/02/26/owWpLZo_638x960.jpg");
oks.setImagePath(fileName);
//是否直接分享(true則直接分享),false是有九格宮,true沒有
oks.setSilent(false);
//Platform.ShareParams sina_weibo = new Platform.ShareParams();
//sina_weibo.setText("第一次分享" + " " + "www.baidu.com");
//imagePath是圖片的本地路徑,Linked-In以外的平臺都支持此參數(shù)
//sina_weibo.setImagePath("/sdcard/share_pic.jpg");//確保SDcard下面存在此張圖片
/*oks.setShareContentCustomizeCallback(new ShareContentCustomizeCallback() {
@Override
public void onShare(Platform platform, Platform.ShareParams paramsToShare) {
if(SinaWeibo.NAME.equals(platform.getName())) {
paramsToShare.setText("初始使用" + " " + "http://www.baidu.com");
paramsToShare.setUrl(null);
}
}
});*/
//設(shè)置分享的文本內(nèi)容,所有平臺都需要這個字段
oks.setText("新浪微博第一次分享" + " " + "http://www.baidu.com");
//url僅在微信(包括好友和朋友圈)中使用
// oks.setUrl("http://sharesdk.cn");
// comment是我對這條分享的評論,僅在人人網(wǎng)和QQ空間使用
//oks.setComment("我是測試評論文本");
// site是分享此內(nèi)容的網(wǎng)站名稱,僅在QQ空間使用
//oks.setSite("ShareSDK");
// siteUrl是分享此內(nèi)容的網(wǎng)站地址,僅在QQ空間使用
//oks.setSiteUrl("http://sharesdk.cn");
/*oks.setShareContentCustomizeCallback(new ShareContentCustomizeCallback() {
@Override
public void onShare(Platform platform, Platform.ShareParams paramsToShare) {
if (SinaWeibo.NAME.equals(platform.getName())) {
paramsToShare.setText("分享文本" + " " + "www.baidu.com");
paramsToShare.setUrl(null);
}
}
});*/
oks.setCallback(new PlatformActionListener() {
@Override
public void onComplete(Platform platform, int i, HashMap<String, Object> hashMap) {
//分享完成
Message msg = new Message();
msg.what = MSG_ACTION_CCALLBACK;
msg.arg1 = 1;
msg.obj = platform;
handler.sendMessage(msg);
}
@Override
public void onError(Platform platform, int i, Throwable throwable) {
//分享失敗
throwable.printStackTrace();
Message msg = new Message();
msg.what = MSG_ACTION_CCALLBACK;
msg.arg1 = 2;
msg.obj = throwable;
handler.sendMessage(msg);
}
@Override
public void onCancel(Platform platform, int i) {
//分享取消
Message msg = new Message();
msg.what = MSG_ACTION_CCALLBACK;
msg.arg1 = 3;
msg.obj = platform;
handler.sendMessage(msg);
}
});
oks.show(mActivity);
}
6. 新浪微博實例分享
在正確使用shareSDK后,點擊新浪微博的圖形按鈕,會彈出如下圖的圖文分享框,輸入文字即可完成。
如圖示

備注:如若分享網(wǎng)址鏈接,必須加上“http://”, 否則分享出去的僅是www.baidu.com

登錄

授權(quán)

分享成功
備注:分享成功后,會有響應(yīng)提示,需自行添加,登錄新浪微博,即可看到個人信息中的分享,因為未未上線,因此“來自未通過審核應(yīng)用”,當(dāng)點擊“百度”,即可進行界面跳轉(zhuǎn)

成功分享
通過以上的核心部分的講解,應(yīng)該對新浪微博的分享有了基本的認識和使用能力。具體的細節(jié),如如何創(chuàng)建界面,按鈕,查詢沒有做過多的講解。如果有需要,可以直接給我發(fā)簡信,或者留言。
此外,針對上述的知識有不明白,異議,亦或是不正確的地方,還請幫忙指正,謝謝。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
解決ViewPager和SlidingPaneLayout的滑動事件沖突問題
下面小編就為大家分享一篇解決ViewPager和SlidingPaneLayout的滑動事件沖突問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01
Android利用ViewPager實現(xiàn)帶小圓球的圖片滑動
這篇文章主要為大家詳細介紹了Android利用ViewPager實現(xiàn)帶小圓球的圖片滑動,并且只有第一次安裝app時才出現(xiàn)歡迎界面具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-11-11
Android編程開發(fā)之EditText實現(xiàn)輸入QQ表情圖像的方法
這篇文章主要介紹了Android編程開發(fā)之EditText實現(xiàn)輸入QQ表情圖像的方法,涉及Android多媒體文件及EditText的相關(guān)操作技巧,需要的朋友可以參考下2015-12-12
Android實現(xiàn)網(wǎng)絡(luò)圖片瀏覽功能
這篇文章主要為大家詳細介紹了Android實現(xiàn)網(wǎng)絡(luò)圖片瀏覽功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06
Android實現(xiàn)九宮格(GridView中各項平分空間)的方法
這篇文章主要介紹了Android實現(xiàn)九宮格(GridView中各項平分空間)的方法,涉及Android針對GridView操作的相關(guān)技巧,需要的朋友可以參考下2015-06-06

