2014-04-02 27 views
1

我試圖通過以下示例在我的Android應用中實現tumblr登錄:https://github.com/jansanz/TumblrOAuthDemoTumblr用Android登錄Android使用SignPost

我可以得到請求令牌。但是當我試圖檢索AccessToken時,它給了我一個例外。 下面是代碼:

public class TumblrDemoActivity extends Activity { 

private static final String TAG = "TumblrDemo"; 

private static final String PREFS = "prefs_tumblr"; 
private static final String PREF_TOKEN = "pref_token_tumblr"; 
private static final String PREF_TOKEN_SECRET = "pref_token_secret_tumblr"; 

private static final String REQUEST_TOKEN_URL = "http://www.tumblr.com/oauth/request_token"; 
private static final String ACCESS_TOKEN_URL = "http://www.tumblr.com/oauth/access_token"; 
private static final String AUTH_URL = "http://www.tumblr.com/oauth/authorize"; 

// Taken from Tumblr app registration 
private static final String CONSUMER_KEY = "consumer key from tumblr app"; 
private static final String CONSUMER_SECRET = "consumer secret from tumblr app"; 

private static final String CALLBACK_URL = "tumblrdemo://www.android-ios-tutorials.com";//"tumblrdemo://tumblrdemo.com/ok"; 

CommonsHttpOAuthConsumer consumer = new CommonsHttpOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET); 
CommonsHttpOAuthProvider provider = new CommonsHttpOAuthProvider(
     REQUEST_TOKEN_URL, 
     ACCESS_TOKEN_URL, 
     AUTH_URL); 

SharedPreferences prefs; 

String token; 
String tokenSecret; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    prefs = getSharedPreferences(PREFS, Context.MODE_PRIVATE); 
    consumer.setMessageSigner(new HmacSha1MessageSigner()); 
    // It uses this signature by default 
    // consumer.setMessageSigner(new HmacSha1MessageSigner()); 

    // To get the oauth token after the user has granted permissions 
    Uri uri = this.getIntent().getData(); 
    if (uri != null) { 

     Log.d(TAG, "accessToken  : "+consumer.getToken()); 
     Log.d(TAG, "accessTokenSecret : "+consumer.getTokenSecret()); 

     //retrieve token and tokenSecret saved in retrieveRequestToken() call 
     this.token = prefs.getString(PREF_TOKEN, null); 
     this.tokenSecret = prefs.getString(PREF_TOKEN_SECRET, null); 
     Log.d(TAG, "this.token  : "+token); 
     Log.d(TAG, "this.tokenSecret : "+tokenSecret); 

     consumer.setTokenWithSecret(token, tokenSecret); 

     Log.d(TAG, "consumer.token  : "+consumer.getToken()); 
     Log.d(TAG, "consumer.tokenSecret : "+consumer.getTokenSecret()); 

     String token = uri.getQueryParameter("oauth_token"); 
     String verifier = uri.getQueryParameter("oauth_verifier"); 

     Log.v(TAG, "Token:" +token); 
     Log.v(TAG, "Verifier:" +verifier); 

     try { 
      provider.retrieveAccessToken(consumer, verifier); 
      Log.d(TAG, "accessToken  retrieveAccessToken : "+consumer.getToken()); 
      Log.d(TAG, "accessTokenSecret retrieveAccessToken : "+consumer.getTokenSecret()); 

     } catch (OAuthMessageSignerException e) { 
      e.printStackTrace(); 
     } catch (OAuthNotAuthorizedException e) { 
      e.printStackTrace(); 
     } catch (OAuthExpectationFailedException e) { 
      e.printStackTrace(); 
     } catch (OAuthCommunicationException e) { 
      e.printStackTrace(); 
     } 
    } else { 
     String authUrl; 
     try { 
      authUrl = provider.retrieveRequestToken(consumer, CALLBACK_URL); 
      Log.v(TAG, "Auth url:" + authUrl); 
      Log.d(TAG, "accessToken  : "+consumer.getToken()); 
      Log.d(TAG, "accessTokenSecret : "+consumer.getTokenSecret()); 

      //save tokens in preferences 
      SharedPreferences.Editor editor = prefs.edit(); 
      editor.putString(PREF_TOKEN, consumer.getToken()); 
      editor.putString(PREF_TOKEN_SECRET, consumer.getTokenSecret()); 
      editor.commit(); 

      startActivity(new Intent("android.intent.action.VIEW", Uri.parse(authUrl))); 

     } catch (OAuthMessageSignerException e) { 
      e.printStackTrace(); 
     } catch (OAuthNotAuthorizedException e) { 
      e.printStackTrace(); 
     } catch (OAuthExpectationFailedException e) { 
      e.printStackTrace(); 
     } catch (OAuthCommunicationException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    Log.v(TAG, "onResume"); 
} 

}

provider.retrieveRequestToken()第一個電話就可以了。我可以檢索令牌和tokenSecret。但是當我嘗試通過調用provider.retrieveAccessToken(consumer,oauth_verifier);得到的accessToken我得到了OAuthCommunicationException的OAuthCommunicationException 堆棧跟蹤是:

04-02 11:34:14.735: W/System.err(19535): oauth.signpost.exception.OAuthCommunicationException: Communication with the service provider failed: Service provider responded in error: 400 (Bad Request) 
04-02 11:34:14.735: W/System.err(19535): at oauth.signpost.AbstractOAuthProvider.retrieveToken(AbstractOAuthProvider.java:218) 
04-02 11:34:14.735: W/System.err(19535): at oauth.signpost.AbstractOAuthProvider.retrieveAccessToken(AbstractOAuthProvider.java:108) 
04-02 11:34:14.735: W/System.err(19535): at org.jfsd.tumblrdemo.TumblrDemoActivity.onCreate(TumblrDemoActivity.java:87) 
04-02 11:34:14.735: W/System.err(19535): at android.app.Activity.performCreate(Activity.java:5066) 
04-02 11:34:14.745: W/System.err(19535): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1102) 
04-02 11:34:14.745: W/System.err(19535): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2288) 
04-02 11:34:14.745: W/System.err(19535): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2368) 
04-02 11:34:14.745: W/System.err(19535): at android.app.ActivityThread.access$600(ActivityThread.java:151) 
04-02 11:34:14.745: W/System.err(19535): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1330) 
04-02 11:34:14.745: W/System.err(19535): at android.os.Handler.dispatchMessage(Handler.java:99) 
04-02 11:34:14.755: W/System.err(19535): at android.os.Looper.loop(Looper.java:155) 
04-02 11:34:14.755: W/System.err(19535): at android.app.ActivityThread.main(ActivityThread.java:5536) 
04-02 11:34:14.755: W/System.err(19535): at java.lang.reflect.Method.invokeNative(Native Method) 
04-02 11:34:14.755: W/System.err(19535): at java.lang.reflect.Method.invoke(Method.java:511) 
04-02 11:34:14.755: W/System.err(19535): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1074) 
04-02 11:34:14.755: W/System.err(19535): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:841) 
04-02 11:34:14.755: W/System.err(19535): at dalvik.system.NativeStart.main(Native Method) 
04-02 11:34:14.765: W/System.err(19535): Caused by: oauth.signpost.exception.OAuthCommunicationException: Service provider responded in error: 400 (Bad Request) 
04-02 11:34:14.765: W/System.err(19535): at oauth.signpost.AbstractOAuthProvider.handleUnexpectedResponse(AbstractOAuthProvider.java:245) 
04-02 11:34:14.765: W/System.err(19535): at oauth.signpost.AbstractOAuthProvider.retrieveToken(AbstractOAuthProvider.java:193) 
04-02 11:34:14.765: W/System.err(19535): ... 16 more 

任何幫助apreciated。

回答

1

我創建了一個Tumblr的小型圖書館,使用oauth sign post和jumblr登錄。你可以在這裏找到:

Tumblr Login API Using oauth sign post

我希望這個圖書館將是有益的爲別人誰有同樣的問題。

0

我知道這是一個相當古老的線程。但對於後來進入的任何人..我建立了一個庫來自動化登錄過程。此外,該聯繫被破壞Houcine。可能想更新。

其可用於Github