首先我想告诉大家新浪微博API项目已经转移到GitHub上了,原Google Code (http://code.google.com/p/android-weibo-sdk/downloads/list)的工程已经不更新了。如果使用旧的代码运行登陆,会弹出网页错误的Bug。最新的地址在:https://github.com/mobileresearch/weibo_android_sdk/downloads
接口也从之前的V1转换到V2了,具体信息可参照:http://open.weibo.com/wiki/V1_To_V2。但是如果你跟我一样是从零开始,就不用管这些了,直接去github上下载最新的SDK就行了。
源码下载完后解压:
哎,本来不想管这里面各个文件夹都是干嘛的……但是想起博客那句座右铭……我还是遇到问题别偷懒,好好想问题吧……
weibo.sdk.android ---- 这个是sina微博登陆认证的源码是个Android Lib project,何为ALP这里就不解释了,同学们可以参考(http://www.mielf.net/featherelf/simple-android-library-project)这个链接。
weibo.sdk.android.api ---- 这个是sina微博交互接口的源码是个ALP。
weibo.sdk.androi.sso ---- 这个是sina微薄SSO源码,不懂SSO的请看百度百科:http://baike.baidu.com/view/190743.htm
weibo.sdk.android.sso.demo ---- 最后一个才是我们需要的Demo,我们在Eclipse中引入这一个工程即可。
乱七八糟的Doc ---- 估计是linux下写的吧还是怎么的?反正是技术说明文档,新浪开发真懒,这文档里面有些内容已经无效了,比如Android权限声明那块,反正大家随便看看吧。
weibo.sdk.android.sso.jar ---- 这个是大家需要引入到自己工程中的jar包。
这篇文章我们不多说别的,仅仅只说调用sina接口登陆认证,其余功能大家自己看官方Demo。
首先我们创建一个Android工程,取名LoginTest
创建一个布局文件:
<RelativeLayout 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" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:text="@string/hello_world"
tools:context=".MainActivity" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignRight="@+id/textView1"
android:layout_marginRight="46dp"
android:layout_marginTop="60dp"
android:text="Button" />
</RelativeLayout>
创建Acivity,里面放入一个Button,点击Button的时候弹出新浪认证窗口,认证成功后显示认证文字在界面上。
package com.example.logintest;
import java.text.SimpleDateFormat;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.weibo.sdk.android.Oauth2AccessToken;
import com.weibo.sdk.android.Weibo;
import com.weibo.sdk.android.WeiboAuthListener;
import com.weibo.sdk.android.WeiboDialogError;
import com.weibo.sdk.android.WeiboException;
public class MainActivity extends Activity {
private Weibo mWeibo;
private static final String CONSUMER_KEY = "966056985";// 替换为开发者的appkey,例如"1646212860";
private static final String REDIRECT_URL = "http://www.sina.com";
public static Oauth2AccessToken accessToken;
private TextView mText;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mWeibo = Weibo.getInstance(CONSUMER_KEY, REDIRECT_URL);
Button btn = (Button) findViewById(R.id.button1);
mText = (TextView) findViewById(R.id.textView1);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mWeibo.authorize(MainActivity.this, new AuthDialogListener());
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
class AuthDialogListener implements WeiboAuthListener {
@Override
public void onComplete(Bundle values) {
String token = values.getString("access_token");
String expires_in = values.getString("expires_in");
MainActivity.accessToken = new Oauth2AccessToken(token, expires_in);
if (MainActivity.accessToken.isSessionValid()) {
String date = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss")
.format(new java.util.Date(MainActivity.accessToken
.getExpiresTime()));
mText.setText("认证成功: \r\n access_token: " + token + "\r\n"
+ "expires_in: " + expires_in + "\r\n有效期:" + date);
try {
Class sso = Class
.forName("com.weibo.sdk.android.api.WeiboAPI");// 如果支持weiboapi的话,显示api功能演示入口按钮
} catch (ClassNotFoundException e) {
// e.printStackTrace();
Log.i("H3c", "com.weibo.sdk.android.api.WeiboAPI not found");
}
AccessTokenKeeper.keepAccessToken(MainActivity.this,
accessToken);
Toast.makeText(MainActivity.this, "认证成功", Toast.LENGTH_SHORT)
.show();
}
}
@Override
public void onError(WeiboDialogError e) {
Toast.makeText(getApplicationContext(),
"Auth error : " + e.getMessage(), Toast.LENGTH_LONG).show();
}
@Override
public void onCancel() {
Toast.makeText(getApplicationContext(), "Auth cancel",
Toast.LENGTH_LONG).show();
}
@Override
public void onWeiboException(WeiboException e) {
Toast.makeText(getApplicationContext(),
"Auth exception : " + e.getMessage(), Toast.LENGTH_LONG)
.show();
}
}
}
其中会用到AccessTokenKeeper对象,这个对象用来保存已认证的信息的,可以从Demo中获取,直接复制粘贴。
最后是添加权限(那个乱七八糟.doc里描述稍微有点错误):
<uses-permission android:name="android.permission.INTERNET" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >
</uses-permission>
<uses-permission android:name="android.permission.WRITE_APN_SETTINGS" >
</uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
啊,就是这样。
然后刚开始我一直在纠结那个新浪APP_KEY也就是应用程序中的CONSUMER_KEY,我看获得APPKEY必须要有作品上传,但是现在我作品还没有做出来怎么上传啊,这就是个鸡生蛋蛋生鸡的Bug啊。后来想想应该是我想太多了!APPKEY的作用应该就是在认证登陆的时候弹出的登陆框中显示你的应用程序名称,比如Demo中显示是“掌中新浪Android版”,我们在做应用开发的时候完全可以参照Demo先做功能,等全部功能完成之后再上传APP获取APPKEY,然后替换即可。
本文纯属我今天初略研究所写,如有不对的地方,请各位指出!
最后附上新浪微薄API:http://open.weibo.com/wiki/%E5%B9%B3%E5%8F%B0%E6%A6%82%E8%BF%B0