我需要在 Tumblr 上发布一张图片。我读了这个http://www.tumblr.com/docs/en/api/v2#auth并且我知道我需要获取用户信息才能获得博客名称。我使用了与 Twitter 身份验证相同的代码,更改了 URL 并成功加载了 Tumblr webview。我使用以下代码进行身份验证并获取用户信息。
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.StatusLine;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import com.twitter.imageupload.R;
import com.twitter.imageupload.SecondClass;
import com.twitter.imageupload.TwitterImageUpload;
import oauth.signpost.OAuth;
import oauth.signpost.OAuthConsumer;
import oauth.signpost.OAuthProvider;
import oauth.signpost.commonshttp.CommonsHttpOAuthConsumer;
import oauth.signpost.commonshttp.CommonsHttpOAuthProvider;
import oauth.signpost.http.HttpParameters;
import twitter4j.conf.Configuration;
import twitter4j.conf.ConfigurationBuilder;
import twitter4j.http.AccessToken;
import twitter4j.http.OAuthAuthorization;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.StrictMode;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.Window;
import android.webkit.WebView;
import android.widget.Button;
import android.widget.Toast;
public class Tumblr_Web_View extends Activity {
SharedPreferences settings;
public static final String PREFS_NAME = "GREATEST_THINGS";
SharedPreferences.Editor editor;
final String TAG = getClass().getName();
Button cancel_button;
public static String usr_img, log_res, log_id;
private OAuthConsumer consumer;
private OAuthProvider provider;
WebView tumblr_web_view;
String tweet_Sign_in;
static twitter4j.Twitter twitter;
public static String userName;
public static URL twt_img_url;
AccessToken accessToken;
SharedPreferences twtuname_pref;
SharedPreferences userpref;
public static final String USER_PREF = "TWITTER_USER";
SharedPreferences.Editor usereditor;
SharedPreferences twtlogpref;
public static SharedPreferences.Editor twtlogeditor;
public static final String TWTPREF_LOGIN = "LOGIN ID";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
setContentView(R.layout.tumblr_web_view);
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
.permitAll().build();
StrictMode.setThreadPolicy(policy);
}
tumblr_web_view = (WebView) findViewById(R.id.tumblr_web_view);
twtuname_pref = this.getSharedPreferences("user_pref", 1);
settings = getSharedPreferences(PREFS_NAME, 0);
editor = settings.edit();
userpref = getSharedPreferences(USER_PREF, 0);
twtlogpref = getSharedPreferences(TWTPREF_LOGIN, 0);
try {
this.consumer = new CommonsHttpOAuthConsumer(
Constants.CONSUMER_KEY, Constants.CONSUMER_SECRET);
this.provider = new CommonsHttpOAuthProvider(Constants.REQUEST_URL,
Constants.ACCESS_URL, Constants.AUTHORIZE_URL);
} catch (Exception e) {
Log.e(TAG, "Error creating consumer / provider", e);
}
Log.i(TAG, "Starting task to retrieve request token.");
// new OAuthRequestTokenTask(this,consumer,provider).execute();
try {
Log.i(TAG, "Retrieving request token from Google servers");
final String url = provider.retrieveRequestToken(consumer,
Constants.OAUTH_CALLBACK_URL);
Log.i(TAG, "Popping a browser with the authorize URL : " + url);
// 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);
// this.startActivity(intent);
tumblr_web_view.loadUrl(url);
} catch (Exception e) {
Log.e(TAG, "Error during OAUth retrieve request token", e);
}
}
/**
* Called when the OAuthRequestTokenTask finishes (user has authorized the
* request token). The callback URL will be intercepted here.
*/
@Override
public void onNewIntent(Intent intent) {
super.onNewIntent(intent);
SharedPreferences prefs = PreferenceManager
.getDefaultSharedPreferences(this);
final Uri uri = intent.getData();
if (uri != null
&& uri.getScheme().equals(Constants.OAUTH_CALLBACK_SCHEME)) {
Log.i(TAG, "Callback received : " + uri);
Log.i(TAG, "Retrieving Access Token");
new RetrieveAccessTokenTask(this, consumer, provider, prefs)
.execute(uri);
// finish();
}
}
public class RetrieveAccessTokenTask extends AsyncTask<Uri, Void, Void> {
@SuppressWarnings("unused")
private Context context;
private OAuthProvider provider;
private OAuthConsumer consumer;
private SharedPreferences prefs;
public RetrieveAccessTokenTask(Context context, OAuthConsumer consumer,
OAuthProvider provider, SharedPreferences prefs) {
this.context = context;
this.consumer = consumer;
this.provider = provider;
this.prefs = prefs;
}
/**
* Retrieve the oauth_verifier, and store the oauth and
* oauth_token_secret for future API calls.
*/
@Override
protected Void doInBackground(Uri... params) {
Uri uri = params[0];
Log.v("uri >>", uri + "");
String oauth_verifier = uri.getQueryParameter(OAuth.OAUTH_VERIFIER);
try {
consumer.setTokenWithSecret(consumer.getToken(),
consumer.getTokenSecret());
// provider.retrieveAccessToken(consumer, oauth_verifier);
Log.v("getToken", consumer.getToken());
Log.v("getTokenSecret", consumer.getTokenSecret());
Editor uname_editor = twtuname_pref.edit();
uname_editor.putString("token", consumer.getToken());
uname_editor.putString("secret_token",
consumer.getTokenSecret());
uname_editor.putString("login_status", "already_logged");
uname_editor.commit();
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(
"http://api.tumblr.com/v2/user/info");
try {
HttpResponse httpResponse = httpClient.execute(httpGet);
System.out.println("httpResponse");
InputStream inputStream = httpResponse.getEntity()
.getContent();
InputStreamReader inputStreamReader = new InputStreamReader(
inputStream);
BufferedReader bufferedReader = new BufferedReader(
inputStreamReader);
StringBuilder stringBuilder = new StringBuilder();
String bufferedStrChunk = null;
while ((bufferedStrChunk = bufferedReader.readLine()) != null) {
stringBuilder.append(bufferedStrChunk);
}
System.out.println("Returning value of doInBackground :"
+ stringBuilder.toString());
} catch (ClientProtocolException cpe) {
System.out
.println("Exception generates caz of httpResponse :"
+ cpe);
cpe.printStackTrace();
} catch (IOException ioe) {
System.out
.println("Second exception generates caz of httpResponse :"
+ ioe);
ioe.printStackTrace();
}
} catch (Exception e) {
Log.e(TAG, "OAuth - Access Token Retrieval Error", e);
}
return null;
}
}
}
我收到以下错误。
06-06 23:06:20.084: I/System.out(20264): Returning value of doInBackground :{"meta":{"status":401,"msg":"Not Authorized"},"response":[]}
我做错了什么?
更新:现在成功获取用户信息。得到用户的博客名称。
public class RetrieveAccessTokenTask extends AsyncTask<Uri, Void, Void> {
@SuppressWarnings("unused")
private Context context;
private OAuthProvider provider;
private OAuthConsumer consumer;
private SharedPreferences prefs;
public RetrieveAccessTokenTask(Context context, OAuthConsumer consumer,
OAuthProvider provider, SharedPreferences prefs) {
this.context = context;
this.consumer = consumer;
this.provider = provider;
this.prefs = prefs;
}
/**
* Retrieve the oauth_verifier, and store the oauth and
* oauth_token_secret for future API calls.
*/
@Override
protected Void doInBackground(Uri... params) {
Uri uri = params[0];
Log.v("uri >>", uri + "");
String oauth_verifier = uri.getQueryParameter(OAuth.OAUTH_VERIFIER);
try {
consumer.setTokenWithSecret(consumer.getToken(),
consumer.getTokenSecret());
provider.retrieveAccessToken(consumer, oauth_verifier);
Log.v("getToken", consumer.getToken());
Log.v("getTokenSecret", consumer.getTokenSecret());
Editor uname_editor = twtuname_pref.edit();
uname_editor.putString("token", consumer.getToken());
uname_editor.putString("secret_token",
consumer.getTokenSecret());
uname_editor.putString("login_status", "already_logged");
uname_editor.commit();
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(
"http://api.tumblr.com/v2/user/info");
try {
consumer.sign(httpGet);
HttpResponse httpResponse = httpClient.execute(httpGet);
System.out.println("httpResponse");
InputStream inputStream = httpResponse.getEntity()
.getContent();
InputStreamReader inputStreamReader = new InputStreamReader(
inputStream);
BufferedReader bufferedReader = new BufferedReader(
inputStreamReader);
StringBuilder stringBuilder = new StringBuilder();
String bufferedStrChunk = null;
while ((bufferedStrChunk = bufferedReader.readLine()) != null) {
stringBuilder.append(bufferedStrChunk);
}
System.out.println("Returning value of doInBackground :"
+ stringBuilder.toString());
} catch (ClientProtocolException cpe) {
System.out
.println("Exception generates caz of httpResponse :"
+ cpe);
cpe.printStackTrace();
} catch (IOException ioe) {
System.out
.println("Second exception generates caz of httpResponse :"
+ ioe);
ioe.printStackTrace();
}
} catch (Exception e) {
Log.e(TAG, "OAuth - Access Token Retrieval Error", e);
}
return null;
}
}
我试图将图像发布到登录用户的博客。使用了以下代码。但没有得到回应。
try {
HttpClient client = new DefaultHttpClient();
client.getConnectionManager()
.getSchemeRegistry()
.register(
new Scheme("SSLSocketFactory", SSLSocketFactory
.getSocketFactory(), 443));
HttpConnectionParams.setConnectionTimeout(client.getParams(),
10000);
HttpResponse response1;
HttpPost post = new HttpPost(
"http://api.tumblr.com/v2/blog/"+username+".tumblr.com/post");
consumer.sign(post);
JSONObject json_obj_val = new JSONObject();
json_obj_val.put("type", "photo");
json_obj_val.put("caption", "test");
json_obj_val.put("source", "http://50.57.227.117/blacksheep/uploaded/Detailed_images/961314275649aladdins.jpg");
post.setHeader("Content-Type", "application/json");
post.setHeader("Accept", "application/json");
StringEntity entity_val = new StringEntity(
json_obj_val.toString());
entity_val.setContentEncoding(new BasicHeader(
HTTP.CONTENT_TYPE, "application/json"));
post.setEntity(entity_val);
response1 = client.execute(post);
String response_string = EntityUtils.toString(response1.getEntity());
Log.v("response >>", response_string);
Log.v("response length >>", response_string.length() + "");
} catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (ClientProtocolException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (ParseException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (JSONException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (OAuthMessageSignerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (OAuthExpectationFailedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (OAuthCommunicationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
得到以下回复。代码有什么问题?
06-11 16:24:46.312: V/response >>(27710): {"meta":{"status":400,"msg":"Bad Request"},"response":{"errors":["Post cannot be empty."]}}