【Android进阶】使用第三方平台ShareSDK实现新浪微博的一键分享功能
在公司最近的一个项目中,需要实现一键分享功能,在这里我使用的是第三方平台ShareSDK,将使用经验与大家分享
先看效果图
主界面
分享界面
由于第一次使用,所以需要先进行新浪授权,授权界面
分享结果图片
下面开始介绍如何使用ShareSDK实现微博的分享功能(其他平台的类似)
首先看一下项目的结构图
在使用shareSDK之前,我们需要先到新浪微博的开放平台进行注册,获得appkey以及其他的信息
下面图片中划掉的部分是要重点关注的
特别需要注意的是,下面的回调网址必须填写,而且在代码中有涉及,使用默认的即可
至此,开发之前的准备工作已经做好了,下面还是贴代码
首先看一下布局文件代码,很简单,只有一个按钮
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:gravity="center_vertical" >
- <Button
- android:onClick="click"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="一键快捷分享" />
- </LinearLayout>
MainActivity.java
- package com.heli17.weiboonekeylogin;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.util.HashMap;
- import android.app.Activity;
- import android.app.Notification;
- import android.app.NotificationManager;
- import android.app.PendingIntent;
- import android.content.Context;
- import android.content.Intent;
- import android.graphics.Bitmap;
- import android.graphics.Bitmap.CompressFormat;
- import android.graphics.BitmapFactory;
- import android.os.Bundle;
- import android.os.Environment;
- import android.os.Handler.Callback;
- import android.os.Message;
- import android.view.View;
- import android.widget.Toast;
- import cn.sharesdk.framework.Platform;
- import cn.sharesdk.framework.PlatformActionListener;
- import cn.sharesdk.framework.ShareSDK;
- import cn.sharesdk.framework.utils.UIHandler;
- import cn.sharesdk.onekeyshare.OnekeyShare;
- public class MainActivity extends Activity 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;
- // sdcard中的图片名称
- private static final String FILE_NAME = "/share_pic.jpg";
- public static String TEST_IMAGE;
- @Override
- public boolean handleMessage(Message msg) {
- switch (msg.what) {
- case MSG_TOAST: {
- String text = String.valueOf(msg.obj);
- Toast.makeText(MainActivity.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.activity_main);
- // 初始化ShareSDK
- ShareSDK.initSDK(this);
- // 初始化图片路径
- new Thread() {
- public void run() {
- initImagePath();
- }
- }.start();
- }
- //一键分享的点击事件
- public void click(View v) {
- //实例化一个OnekeyShare对象
- OnekeyShare oks = new OnekeyShare();
- //设置Notification的显示图标和显示文字
- oks.setNotification(R.drawable.ic_launcher, "ShareSDK demo");
- //设置短信地址或者是邮箱地址,如果没有可以不设置
- oks.setAddress("12345678901");
- //分享内容的标题
- oks.setTitle("分享内容的标题");
- //标题对应的网址,如果没有可以不设置
- oks.setTitleUrl("http://www.17heli.com");
- //设置分享的文本内容
- oks.setText("分享的文本内容");
- //设置分享照片的本地路径,如果没有可以不设置
- oks.setImagePath(MainActivity.TEST_IMAGE);
- //设置分享照片的url地址,如果没有可以不设置
- oks.setImageUrl("http://img.appgo.cn/imgs/sharesdk/content/2013/07/25/1374723172663.jpg");
- //微信和易信的分享的网络连接,如果没有可以不设置
- oks.setUrl("http://sharesdk.cn");
- //人人平台特有的评论字段,如果没有可以不设置
- oks.setComment("comment");
- //程序的名称或者是站点名称
- oks.setSite("site");
- //程序的名称或者是站点名称的链接地址
- oks.setSiteUrl("http://www.baidu.com");
- //设置纬度
- oks.setLatitude(23.122619f);
- //设置精度
- oks.setLongitude(113.372338f);
- //设置是否是直接分享
- oks.setSilent(false);
- //显示
- oks.show(MainActivity.this);
- }
- private void initImagePath() {
- try {
- if (Environment.MEDIA_MOUNTED.equals(Environment
- .getExternalStorageState())
- && Environment.getExternalStorageDirectory().exists()) {
- TEST_IMAGE = Environment.getExternalStorageDirectory()
- .getAbsolutePath() + FILE_NAME;
- } else {
- TEST_IMAGE = getApplication().getFilesDir().getAbsolutePath()
- + FILE_NAME;
- }
- // 创建图片文件夹
- File file = new File(TEST_IMAGE);
- if (!file.exists()) {
- file.createNewFile();
- Bitmap pic = BitmapFactory.decodeResource(getResources(),
- R.drawable.pic);
- FileOutputStream fos = new FileOutputStream(file);
- pic.compress(CompressFormat.JPEG, 100, fos);
- fos.flush();
- fos.close();
- }
- } catch (Throwable t) {
- t.printStackTrace();
- TEST_IMAGE = null;
- }
- }
- @Override
- protected void onDestroy() {
- super.onDestroy();
- // 在Activity中停止ShareSDK
- ShareSDK.stopSDK(this);
- }
- // 取消后的回调方法
- @Override
- public void onCancel(Platform platform, int action) {
- Message msg = new Message();
- msg.what = MSG_ACTION_CCALLBACK;
- msg.arg1 = 3;
- msg.arg2 = action;
- msg.obj = platform;
- UIHandler.sendMessage(msg, this);
- }
- // 完成后的回调方法
- @Override
- public void onComplete(Platform platform, int action,
- HashMap<String, Object> arg2) {
- Message msg = new Message();
- msg.what = MSG_ACTION_CCALLBACK;
- msg.arg1 = 1;
- msg.arg2 = action;
- msg.obj = platform;
- UIHandler.sendMessage(msg, this);
- }
- // 出错后的回调方法
- @Override
- public void onError(Platform platform, int action, Throwable t) {
- t.printStackTrace();
- Message msg = new Message();
- msg.what = MSG_ACTION_CCALLBACK;
- msg.arg1 = 2;
- msg.arg2 = action;
- msg.obj = t;
- UIHandler.sendMessage(msg, this);
- }
- // 根据传入的参数显示一个Notification
- @SuppressWarnings("deprecation")
- private void showNotification(long cancelTime, String text) {
- try {
- Context app = getApplicationContext();
- NotificationManager nm = (NotificationManager) app
- .getSystemService(Context.NOTIFICATION_SERVICE);
- final int id = Integer.MAX_VALUE / 13 + 1;
- nm.cancel(id);
- long when = System.currentTimeMillis();
- Notification notification = new Notification(
- R.drawable.ic_launcher, text, when);
- PendingIntent pi = PendingIntent.getActivity(app, 0, new Intent(),
- 0);
- notification.setLatestEventInfo(app, "sharesdk test", text, pi);
- notification.flags = Notification.FLAG_AUTO_CANCEL;
- nm.notify(id, notification);
- if (cancelTime > 0) {
- Message msg = new Message();
- msg.what = MSG_CANCEL_NOTIFY;
- msg.obj = nm;
- msg.arg1 = id;
- UIHandler.sendMessageDelayed(msg, cancelTime, this);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
ShareSDK.xml
- <?xml version="1.0" encoding="utf-8"?>
- <DevInfor>
- <!--
- 说明:
- 1、表格中的第一项
- <ShareSDK
- AppKey="api20" />
- 是必须的,其中的AppKey是您在ShareSDK上注册的开发者帐号的AppKey
- 2、所有集成到您项目的平台都应该为其在表格中填写相对应的开发者信息,以新浪微博为例:
- <SinaWeibo
- Id="1"
- SortId="1"
- AppKey="568898243"
- AppSecret="38a4f8204cc784f81f9f0daaf31e02e3"
- RedirectUrl="http://www.sharesdk.cn"
- Enable="true" />
- 其中的SortId是此平台在分享列表中的位置,由开发者自行定义,可以是任何整型数字,数值越大
- 越靠后AppKey、AppSecret和RedirectUrl是您在新浪微博上注册开发者信息和应用后得到的信息
- Id是一个保留的识别符,整型,ShareSDK不使用此字段,供您在自己的项目中当作平台的识别符。
- Enable字段表示此平台是否有效,布尔值,默认为true,如果Enable为false,即便平台的jar包
- 已经添加到应用中,平台实例依然不可获取。
- 各个平台注册应用信息的地址如下:
- 新浪微博 http://open.weibo.com
- 腾讯微博 http://dev.t.qq.com
- QQ空间 http://connect.qq.com/intro/login/
- 微信好友 http://open.weixin.qq.com
- Facebook https://developers.facebook.com
- Twitter https://dev.twitter.com
- 人人网 http://dev.renren.com
- 开心网 http://open.kaixin001.com
- 搜狐微博 http://open.t.sohu.com
- 网易微博 http://open.t.163.com
- 豆瓣 http://developers.douban.com
- 有道云笔记 http://note.youdao.com/open/developguide.html#app
- 印象笔记 https://dev.evernote.com/
- Linkedin https://www.linkedin.com/secure/developer?newapp=
- FourSquare https://developer.foursquare.com/
- 搜狐随身看 https://open.sohu.com/
- Flickr http://www.flickr.com/services/
- Pinterest http://developers.pinterest.com/
- Tumblr http://www.tumblr.com/developers
- Dropbox https://www.dropbox.com/developers
- Instagram http://instagram.com/developer#
- VKontakte http://vk.com/dev
- -->
- <ShareSDK AppKey="13881da34ebe" /> <!-- 修改成你在sharesdk后台注册的应用的appkey" -->
- <SinaWeibo
- AppKey="5555572"
- AppSecret="5ae6d40aac6e7c0d7d84715540a30d71"
- Enable="true"
- Id="1"
- RedirectUrl="https://api.weibo.com/oauth2/default.html"
- SortId="1" />
- </DevInfor>
清单文件Mainfest.xml
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.heli17.weiboonekeylogin"
- android:versionCode="1"
- android:versionName="1.0" >
- <uses-sdk
- android:minSdkVersion="8"
- android:targetSdkVersion="19" />
- <!-- 需要的权限注册 -->
- <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" />
- <application
- android:allowBackup="true"
- android:icon="@drawable/ic_launcher"
- android:label="@string/app_name" >
- <activity
- android:name="com.heli17.weiboonekeylogin.MainActivity"
- android:label="@string/app_name"
- android:theme="@android:style/Theme.Black.NoTitleBar" >
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- <!-- 这是进行授权页面的注册 -->
- <activity
- android:name="cn.sharesdk.framework.ShareSDKUIShell"
- android:configChanges="keyboardHidden|orientation"
- android:screenOrientation="portrait"
- android:theme="@android:style/Theme.Translucent.NoTitleBar"
- android:windowSoftInputMode="stateHidden|adjustResize" >
- <meta-data
- android:name="Adapter"
- android:value="cn.sharesdk.demo.MyAdapter" />
- <intent-filter>
- <data android:scheme="db-7janx53ilz11gbs" />
- <action android:name="android.intent.action.VIEW" />
- <category android:name="android.intent.category.BROWSABLE" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- </activity>
- </application>
- </manifest>
好了,这样就可以实现新浪微博的一键分享了,如果有什么问题,请留言交流
【Android进阶】使用第三方平台ShareSDK实现新浪微博的一键分享功能的更多相关文章
- android一键分享功能不使用任何第三方sdk
在android中有自带的一键分享功能,不过它会把所有带分享的应用都找出来,如果我们只需要一些常见的分享应用,该如何做呢? 下面看我的效果图(横屏和竖屏自动适配): 接下来看我的调用(支持图片和文字分 ...
- 基于Qt下移动平台第三方接入-ShareSDK(新浪微博,微信朋友圈等分享登录)
一. ShareSDK简介 ShareSDK是为iOS.Android.WP8的APP提供社会化功能的一个组件,开发者只需10分钟即 可集成到自己的APP中,它不仅支持如QQ.微信.新浪微博.腾讯微博 ...
- Android之第三方平台实现QQ登录和QQ分享
目前大多数APP都包含了第三方平台的登录,特别是QQ和微信,这篇博客主要讲的是如何实现QQ第三方平台实现QQ登录和分享功能,功能包含: 登录授权登录获取用户信息(昵称,头像,地址等) QQ分享给好友 ...
- react native一键分享功能实现&原理和注意点(支持微信、qq、新浪微博等)
目前手机使用的一键分享SDK比较主流的有两个:一个是ShareSDK,另一个是友盟分享. 又因为友盟功能比较多且比较全,比如说友盟统计.友盟推送等,所以本文重点介绍的是友盟分享功能在rn上的应用以及要 ...
- Android 一键分享功能简单实现
import java.io.File;import java.util.ArrayList;import java.util.List; import android.content.Context ...
- Android中使用ShareSDK集成分享功能
引言 现在APP开发集成分享功能已经是非常普遍的需求了.其他集成分享技术我没有使用过,今天我就来介绍下使用ShareSDK来进行分享功能开发的一些基本步骤和注意点,帮助朋友们避免一些坑.好了 ...
- Android社会化分享功能的实现步骤
众所周知,互联网是一个资源共享的地方,在网络上,我们可以分享我们所有认为好的资源.而随着互联网信息爆发式的增长,我们习惯了一键分享功能,比如:微博分享.微信分享.QQ空间分享.人人网分享等等.由此可见 ...
- 探索Android调用系统的分享功能
非常多的应用为了应用的推广和传播都会使用"分享"的功能,点击分享button.就能将想要分享的内容或者图片分享至QQ空间.微博.微信朋友圈等实现了分享功能的应用.这篇文章主要是为了 ...
- 使用Sharesdk实现第三方平台登录(qq,新浪微博)
首先到sharesdk开放píng台下载demo ,以下要用到的文件来自于 simple里面 第一步:导入官方的jar包 第二步:添加ShareSDK.xml文件并修改相关píng台key 第 ...
随机推荐
- OpenCV-Python教程(5、初级滤波内容)
本篇文章介绍如何用OpenCV-Python来实现初级滤波功能. 提示: 转载请详细注明原作者及出处,谢谢! 本文介绍使用OpenCV-Python实现基本的滤波处理 本文不介绍滤波处理的详细概念,所 ...
- Java中字符串中子串的查找共有四种方法(indexof())
Java中字符串中子串的查找共有四种方法(indexof()) Java中字符串中子串的查找共有四种方法,如下:1.int indexOf(String str) :返回第一次出现的指定子字符串在此字 ...
- hdu1166(线段树)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 线段树功能:update:单点增减 query:区间求和 #pragma comment(lin ...
- [C++/CLI编程宝典][2]什么是C++/CLI语言
对于什么是C++/CLI,我们首先能够简单的将其名字划分为两部分来理解,第一,C++,我们熟悉的眼下被广泛使用的面向对象的ISO国际标准的高级语言,也称为ISOC++,我们这里以后均称其为ISOC++ ...
- (转载)浅析error LNK2001: unresolved external symbol "public: __thisc...
学习VC++时经常会遇到链接错误LNK2001,该错误非常讨厌,因为对于 编程者来说,最好改的错误莫过于编译错误,而一般说来发生连接错误时, 编译都已通过.产生连接错误的原因非常多 ...
- Gradle 修改 Maven 仓库地址(转)
近来迁移了一些项目到Android Studio,采用Gradle构建确实比原来的Ant方便许多.但是编译时下载依赖的网速又着实令人蛋疼不已. 如果能切换到国内的Maven镜像仓库,如开源中国的Mav ...
- 怎样在屏幕上显示多个alv
本文解说怎样在屏幕上显示多个alv. 实现这种需求关键是下面几点(举例:在屏幕上显示4个alv): 1.须要定义4个alv control 2.由于有4个alv control,于是就须要定义4个容器 ...
- VS调试技巧之附加进程
用过VS一段时间的程序猿们相信都有过这种调试经历:每次按下F5进行断点调试时,都要等待好长时间:先让解决方式编译通过,然后启动VS自带的简版IIS作为server启动,进而开启浏览器,最后进行对应的操 ...
- SQL Server 字段类型 decimal(18,6)小数点前是几位?记一次数据库SP的BUG处理
原文:SQL Server 字段类型 decimal(18,6)小数点前是几位?记一次数据库SP的BUG处理 SQL Server 字段类型 decimal(18,6)小数点前是几位? 不可否认,这是 ...
- 用数组array代替CActiveRecord构建CArrayDataProvider
当需要构建 GridView的时候: 常常用 CArrayDataProvider 或者 CActiveDataProvider 这是就需要一个CActiveRecord 比如: 857 ...