需求

手头的一个应用需要添加分享到新浪微博的功能,这个功能在现在的应用上是非常的普遍的了。

分享到新浪微博,其实就是发送一条特定内容的微博,所以需要用到新浪微博SDK了。

微博SDK

SDK的下载地址 http://open.weibo.com/wiki/SDK,包括很多平台的封装,其中就有android版本的。

下载后,请务必读一下SDK文档,运行其中自带的demo,对sdk的使用有个大概的了解。

发送微博的困扰

运行DEMO后发现,其中发送微博的功能竟然是通过调用微博客户端的方式来实现的,如果用户没有安装,会提示用户下载,或者选择放弃发送。。。这明显不靠谱啊,因为还是有很多用户没有安装微博客户端的。

网上也有不少人遇到这个问题,从他们的说法中可以看出微博sdk前一个版本中似乎还是有发送微博这个功能的,不过新版的sdk中没有了。

不过demo中还是给了提示了:如果不想使用微博客户端进行分享,请参考OpenAPI。

那我们就来看看这OpenAPI有什么功能。

OpenAPI

OpenAPI的文档:http://open.weibo.com/wiki/%E5%BE%AE%E5%8D%9AAPI

可以看出OpenAPI就是通过Http请求的方式来进行一些操作,可以进行的操作基本涵盖了微博应用的所有方面。

我们找到发送微博的API:statuses/update

文档的说明很详细,改接口通过POST方法,请求参数有很多,不过必须的只有一个。不过,改接口是需要登录的,所以参数中还需加上登录授权过的AccessToken:

参数名 必选 类型及范围 说明
status true string 要发布的微博文本内容,必须做URLencode,内容不超过140个汉字。
access_token true string 登录后得到,详见后文

现在,发送微博的逻辑很明确了,就是一个post请求。还需要解决的一个问题就是AccessToken,即登录授权。

登录授权

并不是你想让用户在你的应用里登录微博就可以直接写代码实现的,因为用户是在你的应用里输入账户信息,所以对于用户的账户安全来说,这是有风险的,所以如果你的应用需要加入微博功能,是需通过新浪审核的。这个流程我也没有完整的走过,不过大家可以参考微博文档的帮助:移动客户端接入

这篇文章主要讲程序,所以不在这些流程上纠结。总之,我们需要的是一个APPKEY,登录授权需要它。我们现在可以先用SDK微博应用demo的APPKEY来实验。

DEMO实践步骤

  1. 因为使用的是微博DEMO的APPKEY所以需要替换默认的 debug.keystore
    在 C:\Users\XXXXX.android 目录下,把 Android 默认的 debug.keystore 替换成官方在 GitHub 上提供的debug.keystore。
    请注意:这一步是必须的,如果没有替换,demo 程序在运行时将无法正确的授权成功。用户在替换前,最好先备份一下原始的 debug.keystore。另外,该 debug.keysotre 是新浪官方的,除了编译运行官方 DEMO 外,请不要直接使用它,出于安全的考虑,您应该为自己的应用提供一份 keysotre。
  2. 新建android工程,包名取名为:com.sina.weibo.sdk.demo
  3. 拷贝微博DEMO中的Constants.java到工程中
  4. 在AndroidManifest.xml中添加权限:

     <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" />
  5. 主界面的代码,登录授权部分的代码直接取自微博官方DEMO,发送微博部分是上文分析的实现:

     public class MainActivity extends Activity {
    private static final String TAG = "MainActivity"; /** 微博 Web 授权类,提供登陆等功能 */
    private WeiboAuth mWeiboAuth; /** 封装了 "access_token","expires_in","refresh_token",并提供了他们的管理功能 */
    private Oauth2AccessToken mAccessToken; private TextView mTokenInfoTV;
    private EditText mMessageET;
    private Button mSendBtn; @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main); mWeiboAuth = new WeiboAuth(this, Constants.APP_KEY, Constants.REDIRECT_URL, Constants.SCOPE); mTokenInfoTV = (TextView) findViewById(R.id.textView_tokenInfo);
    mMessageET = (EditText) findViewById(R.id.editText_message);
    mSendBtn = (Button) findViewById(R.id.button_sendWeibo); // 获取Token
    findViewById(R.id.button_getToken).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    mWeiboAuth.anthorize(new AuthListener());
    }
    }); // 发送微博
    mMessageET.setVisibility(View.GONE);
    mSendBtn.setVisibility(View.GONE);
    mSendBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    sendWeibo(mMessageET.getText().toString());
    }
    });
    } // 发送微博
    protected void sendWeibo(String string) {
    //组织post参数
    List<BasicNameValuePair> params = new LinkedList<BasicNameValuePair>();
    params.add(new BasicNameValuePair("status", string));
    params.add(new BasicNameValuePair("access_token", mAccessToken.getToken())); HttpClient httpClient = new DefaultHttpClient(); //传入post方法的请求地址,即发送微博的api接口
    HttpPost postMethod = new HttpPost("https://api.weibo.com/2/statuses/update.json");
    try {
    postMethod.setEntity(new UrlEncodedFormEntity(params, "utf-8"));
    HttpResponse httpResponse = httpClient.execute(postMethod); //将返回结果转为字符串,通过文档可知返回结果为json字符串,结构请参考文档
    String resultStr=EntityUtils.toString(httpResponse.getEntity());
    Log.e(TAG, resultStr); //从json字符串中建立JSONObject
    JSONObject resultJson = new JSONObject(resultStr); //如果发送微博失败的话,返回字段中有"error"字段,通过判断是否存在该字段即可知道是否发送成功
    if (resultJson.has("error")) {
    Toast.makeText(this, "发送失败", Toast.LENGTH_SHORT).show();
    } else {
    Toast.makeText(this, "发送成功", Toast.LENGTH_SHORT).show();
    } } catch (UnsupportedEncodingException e) {
    Log.e(TAG, e.getLocalizedMessage());
    } catch (ClientProtocolException e) {
    Log.e(TAG, e.getLocalizedMessage());
    } catch (IOException e) {
    Log.e(TAG, e.getLocalizedMessage());
    } catch (ParseException e) {
    Log.e(TAG, e.getLocalizedMessage());
    } catch (JSONException e) {
    Log.e(TAG, e.getLocalizedMessage());
    }
    } //登录授权接口
    class AuthListener implements WeiboAuthListener { //登录成功
    @Override
    public void onComplete(Bundle values) {
    // 从 Bundle 中解析 Token
    mAccessToken = Oauth2AccessToken.parseAccessToken(values);
    if (mAccessToken.isSessionValid()) {
    // 显示 Token
    updateTokenView(); // 显示发送微博的按钮和输入框
    mSendBtn.setVisibility(View.VISIBLE);
    mMessageET.setVisibility(View.VISIBLE); // 保存 Token 到 SharedPreferences
    // AccessTokenKeeper.writeAccessToken(MainActivity.this,
    // mAccessToken);
    Toast.makeText(MainActivity.this, "授权成功", Toast.LENGTH_SHORT).show();
    } else {
    // 当您注册的应用程序签名不正确时,就会收到 Code,请确保签名正确
    String code = values.getString("code");
    String message = "授权失败";
    if (!TextUtils.isEmpty(code)) {
    message = message + "\nObtained the code: " + code;
    }
    Toast.makeText(MainActivity.this, message, Toast.LENGTH_LONG).show();
    }
    } @Override
    public void onCancel() {
    Toast.makeText(MainActivity.this, "取消授权", Toast.LENGTH_LONG).show();
    } @Override
    public void onWeiboException(WeiboException e) {
    Toast.makeText(MainActivity.this, "Auth exception : " + e.getMessage(), Toast.LENGTH_LONG).show();
    }
    } //显示token信息
    private void updateTokenView() {
    String date = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(new java.util.Date(mAccessToken
    .getExpiresTime()));
    String format = "Token:%1$s \n有效期:%2$s";
    mTokenInfoTV.setText(String.format(format, mAccessToken.getToken(), date));
    } @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
    } }
  1. 主界面的布局代码:

     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" > <Button
    android:id="@+id/button_getToken"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="获取token" /> <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Token 信息:"
    android:textSize="20sp" /> <TextView
    android:id="@+id/textView_tokenInfo"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text=""
    android:textSize="20sp" /> <EditText
    android:id="@+id/editText_message"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ems="10" > <requestFocus />
    </EditText> <Button
    android:id="@+id/button_sendWeibo"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="发送微博" /> </LinearLayout>

运行效果

发送微博DEMO下载地址

http://files.cnblogs.com/mushan/WeiboSDKTest.zip

Android应用内使用新浪微博SDK发送微博(不调用微博客户端)的更多相关文章

  1. 使用 Android Studio 跑新浪微博SDK Demo遇到的问题及解决

    概述 这是新浪微博官方 Android SDK Demo 使用 Android Studio 导入.编译并运行通过的版本. 源码:WeiboSdkDemo 官方项目请点击: weibo_android ...

  2. 新浪微博SDK开发(1):总述

    花了几天时间,消耗了九牛六虎之力,新浪微博大部分API已经封装,但有部分API实在太难封装. 说起这封装,我必须严重地.从人品和技术层面鄙视一下新浪的程序员,实在太菜了.估计菜鸟都被大企业吸收了,菜到 ...

  3. Android第三方登陆之新浪微博Weibo篇(原生登陆授权)

    前言 Android第三方登录可以说是非常的常见,今天主要先说一下新浪微博第三方登陆授权. SDK版本支持 SDK v3.0已经发布了支持iPhone和Android的版本. 须将你的应用的包名签名信 ...

  4. 新浪微博SDK在Eclipse引入

    新浪微博SDK在Eclipse中的使用 新浪微博SDK在Eclipse中的使用 今天在看<Android开发应用实战>,全书都在讲一个android版的新浪微博客户端怎么做,于是按照书上步 ...

  5. Android应用内实现视频播放--腾讯浏览服务(TBS)

    TBS视频播放 TBS视频播放器可以支持市面上几乎所有的视频格式,包括mp4, flv, avi, 3gp, webm, ts, ogv, m3u8, asf, wmv, rm, rmvb, mov, ...

  6. 在Eclipse中导入新浪微博SDK

    在Eclipse中导入新浪微博SDK 今天在看<Android开发应用实战>,全书都在讲一个android版的新浪微博客户端怎么做,于是按照书上步骤做.网上有人说这本书没有细节,我想对于小 ...

  7. Android下 使用百度地图sdk

    百度地图 Android SDK是一套基于Android 2.1(v1.3.5及以前版本支持android 1.5以上系统)及以上版本设备的应用程序接口.可以使用该套 SDK开发适用于Android系 ...

  8. 【原创】在 .NET Core 3.1 中使用 Senparc.Weixin.Work 企业微信 SDK —— 发送文本消息

    下面在控制台应用里展示一个简单的例子来实现发送文本消息. 本文目录: 创建控制台应用 添加SDK引用 命令行方式 进入项目目录 添加包引用 配置和使用SDK 添加appsettings.json文件 ...

  9. Android开发 对接微信分享SDK总结

    原文:Android开发 对接微信分享SDK总结 - Stars-One的杂货小窝 公司项目需要对接微信分享,本来之前准备对接友盟分享的,但友盟的分享实际参数太多,而我又只需要对接一个微信分享,于是便 ...

随机推荐

  1. 《深入浅出MyBatis技术原理与实战》——6. MyBatis的解析和运行原理

    MyBatis的运行分为两大部分,第一部分是读取配置文件缓存到Configuration对象,用以创建SqlSessionFactory,第二部分是SqlSession的执行过程. 6.1 涉及的技术 ...

  2. beatfullsoup

    阅读目录 一 介绍 二 基本使用 三 遍历文档树 四 搜索文档树 五 修改文档树 六 总结 一 介绍 Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通 ...

  3. C语言实现二叉排序树

    程序以'#'结尾的二叉排序树. /*(双重指针 BSTree *T)问:数据结构中 二叉树建立结点为什么用 双重指针?详细解释下双重指针 答:指针的指针.因为树的结点要用指针描述.如果只用指针,作形参 ...

  4. 详解WordPress中简码格式标签编写的基本方法

    WordPress 简码是一种类似于论坛标签的东西,格式类似于把尖括号换成中括号的 Html 标签.简码很多人叫做短代码,但官方的翻译应该是简码,在这里纠正一下. 简码的开发的逻辑比较简单,主要就是添 ...

  5. git------删除Repository

    需求:删除仓库 Lucky-Repository,实现步骤如下截图所示 如上完成删除操作

  6. ceph在扩展mon节点时,要注意的问题

    我开始也是一步一步的按官方文档操作. 但后来还是遇到了问题. 当我要扩展mon节点时,死活出错. (我就一共用了三个节点ceph-admin, ceph-node1, ceph-node2) 比如: ...

  7. cocos2djs ctor init onEnter的区别

    cocos2d-html5 onEnter init ctor构造函数 ---js特有特性(和c++有点不一样 ctor 构造函数, new 一个对象的时候调用-----coco2d-js , 默认c ...

  8. caffe-安装anaconda后重新编译caffe报错

    ks@ks-go:~/caffe-master$ make -j16 CXX/LD -o .build_release/tools/convert_imageset.bin CXX/LD -o .bu ...

  9. 决策树:ID3与C4.5算法

    1.基本概念 1)定义: 决策树是一个预测模型:他代表的是对象属性与对象值之间的一种映射关系,树中每个节点代表的某个可能的属性值. 2)表示方法: 通过把实例从根结点排列到某个叶子结点来分类实例,叶子 ...

  10. 【数据结构】 最小生成树(四)——利用kruskal算法搞定例题×3+变形+一道大水题

    在这一专辑(最小生成树)中的上一期讲到了prim算法,但是prim算法比较难懂,为了避免看不懂,就先用kruskal算法写题吧,下面将会将三道例题,加一道变形,以及一道大水题,水到不用高级数据结构,建 ...