----------------------------------------------------------------------------------------------html
[版權申明:本文系做者原創,轉載請註明出處]
文章出處:http://blog.csdn.net/sdksdk0/article/details/51939853
做者:朱培 ID:sdksdk0 郵箱: zhupei@tianfang1314.cn java
--------------------------------------------------------------------------------------------android
本文主要介紹新浪微博客戶端的api接入,實現第三方受權登陸功能,以及api的調用。要求親自動手進行實際操做,學會基本的受權認證機制和經常使用API的調用。這裏主要是一個安卓端的應用,文末提供源碼下載。git
新浪微博這裏主要是介紹使用新浪微博的開發者平臺。想要作一個基於微博登錄或者其餘一系列操做的,咱們先要登錄他們的官網進行註冊使用,首先是要註冊成爲一個開發者。http://open.weibo.com/。微博開放平臺爲移動應用提供了便捷的合做模式,知足了多元化移動終端用戶隨時隨地快速登陸、分享信息的需求,助力實現移動Apps、健康設備、智能家居,車載等多類型終端的社會化接入。github
一、註冊登陸以後,進入「微鏈接」->"移動應用"->建立應用。而後本身進行設置就能夠了。json
二、建立好以後,進入「個人應用」 ->應用信息->基本信息"進行設置。這這裏就設置你的應用基本信息就能夠了。填好你的包名以後,須要下載裏面的sdk文件。api
三、在這裏下載 安卓的sdk文件。https://github.com/sinaweibosdk/weibo_android_sdkapp
在這裏面找到一個app_signatures.apk,而後安裝到你手機上面去,點擊運行,把你的包名輸入進去以後,就會產生一段序列號,而後把這個序列號複製到前面提到的這個開發者平臺中的---「Android簽名包名信息」->Android簽名. 最後就會生成App Key和App Secret。這兩個東西咱們稍後會用到。ide
四、OAuth2.0 受權設置。點擊「高級信息」 ->受權設置,設置受權回調頁和取消受權回調頁。我這裏設置的是http://www.tianfang1314.cn/。這個地方你能夠自行設置。佈局
最後:到這裏基本的設置工做就完成了。咱們最後須要從這裏獲得的是pp Key和App Secret、以及回調頁的網址
Oauth2.0協議:
容許用戶提供一個令牌,而不是用戶名和密碼來訪問他們存放在特定服務提供者的數據。每個令牌受權一個特定的網站(例如,視頻編輯網站)在特定的時段(例如,接下來的2小時內)內訪問特定的資源(例如僅僅是某一相冊中的視頻)。這樣,OAuth容許用戶受權第三方網站訪問他們存儲在另外的服務提供者上的信息,而不須要分享他們的訪問許可或他們數據的全部內容。
首先導入新浪微博的sdk文件:千萬不要直接把庫拷貝進項目文件夾中,這樣可能會出現各類其餘不知名的錯誤,建議經過Import Module方式一步步導入庫文件。而後在file->project structure->dependencies->3Model dependency中選擇Weibo庫就能夠了.此時庫已成功導入。
佈局文件我這裏就不寫出來了,須要的能夠去我文末提供的地址進行下載。這裏主要說一下如何使用。首先咱們須要新建一個utils包,用來存放一些受權的信息。這幾個文件能夠直接在下載的SDK的官方demo中找到。其主要內容爲:
AccessTokenKeeper.java
public class AccessTokenKeeper { private static final String PREFERENCES = "sina"; 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"; public static void writeAccessToken(Context context, Oauth2AccessToken token) { if (context == null || token == null) { return; } SharedPreferences preferences = context.getSharedPreferences( PREFERENCES, context.MODE_APPEND); Editor editor = preferences.edit(); editor.putString(KEY_UID, token.getUid()); editor.putString(KEY_ACCESS_TOKEN, token.getToken()); editor.putLong(KEY_EXPIRES_IN, token.getExpiresTime()); editor.commit(); } public static Oauth2AccessToken readAccessToken(Context context) { if (null == context) { return null; } Oauth2AccessToken token = new Oauth2AccessToken(); SharedPreferences pref = context.getSharedPreferences(PREFERENCES, 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; } public static void clear(Context context) { if (null == context) { return; } SharedPreferences pref = context.getSharedPreferences(PREFERENCES, Context.MODE_APPEND); Editor editor = pref.edit(); editor.clear(); editor.commit(); } }
Constants.java.
這裏要注意一下,咱們前面在開發者平臺中拿到的appkey和appsecret要拿到這裏來使用。這裏替換一下你的。還有就是那個回調頁,也須要設置一下,記住:回調頁的網址不要寫錯,要和你原來配置時是同樣的,錯一個字母都不行的哦!
public class Constants { public static final String APP_KEY = "換成你的appkey"; public static final String App_SECRET = "換成你的app_secret"; /** * 當前 DEMO 應用的回調頁,第三方應用可使用本身的回調頁。 * 建議使用默認回調頁:https://api.weibo.com/oauth2/default.html */ public static final String REDIRECT_URL = "http://www.tianfang1314.cn/"; /** * WeiboSDKDemo 應用對應的權限,第三方開發者通常不須要這麼多,可直接設置成空便可。 詳情請查看 Demo 中對應的註釋。 */ public static final String SCOPE = "email,direct_messages_read,direct_messages_write," + "friendships_groups_read,friendships_groups_write,statuses_to_me_read," + "follow_app_official_microblog," + "invitation_write"; public static final String user_show = "https://api.weibo.com/2/users/show.json?uid={0}&access_token={1}"; public static final String public_timeline = "https://api.weibo.com/2/statuses/public_timeline.json?access_token={0}"; public static final String friends_timeline = "https://api.weibo.com/2/statuses/friends_timeline.json?access_token={0}"; public static final String home_timeline = "https://api.weibo.com/2/statuses/home_timeline.json?count=20&access_token={0}"; public static final String bilateral_timeline = "https://api.weibo.com/2/statuses/bilateral_timeline.json?count=20&access_token={0}"; public static final String repost = "https://api.weibo.com/2/statuses/repost.json"; public static final String updata = "https://api.weibo.com/2/statuses/update.json"; public static final String comment_show = "https://api.weibo.com/2/comments/show.json?access_token={0}"; public static final String comment_create = "https://api.weibo.com/2/comments/create.json"; public static final String friendships_destroy = "https://api.weibo.com/2/friendships/destroy.json"; public static final String friendships_create = "https://api.weibo.com/2/friendships/create.json"; public static final String followers = "https://api.weibo.com/2/friendships/followers.json"; public static final String user_timeline = "https://api.weibo.com/2/statuses/user_timeline.json"; public static final String delete = "https://api.weibo.com/2/statuses/destroy.json"; public static final String friendship_friends = "https://api.weibo.com/2/friendships/friends.json"; public static final String replay = "https://api.weibo.com/2/comments/reply.json"; public static final String bilateral_timeline2 = "https://api.weibo.com/2/statuses/bilateral_timeline.json"; public static final String mentions = "https://api.weibo.com/2/statuses/mentions.json"; public static final String weekly = "https://api.weibo.com/2/trends/weekly.json"; public static final String daily = "https://api.weibo.com/2/trends/daily.json"; public static final String hourly = "https://api.weibo.com/2/trends/hourly.json"; public static final String users = "https://api.weibo.com/2/search/suggestions/users.json"; public static final String upload = "https://upload.api.weibo.com/2/statuses/upload.json"; public static final String comment_mentions = "https://api.weibo.com/2/comments/mentions.json"; }
HttpUtils.java
public class HttpUtils { /** * 經過url地址返回一個輸入流 * * @param url * 地址 * @return 輸入流 */ public static InputStream getInputStream(String url) { URL home_url = null; InputStream input = null; HttpURLConnection conn = null; try { home_url = new URL(url); conn = (HttpURLConnection) home_url.openConnection(); conn.setRequestMethod("GET"); conn.setConnectTimeout(5000); conn.connect(); input = conn.getInputStream(); } catch (IOException e) { e.printStackTrace(); } return input; } /** * 返回字符串 * * @param url * @return */ public static String getStringByStream(String url) { StringBuilder sb = null; BufferedReader br = null; InputStream input = getInputStream(url); if (input != null) { br = new BufferedReader(new InputStreamReader(input)); String line = null; sb = new StringBuilder(); try { while ((line = br.readLine()) != null) { sb.append(line); } } catch (IOException e) { e.printStackTrace(); } }else{ sb = new StringBuilder(""); } return sb.toString(); } }
接下來咱們就須要來寫界面的java代碼了.
登錄微博
LoginActivity.java
public class LoginActivity extends Activity { AuthInfo mauthInfo; SsoHandler ssoHandler; Oauth2AccessToken accessToken; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); initDatas(); } /** * 數據初始化 */ private void initDatas() { // 上下文 mauthInfo = new AuthInfo(LoginActivity.this, Constants.APP_KEY, Constants.REDIRECT_URL, Constants.SCOPE); ssoHandler = new SsoHandler(LoginActivity.this, mauthInfo); ssoHandler.authorize(new WeiboAuthListener() { //認證失敗 @Override public void onWeiboException(WeiboException arg0) { Toast.makeText(LoginActivity.this, "認證失敗"+arg0, Toast.LENGTH_SHORT).show(); } //認證成功的 @Override public void onComplete(Bundle arg0) { accessToken = Oauth2AccessToken.parseAccessToken(arg0); //驗證咱們的令牌是否有效 if(accessToken.isSessionValid()){ AccessTokenKeeper.writeAccessToken(LoginActivity.this, accessToken); Toast.makeText(LoginActivity.this, "認證成功", Toast.LENGTH_SHORT).show(); } } //取消認證的 @Override public void onCancel() { // TODO Auto-generated method stub Toast.makeText(LoginActivity.this, "取消認證", Toast.LENGTH_SHORT).show(); } }); } }
發送微博:
public class SendWeibo extends Activity { //令牌 Oauth2AccessToken accessToken; StatusesAPI statusesApi; private EditText et_weibo; private Button btn_sendweibo; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sendweibo); initDatas(); initViews(); } private void initViews() { et_weibo = (EditText)findViewById(R.id.et_weibo); btn_sendweibo =(Button)findViewById(R.id.btn_sendweibo); btn_sendweibo.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String weibo = et_weibo.getText().toString(); if(!TextUtils.isEmpty(weibo)){ statusesApi.update(weibo, null, null, new RequestListener() { @Override public void onWeiboException(WeiboException arg0) { Toast.makeText(SendWeibo.this, "發送失敗", Toast.LENGTH_SHORT).show(); } @Override public void onComplete(String arg0) { Toast.makeText(SendWeibo.this, "發送成功", Toast.LENGTH_SHORT).show(); } }); } } }); } private void initDatas(){ accessToken = AccessTokenKeeper.readAccessToken(SendWeibo.this); statusesApi = new StatusesAPI(SendWeibo.this, Constants.APP_KEY, accessToken); } }
主界面調用:
public class MainActivity extends Activity { private static final String TAG = MainActivity.class.getSimpleName(); private static final DemoInfo[] demos = { new DemoInfo("登陸微博","first",LoginActivity.class), new DemoInfo("發送微博","second",SendWeibo.class) }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); TextView text = (TextView) findViewById(R.id.text_Info); text.setTextColor(Color.RED); text.setText("新浪微博實例"); ListView mListView = (ListView) findViewById(R.id.listView); // 添加ListItem,設置事件響應 mListView.setAdapter(new DemoListAdapter()); mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView<?> arg0, View v, int index, long arg3) { onListItemClick(index); } }); } public void onListItemClick(int index) { Intent intent = null; intent = new Intent(MainActivity.this, demos[index].demoClass); Log.d(TAG, "itemClick()"); this.startActivity(intent); } /** * demo列表適配器 * * */ private class DemoListAdapter extends BaseAdapter { public DemoListAdapter() { super(); } @Override public View getView(int index, View convertView, ViewGroup parent) { convertView = View.inflate(MainActivity.this, R.layout.demo_info_item, null); TextView title = (TextView) convertView.findViewById(R.id.title); TextView desc = (TextView) convertView.findViewById(R.id.desc); title.setText(demos[index].title); desc.setText(demos[index].desc); if (index >= 16) { title.setTextColor(Color.YELLOW); } return convertView; } @Override public int getCount() { return demos.length; } @Override public Object getItem(int index) { return demos[index]; } @Override public long getItemId(int id) { return id; } } /** * item的信息 * */ private static class DemoInfo { private final String title; private final String desc; private final Class<? extends android.app.Activity> demoClass; public DemoInfo(String title, String desc, Class<? extends android.app.Activity> demoClass) { this.title = title; this.desc = desc; this.demoClass = demoClass; } } }
最後的最後。咱們須要時清單文件中對權限進行配置。
<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" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<activity android:name="com.zhilinghui.weibo.ui.LoginActivity" > </activity> <activity android:name="com.zhilinghui.weibo.ui.SendWeibo" > </activity> <!-- 必須註冊在微博受權,分享微博時候用到 --> <activity android:name="com.sina.weibo.sdk.component.WeiboSdkBrowser" android:configChanges="keyboardHidden|orientation" android:exported="false" android:windowSoftInputMode="adjustResize" > </activity>
到這裏,咱們就所有開發完了,能夠直接使用微博進行登陸了,還能夠有發送微博的功能。
總結:這個案例其實總的來講很是簡單,就是有一些細節的部分還須要進一步的處理。對於各類奇奇怪怪的小bug須要時間去調試,須要不少的耐心。在註冊新浪微博開發者平臺的時候,對於應用的設置和包的簽名,頁面回調等都須要去處理,真的耐心和細心很是重要。共勉!
若有疑問歡迎交流:zhupei@tianfang1314.cn (郵箱)