ANDROID_MARS学习笔记_S04_005_用sing-post向腾讯微博发一条信息

一、代码流程

1.组织好sign-post需要的token,secrect

2.组织好发微博需要的信息

3.用sign-post进行签名

4.把签名结果从header中拿出来,转成entity,用httpclient以post的形式发送微博

二、简介

三、代码
1.xml
(1)activity_main.xml

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:orientation="vertical"
 4     android:layout_width="fill_parent"
 5     android:layout_height="fill_parent"
 6     >
 7         <Button android:id="@+id/btn_launch_oauth"
 8                 android:layout_width="wrap_content"
 9                 android:layout_height="wrap_content"
10                 android:text="Launch OAuth Flow"/>
11 
12         <Button 
13                 android:id="@+id/btn_sendWeiBo"
14                 android:layout_width="wrap_content"
15                 android:layout_height="wrap_content"
16                 android:text="发送一条微博消息"
17         />
18 </LinearLayout>

(2)AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="org.marsdroid.oauth03"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="10" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".MainActivity" android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".PrepareRequestTokenActivity" android:launchMode="singleTask">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="x-oauthflow" android:host="callback" />
            </intent-filter>
        </activity>
    </application>
</manifest>

2.java
(1)MainActivity.java

 1 package org.marsdroid.oauth03;
 2 
 3 import java.util.ArrayList;
 4 import java.util.HashMap;
 5 import java.util.List;
 6 import java.util.Map;
 7 
 8 import oauth.signpost.OAuth;
 9 import android.app.Activity;
10 import android.content.Intent;
11 import android.content.SharedPreferences;
12 import android.os.Bundle;
13 import android.preference.PreferenceManager;
14 import android.view.View;
15 import android.view.View.OnClickListener;
16 import android.widget.Button;
17 
18 public class MainActivity extends Activity {
19     
20     final String TAG = getClass().getName();
21     private SharedPreferences prefs;
22     /** Called when the activity is first created. */
23     @Override
24     public void onCreate(Bundle savedInstanceState) {
25         super.onCreate(savedInstanceState);
26         setContentView(R.layout.main);
27         
28         prefs = PreferenceManager.getDefaultSharedPreferences(this);
29         Button launchOauth = (Button) findViewById(R.id.btn_launch_oauth);
30         Button sendWeiBoButton = (Button)findViewById(R.id.btn_sendWeiBo);
31  
32         sendWeiBoButton.setOnClickListener(new OnClickListener() {
33             
34             @Override
35             public void onClick(View v) {
36                 //收集需要向腾讯微博服务器端发送的数据
37                 Map<String,String> map = new HashMap<String,String>();
38                 map.put("content", "test");
39                 map.put("clientip", "127.0.0.1");
40                 map.put("format", "json");
41                 //URL编码
42                 List<String> decodeNames = new ArrayList<String>();
43                 decodeNames.add("oauth_signature");//最后生成的oauth_signature可以包含“=“等,所以要进行url编码
44                 //生成WeiboClient对象需要四个参数:Consumer_key,Consumer_key_secret,Oauth_tokent,OAuth_token_secret
45                 String OAuth_token = prefs.getString(OAuth.OAUTH_TOKEN, "");
46                 String OAuth_token_secret = prefs.getString(OAuth.OAUTH_TOKEN_SECRET, "");
47                 WeiBoClient weiBoClient = new WeiBoClient(Constants.CONSUMER_KEY, Constants.CONSUMER_SECRET, OAuth_token, OAuth_token_secret);
48                 weiBoClient.doPost("http://open.t.qq.com/api/t/add",map,decodeNames);
49             }
50         });
51         
52         
53         launchOauth.setOnClickListener(new OnClickListener() {
54             public void onClick(View v) {
55                 startActivity(new Intent().setClass(v.getContext(), PrepareRequestTokenActivity.class));
56             }
57         });
58     }

(2)Constants.java

 1 package org.marsdroid.oauth03;
 2 
 3 
 4 public class Constants {
 5 
 6     public static final String CONSUMER_KEY = "99e9494ff07e42489f4ace16b63e1f47";
 7     public static final String CONSUMER_SECRET     = "154f6f9ab4c1cf527f8ad8ab1f8e1ec9";
 8 
 9     public static final String REQUEST_URL         = "https://open.t.qq.com/cgi-bin/request_token";
10     public static final String ACCESS_URL         = "https://open.t.qq.com/cgi-bin/access_token";  
11     public static final String AUTHORIZE_URL     = "https://open.t.qq.com/cgi-bin/authorize";
12     
13     public static final String ENCODING         = "UTF-8";
14     
15     public static final String    OAUTH_CALLBACK_SCHEME    = "x-oauthflow";
16     public static final String    OAUTH_CALLBACK_HOST        = "callback";
17     public static final String    OAUTH_CALLBACK_URL        = OAUTH_CALLBACK_SCHEME + "://" + OAUTH_CALLBACK_HOST;
18 
19 }

(3)WeiBoClient.java

 1 import java.util.List;
 2 import java.util.Map;
 3 
 4 import oauth.signpost.OAuthConsumer;
 5 import oauth.signpost.commonshttp.CommonsHttpOAuthConsumer;
 6 
 7 import org.apache.http.Header;
 8 import org.apache.http.HttpEntity;
 9 import org.apache.http.HttpResponse;
10 import org.apache.http.NameValuePair;
11 import org.apache.http.client.entity.UrlEncodedFormEntity;
12 import org.apache.http.client.methods.HttpPost;
13 import org.apache.http.impl.client.DefaultHttpClient;
14 import org.marsdroid.oauth03.utils.ApacheUtils;
15 import org.marsdroid.oauth03.utils.HttpUtils;
16 import org.marsdroid.oauth03.utils.OAuthUtils;
17 import org.marsdroid.oauth03.utils.StringUtils;
18 
19 public class WeiBoClient {
20     private OAuthConsumer consumer;
21     public WeiBoClient(){
22         
23     }
24     
25     public WeiBoClient(String consumerKey,String consumerSecret,String oauthToken,String oauthTokenSecret){
26         //生成一个OAuthConsumer对象
27         consumer = new CommonsHttpOAuthConsumer(consumerKey, consumerSecret);
28         //设置OAuth_Token和OAuth_Token_Secret
29         consumer.setTokenWithSecret(oauthToken, oauthTokenSecret);
30     }
31     public String doPost(String url,Map<String,String> addtionalParams,List<String> decodeNames){
32         //生成一个HttpPost对象
33         HttpPost postRequest = new HttpPost(url);
34         //把腾讯微博所需要的数据也加上
35         consumer = OAuthUtils.addAddtionalParametersFromMap(consumer, addtionalParams);
36         try {
37             //用sing-post对信息签名,sing-post会把签名结果放到header中,但腾讯不支持
38             consumer.sign(postRequest);
39         } catch (Exception e) {
40             e.printStackTrace();
41         }
42         
43         
44         Header oauthHeader = postRequest.getFirstHeader("Authorization");
45         System.out.println(oauthHeader.getValue());
46         String baseString = oauthHeader.getValue().substring(5).trim();
47         Map<String,String> oauthMap = StringUtils.parseMapFromString(baseString);
48         oauthMap = HttpUtils.decodeByDecodeNames(decodeNames, oauthMap);
49         addtionalParams = HttpUtils.decodeByDecodeNames(decodeNames, addtionalParams);
50         List<NameValuePair> pairs = ApacheUtils.convertMapToNameValuePairs(oauthMap);
51         List<NameValuePair> weiboPairs = ApacheUtils.convertMapToNameValuePairs(addtionalParams);
52         pairs.addAll(weiboPairs);
53         
54         HttpEntity entity = null;
55         HttpResponse response = null;
56         try {
57             entity = new UrlEncodedFormEntity(pairs);
58             postRequest.setEntity(entity);
59             response = new DefaultHttpClient().execute(postRequest);
60         } catch (Exception e) {
61             e.printStackTrace();
62         }
63         
64         String result = ApacheUtils.getResponseText(response); 
65         
66         return result;
67     }
68 }

(4)ApacheUtils.java

 1 package org.marsdroid.oauth03.utils;
 2 
 3 import java.io.BufferedReader;
 4 import java.io.InputStream;
 5 import java.io.InputStreamReader;
 6 import java.util.ArrayList;
 7 import java.util.Iterator;
 8 import java.util.List;
 9 import java.util.Map;
10 import java.util.Set;
11 
12 import org.apache.http.HttpEntity;
13 import org.apache.http.HttpResponse;
14 import org.apache.http.NameValuePair;
15 import org.apache.http.message.BasicNameValuePair;
16 
17 public class ApacheUtils {
18     public static List<NameValuePair> convertMapToNameValuePairs(Map<String, String> oauthMap) {
19         List<NameValuePair> pairs = new ArrayList<NameValuePair>();
20         Set<String> keys = oauthMap.keySet();
21         Iterator<String> it = keys.iterator();
22         while(it.hasNext()){
23             String key = it.next();
24             String value = oauthMap.get(key);
25             NameValuePair pair = new BasicNameValuePair(key, value);
26             pairs.add(pair);
27         }
28         return pairs;
29     }
30     public static String getResponseText(HttpResponse response) {
31         HttpEntity responseEntity = response.getEntity();
32         InputStream input = null;
33         String result = null;
34         try {
35             input = responseEntity.getContent();
36             BufferedReader reader = new BufferedReader(new InputStreamReader(input));
37             String line = null;
38             StringBuffer sb = new StringBuffer();
39             while((line = reader.readLine()) != null){
40                 sb.append(line);
41             }
42             result = sb.toString();
43             System.out.println("reuslt---->" + result);
44         } catch (Exception e) {
45             // TODO Auto-generated catch block
46             e.printStackTrace();
47         }
48         return result;
49     }
50     public static String parseStringFromEntity(HttpEntity entity){
51         String result = null;
52         try{
53             InputStream input = entity.getContent();
54             BufferedReader reader = new BufferedReader(new InputStreamReader(input));
55             String line = null;
56             StringBuffer sb = new StringBuffer();
57             while((line = reader.readLine()) != null){
58                 sb.append(line);
59             }
60             result = sb.toString();
61         }
62         catch(Exception e){
63             System.out.println(e);
64         }
65         return result;
66     }
67 }

(5)HttpUtils.java

 1 import java.net.URLDecoder;
 2 import java.util.Iterator;
 3 import java.util.List;
 4 import java.util.Map;
 5 import java.util.Set;
 6 
 7 public class HttpUtils {
 8     public static Map<String,String> decodeByDecodeNames(List<String> decodeNames,Map<String,String> map){
 9         Set<String> keys = map.keySet();
10         Iterator<String> it = keys.iterator();
11         while (it.hasNext()) {
12             String key = it.next();
13             String value = map.get(key);
14             for(String decodeName : decodeNames){
15                 if(key.equals(decodeName)){
16                     value = URLDecoder.decode(value);
17                     map.put(key, value);
18                 }
19             }
20         }
21         return map;
22     }
23 }

(6)OAuthUtils.java

 1 import java.util.Iterator;
 2 import java.util.Map;
 3 import java.util.Set;
 4 
 5 import oauth.signpost.OAuthConsumer;
 6 import oauth.signpost.http.HttpParameters;
 7 
 8 public class OAuthUtils {
 9     
10     public static OAuthConsumer addAddtionalParametersFromMap(OAuthConsumer consumer,
11             Map<String, String> addtionalParams) {
12         Set<String> keys = addtionalParams.keySet();
13         Iterator<String> it = keys.iterator();
14         
15         HttpParameters httpParameters = new HttpParameters();
16         while(it.hasNext()){
17             String key = it.next();
18             String value = addtionalParams.get(key);
19             httpParameters.put(key, value);
20         }
21         consumer.setAdditionalParameters(httpParameters);
22         return consumer;
23     }
24 }

(7)StringUtils.java

 1 import java.util.HashMap;
 2 import java.util.Map;
 3 
 4 public class StringUtils {
 5     //key1="value1",key2="value2"........
 6     public static Map<String,String> parseMapFromString(String baseString) {
 7         String [] arr = baseString.split(",");
 8         Map<String,String > result = new HashMap<String,String>();
 9         for (int i = 0; i < arr.length; i++) {
10             String temp [] = arr[i].split("=");
11             String key = temp[0].trim();
12             //去掉双引号
13             String value = temp[1].substring(1, temp[1].length()-1);
14             result.put(key, value);
15         }
16         return result;
17     }
18 }

(8)UrlUtils.java

 1 import java.util.ArrayList;
 2 import java.util.List;
 3 import java.util.Map;
 4 import java.util.Set;
 5 
 6 import org.apache.http.NameValuePair;
 7 import org.apache.http.client.utils.URLEncodedUtils;
 8 import org.apache.http.message.BasicNameValuePair;
 9 
10 public class UrlUtils {
11     public static String buildQueryString(Map<String,String> map){
12         List<NameValuePair> pairs = buildNameValuePairs(map);
13         String queryStr = URLEncodedUtils.format(pairs, "UTF-8");
14         return queryStr;
15     }
16     
17     public static String buildUrlByQueryStringAndBaseUrl(String baseUrl,String queryString){
18         return baseUrl + "?" + queryString;
19     }
20     
21     public static String buildUrlByQueryStringMapAndBaseUrl(String baseUrl,Map<String,String> map){
22         return buildUrlByQueryStringAndBaseUrl(baseUrl, buildQueryString(map));
23     }
24     
25     public static List<NameValuePair> buildNameValuePairs(Map<String,String> map){
26         Set<String> keySet = map.keySet();
27         List<NameValuePair> pairs = new ArrayList<NameValuePair>();
28         for(String key: keySet){
29             NameValuePair pair = new BasicNameValuePair(key, map.get(key));
30             pairs.add(pair);
31         }
32         return pairs;
33     }
34 }

(9)OAuthRequestTokenTask.java

 1 import oauth.signpost.OAuthConsumer;
 2 import oauth.signpost.OAuthProvider;
 3 import android.content.Context;
 4 import android.content.Intent;
 5 import android.net.Uri;
 6 import android.os.AsyncTask;
 7 
 8 public class OAuthRequestTokenTask extends AsyncTask<Void, Void, Void>{
 9 
10     private Context context;
11     private OAuthConsumer consumer;
12     private OAuthProvider provider;
13     
14     
15     public OAuthRequestTokenTask(Context context, OAuthConsumer consumer,
16             OAuthProvider provider) {
17         super();
18         this.context = context;
19         this.consumer = consumer;
20         this.provider = provider;
21     }
22 
23     @Override
24     protected Void doInBackground(Void... params) {
25         // TODO Auto-generated method stub
26         try {
27             System.out.println("请求Request Token之前" + consumer.getToken());
28             final String url = provider.retrieveRequestToken(consumer, Constants.OAUTH_CALLBACK_URL);
29             System.out.println("请求Request Toker之后" + consumer.getToken());
30             System.out.println("url---->" + url);
31             Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)).setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_FROM_BACKGROUND);
32             context.startActivity(intent);
33         } catch(Exception e) {
34             // TODO Auto-generated catch block
35             e.printStackTrace();
36         }
37         return null;
38     }
39 
40 }

(10)PrepareRequestTokenActivity.java

 1 import oauth.signpost.OAuthConsumer;
 2 import oauth.signpost.OAuthProvider;
 3 import oauth.signpost.commonshttp.CommonsHttpOAuthConsumer;
 4 import oauth.signpost.commonshttp.CommonsHttpOAuthProvider;
 5 import android.app.Activity;
 6 import android.content.Intent;
 7 import android.content.SharedPreferences;
 8 import android.net.Uri;
 9 import android.os.Bundle;
10 import android.preference.PreferenceManager;
11 
12 public class PrepareRequestTokenActivity extends Activity {
13 
14     private OAuthConsumer consumer;
15     private OAuthProvider provider;
16 
17     @Override
18     protected void onCreate(Bundle savedInstanceState) {
19         // TODO Auto-generated method stub
20         super.onCreate(savedInstanceState);
21 
22         System.setProperty("debug", "true");
23         consumer = new CommonsHttpOAuthConsumer(Constants.CONSUMER_KEY,
24                 Constants.CONSUMER_SECRET);
25         provider = new CommonsHttpOAuthProvider(Constants.REQUEST_URL,
26                 Constants.ACCESS_URL, Constants.AUTHORIZE_URL);
27 
28         new OAuthRequestTokenTask(this, consumer, provider).execute();
29     }
30 
31     @Override
32     public void onNewIntent(Intent intent) {
33         super.onNewIntent(intent);
34         SharedPreferences prefs = PreferenceManager
35                 .getDefaultSharedPreferences(this);
36         final Uri uri = intent.getData();
37         System.out.println(uri.toString());
38         if (uri != null
39                 && uri.getScheme().equals(Constants.OAUTH_CALLBACK_SCHEME)) {
40             new RetrieveAccessTokenTask(this, consumer, provider, prefs)
41                     .execute(uri);
42             finish();
43         }
44     }
45 }

(11)RetrieveAccessTokenTask.java

 1 import oauth.signpost.OAuth;
 2 import oauth.signpost.OAuthConsumer;
 3 import oauth.signpost.OAuthProvider;
 4 import android.content.Context;
 5 import android.content.Intent;
 6 import android.content.SharedPreferences;
 7 import android.content.SharedPreferences.Editor;
 8 import android.net.Uri;
 9 import android.os.AsyncTask;
10 import android.util.Log;
11 
12 public class RetrieveAccessTokenTask extends AsyncTask<Uri, Void, Void> {
13 
14     final String TAG = "OAuth";
15     
16     private Context    context;
17     private OAuthProvider provider;
18     private OAuthConsumer consumer;
19     private SharedPreferences prefs;
20     
21     public RetrieveAccessTokenTask(Context context, OAuthConsumer consumer,OAuthProvider provider, SharedPreferences prefs) {
22         this.context = context;
23         this.consumer = consumer;
24         this.provider = provider;
25         this.prefs=prefs;
26     }
27 
28 
29     @Override
30     protected Void doInBackground(Uri...params) {
31         final Uri uri = params[0];
32         
33         System.out.println(getClass().getName());
34         
35         final String oauth_verifier = uri.getQueryParameter(OAuth.OAUTH_VERIFIER);
36 
37         try {
38             provider.retrieveAccessToken(consumer, oauth_verifier);
39 
40             final Editor edit = prefs.edit();
41             edit.putString(OAuth.OAUTH_TOKEN, consumer.getToken());
42             edit.putString(OAuth.OAUTH_TOKEN_SECRET, consumer.getTokenSecret());
43             edit.commit();
44             
45             String token = prefs.getString(OAuth.OAUTH_TOKEN, "");
46             String secret = prefs.getString(OAuth.OAUTH_TOKEN_SECRET, "");
47             
48             consumer.setTokenWithSecret(token, secret);
49             context.startActivity(new Intent(context,MainActivity.class));
50 
51             Log.i(TAG, "OAuth - Access Token Retrieved");
52             System.out.println("------------>" + provider.getAccessTokenEndpointUrl());
53             
54         } catch (Exception e) {
55             Log.e(TAG, "OAuth - Access Token Retrieval Error", e);
56         }
57 
58         return null;
59     }
60 }

 

原文地址:https://www.cnblogs.com/shamgod/p/5206505.html