zoukankan      html  css  js  c++  java
  • 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 }

     

  • 相关阅读:
    【文言文】从高考到程序员
    lambda方法引用总结——烧脑吃透
    秒杀苹果carplay baidu车联网API冷艳北京车展
    东君误妾我怜卿(一)
    百度快照投诉技巧案例分析百度快照就是这样刷出来的
    新浪博客是否可以放谷歌广告?如何添加
    与葡萄酒的亲密接触-选购技巧篇
    车联网高速公路智能交通解决方案
    物联网细分领域-车联网(OBD)市场分析
    APP开发选择什么框架好? 请看这里!
  • 原文地址:https://www.cnblogs.com/shamgod/p/5206505.html
Copyright © 2011-2022 走看看