尊重原创:http://blog.csdn.net/yuanzeyao/article/details/38781957
第三方登陆和分享功能在眼下大部分APP中都有,分享功能能够将自己觉得有意义的东西分享给身边的朋友,而第三方登陆能够借助已经有巨大用户基础的平台(如QQ和新浪微博)的账号,让用户在使用自己APP的时候不用注冊,直接使用第三方账号登陆,从而避免了注冊的过程(事实上是server端帮你注冊),这对于吸引很多其它的用户非常有意义。以下我们就以新浪微博为例,解说怎样实现分享功能和第三方登陆。首先你须要到新浪微博开放平台创建一个应用:
新浪微博开放平台:http://open.weibo.com/
首先我们来介绍分享功能,分享功能就是将一些信息分享到一些社交app中,如比較热门的就是新浪微博,腾讯微博,人人网,开心网,微信,朋友圈,易信等等,在Android中 实现分享功能通常有四种方式:
方式一:使用Android自带的分享功能,通过Intent找出手机中全部的社交app
这样的方式的长处就是实现比較简单,不须要引入第三方sdk,缺点就是须要安装社交app之后才干分享,事实上我觉得这个也是合理的,试想假设一个人的手机中没有安装新浪微博,那么意味着他肯定不玩微博,所以不能分享也无所谓
//分享文本
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, "我用手机測试分享内容");
sendIntent.setType("text/plain");
startActivity(Intent.createChooser(sendIntent, "我是弹出框的标题"));
弹出界面例如以下:
不同人手机这个节目肯定是不一样的,由于有些人喜欢玩微博,仅仅装了微博,没有微信。假设一个人不玩社交app,那么这个Dialog里面至少有一个是短信和蓝牙之类的,由于这些每一个手机都有。
方式二:使用ShareSDK实现,ShareSDK是一款功能非常强大的第三方提供的专门用于分享等功能的sdk,使用也非常easy,可是须要引入一些sdk,这里我就不举例了,研究一些ShareSDK提供的demo就能够实现,长处是简单,功能强大,而且不须要安装社交app
方式三:使用社交开放平台提供的sdk,有点事简单,可是须要安装社交app
方式四:使用社交平台提供的api接口,通过调用这些api接口实现分享和登陆,使用这样的不须要安装社交app
本文着重介绍第四种方式,并以新浪微博为例:
1、创建微博授权所需參数的持久化类
/** * 该类定义了微博授权时所须要的參数。 * * @author SINA * @since 2013-10-07 */ public class AccessTokenKeeper { private static final String PREFERENCES_NAME = "com_weibo_sdk_android"; private static final String KEY_UID = "uid"; private static final String KEY_ACCESS_TOKEN = "access_token"; private static final String KEY_EXPIRES_IN = "expires_in"; /** * 保存 Token 对象到 SharedPreferences。 * * @param context 应用程序上下文环境 * @param token Token 对象 */ public static void writeAccessToken(Context context, Oauth2AccessToken token) { if (null == context || null == token) { return; } SharedPreferences pref = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_APPEND); Editor editor = pref.edit(); editor.putString(KEY_UID, token.getUid()); editor.putString(KEY_ACCESS_TOKEN, token.getToken()); editor.putLong(KEY_EXPIRES_IN, token.getExpiresTime()); editor.commit(); } /** * 从 SharedPreferences 读取 Token 信息。 * * @param context 应用程序上下文环境 * * @return 返回 Token 对象 */ public static Oauth2AccessToken readAccessToken(Context context) { if (null == context) { return null; } Oauth2AccessToken token = new Oauth2AccessToken(); SharedPreferences pref = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_APPEND); token.setUid(pref.getString(KEY_UID, "")); token.setToken(pref.getString(KEY_ACCESS_TOKEN, "")); token.setExpiresTime(pref.getLong(KEY_EXPIRES_IN, 0)); return token; } /** * 清空 SharedPreferences 中 Token信息。 * * @param context 应用程序上下文环境 */ public static void clear(Context context) { if (null == context) { return; } SharedPreferences pref = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_APPEND); Editor editor = pref.edit(); editor.clear(); editor.commit(); } }
/** * 新浪微博API,能够依据自己的须要加入API * * @author [email protected] * */ public class SinaWeiboAPI { /** * 訪问微博服务接口的地址 */ public static final String API_SERVER = "https://api.weibo.com/2"; private static final String URL_USERS = API_SERVER + "/users"; private static final String URL_STATUSES = API_SERVER + "/statuses"; private static final String URL_ACCOUNT = API_SERVER + "/account"; /** * post请求方式 */ public static final String HTTPMETHOD_POST = "POST"; /** * get请求方式 */ public static final String HTTPMETHOD_GET = "GET"; private Oauth2AccessToken oAuth2accessToken; private String accessToken; /** * 构造函数,使用各个API接口提供的服务前必须先获取Oauth2AccessToken * * @param accesssToken * Oauth2AccessToken */ public SinaWeiboAPI(Oauth2AccessToken oauth2AccessToken) { this.oAuth2accessToken = oauth2AccessToken; if (oAuth2accessToken != null) { accessToken = oAuth2accessToken.getToken(); } } /** * 运行请求 * * @param url * @param params * @param httpMethod * @param listener */ private void request(final String url, final WeiboParameters params, final String httpMethod, RequestListener listener) { params.put("access_token", accessToken); AsyncWeiboRunner.requestAsync(url, params, httpMethod, listener); } /** * 依据用户ID获取用户信息 * * @param uid * 须要查询的用户ID。 * @param listener */ public void show(long uid, RequestListener listener) { WeiboParameters params = new WeiboParameters(); params.put("uid", uid); request(URL_USERS + "/show.json", params, HTTPMETHOD_GET, listener); } /** * 公布一条新微博(连续两次公布的微博不能够反复) * * @param content * 要公布的微博文本内容,内容不超过140个汉字。 * @param lat * 纬度,有效范围:-90.0到+90.0,+表示北纬,默觉得0.0。 * @param lon * 经度,有效范围:-180.0到+180.0,+表示东经,默觉得0.0。 * @param listener */ public void update(String content, String lat, String lon, RequestListener listener) { WeiboParameters params = new WeiboParameters(); params.put("status", content); if (!TextUtils.isEmpty(lon)) { params.put("long", lon); } if (!TextUtils.isEmpty(lat)) { params.put("lat", lat); } request(URL_STATUSES + "/update.json", params, HTTPMETHOD_POST, listener); } /** * 上传图片并公布一条新微博,此方法会处理urlencode * * @param content * 要公布的微博文本内容,内容不超过140个汉字 * @param file * 要上传的图片,仅支持JPEG、GIF、PNG格式,图片大小小于5M。 * @param lat * 纬度,有效范围:-90.0到+90.0,+表示北纬,默觉得0.0。 * @param lon * 经度,有效范围:-180.0到+180.0,+表示东经,默觉得0.0。 * @param listener */ public void upload(String content, String file, String lat, String lon, RequestListener listener) { WeiboParameters params = new WeiboParameters(); params.put("status", content); params.put("pic", file); if (!TextUtils.isEmpty(lon)) { params.put("long", lon); } if (!TextUtils.isEmpty(lat)) { params.put("lat", lat); } request(URL_STATUSES + "/upload.json", params, HTTPMETHOD_POST, listener); } //分享一张带网络图片的微博 public void updateImgWithURL(String content, String url,RequestListener listener) { WeiboParameters params = new WeiboParameters(); params.put("status", content); params.put("url", url); request(URL_STATUSES + "/upload_url_text.json", params, HTTPMETHOD_POST, listener); } /** * 退出登录 * * @param listener */ public void endSession(RequestListener listener) { WeiboParameters params = new WeiboParameters(); request(URL_ACCOUNT + "/end_session.json", params, HTTPMETHOD_POST, listener); } }
//从本地读取token,检查是否失效或者是否认证 mAccessToken=AccessTokenKeeper.readAccessToken(this); if(mAccessToken!=null && mAccessToken.isSessionValid()) { mSinaWeiboApi=new SinaWeiboAPI(mAccessToken); mSinaWeiboApi.update("视频 康熙来了:http://www.iqiyi.com/v_19rrmo4v0o.html", null, null, listener); }else { //假设失效或者没有认证,那么须要又一次认证, mWeiboAuth.anthorize(new WeiboAuthListener() { @Override public void onWeiboException(WeiboException arg0) { } @Override public void onComplete(Bundle bundle) { //认证成功,保存到本地 mAccessToken = Oauth2AccessToken.parseAccessToken(bundle); if(mAccessToken.isSessionValid()) { AccessTokenKeeper.writeAccessToken(ShareActivity.this, mAccessToken); mSinaWeiboApi=new SinaWeiboAPI(mAccessToken); //然后分享 mSinaWeiboApi.update("视频 康熙来了:http://www.iqiyi.com/v_19rrmo4v0o.html", null, null, listener); } } @Override public void onCancel() { } }); }
WeiboMessage weiboMessage = new WeiboMessage(); weiboMessage.mediaObject = getVideoObj(); SendMessageToWeiboRequest request = new SendMessageToWeiboRequest(); // 用transaction唯一标识一个请求 request.transaction = String.valueOf(System.currentTimeMillis()); request.message = weiboMessage; // 3. 发送请求消息到微博,唤起微博分享界面 mWeiboShareAPI.sendRequest(request); }else if(view.getId()==R.id.btn_login) { mAccessToken=AccessTokenKeeper.readAccessToken(this); //已经认证 if(mAccessToken!=null &&mAccessToken.isSessionValid()) { mSinaWeiboApi=new SinaWeiboAPI(mAccessToken); mSinaWeiboApi.show(Long.parseLong(mAccessToken.getUid()),listener); }else { //没有认证或者认证过期 mWeiboAuth.anthorize(new WeiboAuthListener() { @Override public void onWeiboException(WeiboException arg0) { } @Override public void onComplete(Bundle bundle) { mAccessToken = Oauth2AccessToken.parseAccessToken(bundle); AccessTokenKeeper.writeAccessToken(ShareActivity.this, mAccessToken); mSinaWeiboApi=new SinaWeiboAPI(mAccessToken); mSinaWeiboApi.show(Long.parseLong(mAccessToken.getUid()),listener); } @Override public void onCancel() { } }); }
好了,先写到这里,事实上假设你学会了分享和登陆,那么事实上你全然能够自己去写一个新浪微博,由于这个jar包里面提供了新浪微博全部操作的api,如获取某人发的全部微博,获取粉丝,自己关注的人等等,事实上网上非常多新浪微博开发的样例都是通过这种方法实现的