Android进阶之使用第三方平台ShareSDK实现新浪微博的一键分享功能
博客专区 > 墨梅 的博客 > 博客详情
Android进阶之使用第三方平台ShareSDK实现新浪微博的一键分享功能
墨梅 发表于4年前
Android进阶之使用第三方平台ShareSDK实现新浪微博的一键分享功能
  • 发表于 4年前
  • 阅读 22822
  • 收藏 9
  • 点赞 1
  • 评论 12
摘要: Android进阶之使用第三方平台ShareSDK实现新浪微博的一键分享功能

在公司最近的一个项目中,需要实现一键分享功能,在这里我使用的是第三方平台ShareSDK,将使用经验与大家分享

先看效果图

主界面

\

分享界面

\

由于第一次使用,所以需要先进行新浪授权,授权界面

\

分享结果图片

\

下面开始介绍如何使用ShareSDK实现微博的分享功能(其他平台的类似)

首先看一下项目的结构图

\

shareSDK传送门

在使用shareSDK之前,我们需要先到新浪微博的开放平台进行注册,获得appkey以及其他的信息

新浪微博开放平台传送门

下面图片中划掉的部分是要重点关注的

\

特别需要注意的是,下面的回调网址必须填写,而且在代码中有涉及,使用默认的即可

\

至此,开发之前的准备工作已经做好了,下面还是贴代码

首先看一下布局文件代码,很简单,只有一个按钮

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
02.xmlns:tools="http://schemas.android.com/tools"
03.android:layout_width="match_parent"
04.android:layout_height="match_parent"
05.android:gravity="center_vertical" >
06. 
07.<Button
08.android:onClick="click"
09.android:layout_width="match_parent"
10.android:layout_height="wrap_content"
11.android:text="一键快捷分享" />
12. 
13.</LinearLayout>

MainActivity.java

package com.heli17.weiboonekeylogin;
002. 
003.import java.io.File;
004.import java.io.FileOutputStream;
005.import java.util.HashMap;
006. 
007.import android.app.Activity;
008.import android.app.Notification;
009.import android.app.NotificationManager;
010.import android.app.PendingIntent;
011.import android.content.Context;
012.import android.content.Intent;
013.import android.graphics.Bitmap;
014.import android.graphics.Bitmap.CompressFormat;
015.import android.graphics.BitmapFactory;
016.import android.os.Bundle;
017.import android.os.Environment;
018.import android.os.Handler.Callback;
019.import android.os.Message;
020.import android.view.View;
021.import android.widget.Toast;
022.import cn.sharesdk.framework.Platform;
023.import cn.sharesdk.framework.PlatformActionListener;
024.import cn.sharesdk.framework.ShareSDK;
025.import cn.sharesdk.framework.utils.UIHandler;
026.import cn.sharesdk.onekeyshare.OnekeyShare;
027. 
028.public class MainActivity extends Activity implements PlatformActionListener,
029.Callback {
030. 
031.private static final int MSG_TOAST = 1;
032.private static final int MSG_ACTION_CCALLBACK = 2;
033.private static final int MSG_CANCEL_NOTIFY = 3;
034. 
035.// sdcard中的图片名称
036.private static final String FILE_NAME = "/share_pic.jpg";
037.public static String TEST_IMAGE;
038. 
039.@Override
040.public boolean handleMessage(Message msg) {
041.switch (msg.what) {
042.case MSG_TOAST: {
043.String text = String.valueOf(msg.obj);
044.Toast.makeText(MainActivity.this, text, Toast.LENGTH_SHORT).show();
045.}
046.break;
047.case MSG_ACTION_CCALLBACK: {
048.switch (msg.arg1) {
049.case 1: // 成功后发送Notification
050.showNotification(2000, "分享完成");
051.break;
052.case 2: // 失败后发送Notification
053.showNotification(2000, "分享失败");
054.break;
055.case 3: // 取消
056.showNotification(2000, "取消分享");
057.break;
058.}
059.}
060.break;
061.case MSG_CANCEL_NOTIFY:
062.NotificationManager nm = (NotificationManager) msg.obj;
063.if (nm != null) {
064.nm.cancel(msg.arg1);
065.}
066.break;
067.}
068.return false;
069.}
070. 
071.@Override
072.protected void onCreate(Bundle savedInstanceState) {
073.super.onCreate(savedInstanceState);
074.setContentView(R.layout.activity_main);
075.// 初始化ShareSDK
076.ShareSDK.initSDK(this);
077.// 初始化图片路径
078.new Thread() {
079.public void run() {
080.initImagePath();
081.}
082.}.start();
083.}
084. 
085.//一键分享的点击事件
086.public void click(View v) {
087.//实例化一个OnekeyShare对象
088.OnekeyShare oks = new OnekeyShare();
089.//设置Notification的显示图标和显示文字
090.oks.setNotification(R.drawable.ic_launcher, "ShareSDK demo");
091.//设置短信地址或者是邮箱地址,如果没有可以不设置
092.oks.setAddress("12345678901");
093.//分享内容的标题
094.oks.setTitle("分享内容的标题");
095.//标题对应的网址,如果没有可以不设置
096.oks.setTitleUrl("http://www.17heli.com");
097.//设置分享的文本内容
098.oks.setText("分享的文本内容");
099.//设置分享照片的本地路径,如果没有可以不设置
100.oks.setImagePath(MainActivity.TEST_IMAGE);
101.//设置分享照片的url地址,如果没有可以不设置
102.oks.setImageUrl("http://img.appgo.cn/imgs/sharesdk/content/2013/07/25/1374723172663.jpg");
103.//微信和易信的分享的网络连接,如果没有可以不设置
104.oks.setUrl("http://sharesdk.cn");
105.//人人平台特有的评论字段,如果没有可以不设置
106.oks.setComment("comment");
107.//程序的名称或者是站点名称
108.oks.setSite("site");
109.//程序的名称或者是站点名称的链接地址
110.oks.setSiteUrl("http://www.baidu.com");
111.//设置纬度
112.oks.setLatitude(23.122619f);
113.//设置精度
114.oks.setLongitude(113.372338f);
115.//设置是否是直接分享
116.oks.setSilent(false);
117.//显示
118.oks.show(MainActivity.this);
119.}
120. 
121.private void initImagePath() {
122.try {
123.if (Environment.MEDIA_MOUNTED.equals(Environment
124..getExternalStorageState())
125.&& Environment.getExternalStorageDirectory().exists()) {
126.TEST_IMAGE = Environment.getExternalStorageDirectory()
127..getAbsolutePath() + FILE_NAME;
128.} else {
129.TEST_IMAGE = getApplication().getFilesDir().getAbsolutePath()
130.+ FILE_NAME;
131.}
132.// 创建图片文件夹
133.File file = new File(TEST_IMAGE);
134.if (!file.exists()) {
135.file.createNewFile();
136.Bitmap pic = BitmapFactory.decodeResource(getResources(),
137.R.drawable.pic);
138.FileOutputStream fos = new FileOutputStream(file);
139.pic.compress(CompressFormat.JPEG, 100, fos);
140.fos.flush();
141.fos.close();
142.}
143.} catch (Throwable t) {
144.t.printStackTrace();
145.TEST_IMAGE = null;
146.}
147.}
148. 
149.@Override
150.protected void onDestroy() {
151.super.onDestroy();
152.// 在Activity中停止ShareSDK
153.ShareSDK.stopSDK(this);
154.}
155. 
156.// 取消后的回调方法
157.@Override
158.public void onCancel(Platform platform, int action) {
159.Message msg = new Message();
160.msg.what = MSG_ACTION_CCALLBACK;
161.msg.arg1 = 3;
162.msg.arg2 = action;
163.msg.obj = platform;
164.UIHandler.sendMessage(msg, this);
165.}
166. 
167.// 完成后的回调方法
168.@Override
169.public void onComplete(Platform platform, int action,
170.HashMap<String, Object> arg2) {
171.Message msg = new Message();
172.msg.what = MSG_ACTION_CCALLBACK;
173.msg.arg1 = 1;
174.msg.arg2 = action;
175.msg.obj = platform;
176.UIHandler.sendMessage(msg, this);
177.}
178. 
179.// 出错后的回调方法
180.@Override
181.public void onError(Platform platform, int action, Throwable t) {
182.t.printStackTrace();
183.Message msg = new Message();
184.msg.what = MSG_ACTION_CCALLBACK;
185.msg.arg1 = 2;
186.msg.arg2 = action;
187.msg.obj = t;
188.UIHandler.sendMessage(msg, this);
189.}
190. 
191.// 根据传入的参数显示一个Notification
192.@SuppressWarnings("deprecation")
193.private void showNotification(long cancelTime, String text) {
194.try {
195.Context app = getApplicationContext();
196.NotificationManager nm = (NotificationManager) app
197..getSystemService(Context.NOTIFICATION_SERVICE);
198.final int id = Integer.MAX_VALUE / 13 + 1;
199.nm.cancel(id);
200.long when = System.currentTimeMillis();
201.Notification notification = new Notification(
202.R.drawable.ic_launcher, text, when);
203.PendingIntent pi = PendingIntent.getActivity(app, 0, new Intent(),
204.0);
205.notification.setLatestEventInfo(app, "sharesdk test", text, pi);
206.notification.flags = Notification.FLAG_AUTO_CANCEL;
207.nm.notify(id, notification);
208. 
209.if (cancelTime > 0) {
210.Message msg = new Message();
211.msg.what = MSG_CANCEL_NOTIFY;
212.msg.obj = nm;
213.msg.arg1 = id;
214.UIHandler.sendMessageDelayed(msg, cancelTime, this);
215.}
216.} catch (Exception e) {
217.e.printStackTrace();
218.}
219.}
220. 
221.}

ShareSDK.xml

<?xml version="1.0" encoding="utf-8"?>
02.<DevInfor>
03. 
04.<!--
05.说明:
06. 
07.1、表格中的第一项
08.<ShareSDK
09.AppKey="api20" />
10.是必须的,其中的AppKey是您在ShareSDK上注册的开发者帐号的AppKey
11. 
12.2、所有集成到您项目的平台都应该为其在表格中填写相对应的开发者信息,以新浪微博为例:
13.<SinaWeibo
14.Id="1"
15.SortId="1"
16.AppKey="568898243"
17.AppSecret="38a4f8204cc784f81f9f0daaf31e02e3"
18.RedirectUrl="http://www.sharesdk.cn"
19.Enable="true" />
20.其中的SortId是此平台在分享列表中的位置,由开发者自行定义,可以是任何整型数字,数值越大
21.越靠后AppKey、AppSecret和RedirectUrl是您在新浪微博上注册开发者信息和应用后得到的信息
22.Id是一个保留的识别符,整型,ShareSDK不使用此字段,供您在自己的项目中当作平台的识别符。
23.Enable字段表示此平台是否有效,布尔值,默认为true,如果Enable为false,即便平台的jar包
24.已经添加到应用中,平台实例依然不可获取。
25. 
26.各个平台注册应用信息的地址如下:
27.新浪微博                 http://open.weibo.com
28.腾讯微博                 http://dev.t.qq.com
29.<a href="http://www.it165.net/qq/qqkj/" target="_blank" class="keylink">QQ空间</a>                     http://connect.<;a href="http://www.it165.net/qq/" target="_blank" class="keylink">qq</a>.com/intro/login/
30.微信好友                 http://open.weixin.<a href="http://www.it165.net/qq/" target="_blank" class="keylink">qq</a>.com
31.Facebook      https://developers.facebook.com
32.Twitter       https://dev.twitter.com
33.人人网                      http://dev.renren.com
34.开心网                      http://open.kaixin001.com
35.搜狐微博                 http://open.t.sohu.com
36.网易微博                 http://open.t.163.com
37.豆瓣                           http://developers.douban.com
38.有道云笔记            http://note.youdao.com/open/developguide.html#app
39.印象笔记                 https://dev.evernote.com/
40.Linkedin      https://www.linkedin.com/secure/developer?newapp=
41.FourSquare    https://developer.foursquare.com/
42.搜狐随身看            https://open.sohu.com/
43.Flickr        http://www.flickr.com/services/
44.Pinterest     http://developers.pinterest.com/
45.Tumblr        http://www.tumblr.com/developers
46.Dropbox       https://www.dropbox.com/developers
47.Instagram     http://instagram.com/developer#
48.VKontakte     http://vk.com/dev
49.-->
50. 
51.<ShareSDK AppKey="13881da34ebe" /> <!-- 修改成你在sharesdk后台注册的应用的appkey" -->
52. 
53.<SinaWeibo
54.AppKey="5555572"
55.AppSecret="5ae6d40aac6e7c0d7d84715540a30d71"
56.Enable="true"
57.Id="1"
58.RedirectUrl="https://api.weibo.com/oauth4/default.html"
59.SortId="1" />
60. 
61.</DevInfor>

清单文件Mainfest.xml

<?xml version="1.0" encoding="utf-8"?>
02.<manifest xmlns:android="http://schemas.android.com/apk/res/android"
03.package="com.heli17.weiboonekeylogin"
04.android:versionCode="1"
05.android:versionName="1.0" >
06. 
07.<uses-sdk
08.android:minSdkVersion="8"
09.android:targetSdkVersion="19" />
10.<!-- 需要的权限注册 -->
11.<uses-permission android:name="android.permission.GET_TASKS" />
12.<uses-permission android:name="android.permission.INTERNET" />
13.<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
14.<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
15.<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
16.<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
17.<uses-permission android:name="android.permission.READ_PHONE_STATE" />
18.<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
19.<uses-permission android:name="android.permission.GET_ACCOUNTS" />
20. 
21.<application
22.android:allowBackup="true"
23.android:icon="@drawable/ic_launcher"
24.android:label="@string/app_name" >
25.<activity
26.android:name="com.heli17.weiboonekeylogin.MainActivity"
27.android:label="@string/app_name"
28.android:theme="@android:style/Theme.Black.NoTitleBar" >
29.<intent-filter>
30.<action android:name="android.intent.action.MAIN" />
31. 
32.<category android:name="android.intent.category.LAUNCHER" />
33.</intent-filter>
34.</activity>
35.<!-- 这是进行授权页面的注册 -->
36.<activity
37.android:name="cn.sharesdk.framework.ShareSDKUIShell"
38.android:configChanges="keyboardHidden|orientation"
39.android:screenOrientation="portrait"
40.android:theme="@android:style/Theme.Translucent.NoTitleBar"
41.android:windowSoftInputMode="stateHidden|adjustResize" >
42.<meta-data
43.android:name="Adapter"
44.android:value="cn.sharesdk.demo.MyAdapter" />
45. 
46.<intent-filter>
47.<data android:scheme="db-7janx53ilz11gbs" />
48. 
49.<action android:name="android.intent.action.VIEW" />
50. 
51.<category android:name="android.intent.category.BROWSABLE" />
52.<category android:name="android.intent.category.DEFAULT" />
53.</intent-filter>
54.</activity>
55.</application>
56. 
57.</manifest>

 

共有 人打赏支持
粉丝 15
博文 210
码字总数 42466
评论 (12)
杉杉来吃
链接没有源码 能否提供源码 万分感谢
杉杉来吃
ShareSDK AppKey和SinaWeibo AppKey一样吗 如果不一样ShareSDK AppKey怎么获得
墨梅

引用来自“杉杉来吃”的评论

ShareSDK AppKey和SinaWeibo AppKey一样吗 如果不一样ShareSDK AppKey怎么获得
你可以读一下shareSDK的官方文档,上面介绍的很详细,其实要是测试的话,是不用获取到appkey的,sharesdk提供了测试用的key,也在他们的网站上都有介绍,这个实现不是很难,主要就是配置,我没有源码,当时自己写了一个,找不到了。
杉杉来吃

引用来自“杉杉来吃”的评论

ShareSDK AppKey和SinaWeibo AppKey一样吗 如果不一样ShareSDK AppKey怎么获得

引用来自“墨梅”的评论

你可以读一下shareSDK的官方文档,上面介绍的很详细,其实要是测试的话,是不用获取到appkey的,sharesdk提供了测试用的key,也在他们的网站上都有介绍,这个实现不是很难,主要就是配置,我没有源码,当时自己写了一个,找不到了。
appkey搞定了 现在 点击一键分享就是没反应
杉杉来吃
public class SinaShare extends BaseActivity implements PlatformActionListener,Callback{
  private static final int MSG_TOAST = 1;
  private static final int MSG_ACTION_CCALLBACK = 2;
  private static final int MSG_CANCEL_NOTIFY = 3;
  public static String TEST_IMAGE;
  public String imageUrl,content,title;
  private Button btnOneKeyShare;
  // sdcard中的图片名称
  private static final String FILE_NAME = "/share_pic.jpg";
  
//  public SinaShare(String imageUrl, String content,String title) {
//    this.imageUrl=imageUrl;
//    this.content=content;
//    this.title=title;
//  }
  @Override
  public boolean handleMessage(Message msg) {
    switch (msg.what) {
    case MSG_TOAST: {
    String text = String.valueOf(msg.obj);
    Toast.makeText(SinaShare.this, text, Toast.LENGTH_SHORT).show();
    }
    break;
    case MSG_ACTION_CCALLBACK: {
    switch (msg.arg1) {
    case 1: // 成功后发送Notification
    showNotification(2000, "分享完成");
    break;
    case 2: // 失败后发送Notification
    showNotification(2000, "分享失败");
    break;
    case 3: // 取消
    
杉杉来吃
showNotification(2000, "取消分享");
    break;
    }
    }
    break;
    case MSG_CANCEL_NOTIFY:
    NotificationManager nm = (NotificationManager) msg.obj;
    if (nm != null) {
    nm.cancel(msg.arg1);
    }
    break;
    }
    return false;
  }
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.share_sina);
    init();
    requestWeibo();
    // 初始化ShareSDK
    
  
//  public SinaShare(String imageUrl, String content,String title) {
//    this.imageUrl=imageUrl;
//    this.content=content;
//    this.title=title;
//  }
  @Override
  public boolean handleMessage(Message msg) {
    switch (msg.what) {
    case MSG_TOAST: {
    String text = String.valueOf(msg.obj);
    Toast.makeText(SinaShare.this, text, Toast.LENGTH_SHORT).show();
    }
    break;
    case MSG_ACTION_CCALLBACK: {
    switch (msg.arg1) {
    case 1: // 成功后发送Notification
    showNotification(2000, "分享完成");
    break;
    case 2: // 失败后发送Notification
    showNotification(2000, "分享失败");
    break;
    case 3: // 取消
    
杉杉来吃
授权成功后 点击一键分享 就只出现了一个白色的横条
墨梅

引用来自“杉杉来吃”的评论

授权成功后 点击一键分享 就只出现了一个白色的横条
mainfest 给权限了吗?sdk注册了没有?这个代码有点乱啊!
杉杉来吃
好了!!! 是jar包的问题
cray丶mc
出现r cannot resolved to a variable怎么解决啊?
墨梅

引用来自“帅我”的评论

出现r cannot resolved to a variable怎么解决啊?
能看下你代码吗?
Zoe_atsuko
请问一下 包和导入的cn.share都一样,cn.share.framework却显示没有这个包无法Import,是怎么回事呀?
×
墨梅
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: