2011-01-24 33 views
1

因此,我試圖通過使用Twitter4J庫來獲取關於此OAuth的twitter信息。使用Android和Twitter4J的持久OAuth

我會給出一點背景。

我在我的AndroidManifest.xml中使用瀏覽器方法和回調(我設置爲意圖過濾器)設置了我的Twitter開發者帳戶。

我有一個完全處理我的twitter認證的活動。

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    //set up the datahelper 
    dh = new DataHelper(this, null); 
    tae = dh.GetAuthenticationObject(); 
    setContentView(R.layout.main); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    selectOption(getIntent()); 
} 

public void selectOption(Intent intent) { 
    Uri uri = intent.getData(); 
    if (uri != null && uri.toString().startsWith(CALLBACKURL) && tae.hasBeenAuthenticatedTwitter()) {   
     completeAuth(intent);   
    } else { 
     doOauth(); 
    } 
} 

private void doOauth() { 
    try { 
     consumer = new CommonsHttpOAuthConsumer(Enums.TWITTER_APPLICATION_KEY, 
       Enums.TWITTER_APPLICATION_SECTRET); 

     provider = new DefaultOAuthProvider(
       Enums.TWITTER_REQUEST_TOKEN_URL, 
       Enums.TWITTER_ACCESS_TOKEN_URL, 
       Enums.TWITTER_AUTHORIZE_URL); 

     String authUrl = provider.retrieveRequestToken(
       consumer, CALLBACKURL); 

     tae.TwitterToken = consumer.getToken(); 
     tae.TwitterTokenSecret = consumer.getTokenSecret(); 
     dh.SaveAuthenticationObject(tae); 

     this.startActivity(new Intent(Intent.ACTION_VIEW, Uri 
       .parse(authUrl))); 
    } catch (Exception e) { 
     Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show(); 
    } 
} 

/** 
* After use authorizes this is the function where we get back callbac with 
* user specific token and secret token. You might want to store this token 
* for future use. 
*/ 

public void completeAuth(Intent intent) { 
    Uri uri = intent.getData(); 
    if (uri != null && uri.toString().startsWith(CALLBACKURL)) { 

     tae = dh.GetAuthenticationObject(); 
     String verifier = uri 
       .getQueryParameter(oauth.signpost.OAuth.OAUTH_VERIFIER); 
     tae.TwitterVerifier = verifier; 
     dh.SaveAuthenticationObject(tae); 
    } 

    Intent settingsIntent = new Intent(this, com.undetowdevelopment.kontakt.Settings.class); 
    settingsIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    settingsIntent.putExtra("REQUEST_CODE", Enums.REQUEST_CODE_TWITTER_LOGIN); 
    settingsIntent.putExtra("RESULT_CODE", Activity.RESULT_OK); 
    startActivity(settingsIntent); 
} 

該課程完全符合我的期望。它打開Twitter認證頁面,返回到活動,並將Token & Secret保存到我的共享首選項。

AndroidManifest.xml樣子:

<activity android:name=".TwitterSuccess" android:label="@string/app_name" android:launchMode="singleTop"> 
     <intent-filter> 
      <action android:name="android.intent.action.VIEW"></action> 
      <category android:name="android.intent.category.DEFAULT"></category> 
      <category android:name="android.intent.category.BROWSABLE"></category> 
      <data android:scheme="myapp" android:host="mainactivity"/> 
     </intent-filter> 
    </activity> 

然而,當我的應用程序啓動,我想檢查人進行身份驗證,而不必要求用戶所有的時間再次進行身份驗證。

從我所有的活動,我有一個方法,返回一個Twitter對象,我想用來設置狀態或獲取用戶的朋友。

我用下面的方法來做到這一點:

public Twitter getTwitterObject() 
{ 

    AuthenticationEntity ae = GetAuthenticationObject(); 

    CommonsHttpOAuthConsumer consumer = new CommonsHttpOAuthConsumer(Enums.TWITTER_APPLICATION_KEY, Enums.TWITTER_APPLICATION_SECTRET); 
    //Set the requestToken and the tokenSecret that you got earlier by calling retrieveRequestToken. 
    consumer.setTokenWithSecret(ae.TwitterToken, ae.TwitterTokenSecret); 

    //The provider object is lost, too, so instantiate it again. 
    DefaultOAuthProvider provider = new DefaultOAuthProvider(
      Enums.TWITTER_REQUEST_TOKEN_URL, 
      Enums.TWITTER_ACCESS_TOKEN_URL, 
      Enums.TWITTER_AUTHORIZE_URL); 

    //Now that's really important. Because you don't perform the retrieveRequestToken method at this moment, the OAuth method is not detected automatically (there is no communication with Twitter). So, the default is 1.0 which is wrong because the initial request was performed with 1.0a. 
    provider.setOAuth10a(true); 


    try { 
     provider.retrieveAccessToken(consumer, ae.TwitterVerifier); 
    } catch (Exception e) { 
     Toast.makeText(mContext, e.getMessage(), Toast.LENGTH_LONG).show(); 
     e.printStackTrace(); 
    } 

    Twitter twitter = new TwitterFactory().getInstance(); 
    twitter.setOAuthConsumer(Enums.TWITTER_APPLICATION_KEY, Enums.TWITTER_APPLICATION_SECTRET); 
    twitter.setOAuthAccessToken(new AccessToken(consumer.getToken(), consumer.getTokenSecret())); 
    return twitter; 

} 

現在這工作正常,如果用戶剛剛登錄,但如果我再次啓動應用程序(這沒​​關係,因爲我使用的唯一的數據我的靜態變量和共享偏好),我無法驗證,我得到以下異常:

01-24 11:41:54.075: WARN/System.err(14612): oauth.signpost.exception.OAuthCommunicationException: Communication with the service provider failed: http://twitter.com/oauth/access_token 
01-24 11:41:54.075: WARN/System.err(14612):  at oauth.signpost.AbstractOAuthProvider.retrieveToken(AbstractOAuthProvider.java:214) 
01-24 11:41:54.075: WARN/System.err(14612):  at oauth.signpost.AbstractOAuthProvider.retrieveAccessToken(AbstractOAuthProvider.java:97) 
01-24 11:41:54.075: WARN/System.err(14612):  at com.undetowdevelopment.kontakt.helpers.DataHelper.getTwitterObject(DataHelper.java:129) 
01-24 11:41:54.075: WARN/System.err(14612):  at com.undetowdevelopment.kontakt.Settings.checkTwitterStatus(Settings.java:118) 
01-24 11:41:54.075: WARN/System.err(14612):  at com.undetowdevelopment.kontakt.Settings.setUIComponents(Settings.java:60) 
01-24 11:41:54.075: WARN/System.err(14612):  at com.undetowdevelopment.kontakt.Settings.onCreate(Settings.java:39) 
01-24 11:41:54.075: WARN/System.err(14612):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1069) 
01-24 11:41:54.085: WARN/System.err(14612):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2751) 
01-24 11:41:54.085: WARN/System.err(14612):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2803) 
01-24 11:41:54.085: WARN/System.err(14612):  at android.app.ActivityThread.access$2300(ActivityThread.java:135) 
01-24 11:41:54.085: WARN/System.err(14612):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2136) 
01-24 11:41:54.085: WARN/System.err(14612):  at android.os.Handler.dispatchMessage(Handler.java:99) 
01-24 11:41:54.085: WARN/System.err(14612):  at android.os.Looper.loop(Looper.java:144) 
01-24 11:41:54.085: WARN/System.err(14612):  at android.app.ActivityThread.main(ActivityThread.java:4937) 
01-24 11:41:54.085: WARN/System.err(14612):  at java.lang.reflect.Method.invokeNative(Native Method) 
01-24 11:41:54.085: WARN/System.err(14612):  at java.lang.reflect.Method.invoke(Method.java:521) 
01-24 11:41:54.085: WARN/System.err(14612):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
01-24 11:41:54.085: WARN/System.err(14612):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
01-24 11:41:54.085: WARN/System.err(14612):  at dalvik.system.NativeStart.main(Native Method) 
01-24 11:41:54.085: WARN/System.err(14612): Caused by: java.io.FileNotFoundException: http://twitter.com/oauth/access_token 
01-24 11:41:54.085: WARN/System.err(14612):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:1162) 
01-24 11:41:54.085: WARN/System.err(14612):  at oauth.signpost.basic.HttpURLConnectionResponseAdapter.getContent(HttpURLConnectionResponseAdapter.java:18) 
01-24 11:41:54.085: WARN/System.err(14612):  at oauth.signpost.AbstractOAuthProvider.handleUnexpectedResponse(AbstractOAuthProvider.java:228) 
01-24 11:41:54.085: WARN/System.err(14612):  at oauth.signpost.AbstractOAuthProvider.retrieveToken(AbstractOAuthProvider.java:189) 
01-24 11:41:54.085: WARN/System.err(14612):  ... 18 more 
01-24 11:41:54.885: WARN/System.err(14612): http://api.twitter.com/1/account/verify_credentials.json?include_entities=falseRelevant discussions can be on the Internet at: 
01-24 11:41:54.885: WARN/System.err(14612):  http://www.google.co.jp/search?q=2486d84d or 
01-24 11:41:54.885: WARN/System.err(14612):  http://www.google.co.jp/search?q=0d00203c 
01-24 11:41:54.885: WARN/System.err(14612): TwitterException{exceptionCode=[2486d84d-0d00203c 175a68e8-9303e317], statusCode=-1, retryAfter=0, rateLimitStatus=null, version=2.1.12-SNAPSHOT(build: e7bec3eec13cedc774926ee24f4c5368d218c9d4)} 
01-24 11:41:54.885: WARN/System.err(14612):  at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:214) 
01-24 11:41:54.885: WARN/System.err(14612):  at twitter4j.internal.http.HttpClientWrapper.request(HttpClientWrapper.java:75) 
01-24 11:41:54.885: WARN/System.err(14612):  at twitter4j.internal.http.HttpClientWrapper.get(HttpClientWrapper.java:103) 
01-24 11:41:54.885: WARN/System.err(14612):  at twitter4j.Twitter.verifyCredentials(Twitter.java:1397) 
01-24 11:41:54.885: WARN/System.err(14612):  at twitter4j.Twitter.getScreenName(Twitter.java:191) 
01-24 11:41:54.885: WARN/System.err(14612):  at com.undetowdevelopment.kontakt.Settings.checkTwitterStatus(Settings.java:120) 
01-24 11:41:54.885: WARN/System.err(14612):  at com.undetowdevelopment.kontakt.Settings.setUIComponents(Settings.java:60) 
01-24 11:41:54.885: WARN/System.err(14612):  at com.undetowdevelopment.kontakt.Settings.onCreate(Settings.java:39) 
01-24 11:41:54.885: WARN/System.err(14612):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1069) 
01-24 11:41:54.885: WARN/System.err(14612):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2751) 
01-24 11:41:54.885: WARN/System.err(14612):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2803) 
01-24 11:41:54.885: WARN/System.err(14612):  at android.app.ActivityThread.access$2300(ActivityThread.java:135) 
01-24 11:41:54.885: WARN/System.err(14612):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2136) 
01-24 11:41:54.885: WARN/System.err(14612):  at android.os.Handler.dispatchMessage(Handler.java:99) 
01-24 11:41:54.885: WARN/System.err(14612):  at android.os.Looper.loop(Looper.java:144) 
01-24 11:41:54.885: WARN/System.err(14612):  at android.app.ActivityThread.main(ActivityThread.java:4937) 
01-24 11:41:54.885: WARN/System.err(14612):  at java.lang.reflect.Method.invokeNative(Native Method) 
01-24 11:41:54.885: WARN/System.err(14612):  at java.lang.reflect.Method.invoke(Method.java:521) 
01-24 11:41:54.885: WARN/System.err(14612):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
01-24 11:41:54.885: WARN/System.err(14612):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
01-24 11:41:54.885: WARN/System.err(14612):  at dalvik.system.NativeStart.main(Native Method) 
01-24 11:41:54.885: WARN/System.err(14612): Caused by: java.io.FileNotFoundException: http://api.twitter.com/1/account/verify_credentials.json?include_entities=false 
01-24 11:41:54.885: WARN/System.err(14612):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:1162) 
01-24 11:41:54.885: WARN/System.err(14612):  at twitter4j.internal.http.HttpResponseImpl.<init>(HttpResponseImpl.java:47) 
01-24 11:41:54.895: WARN/System.err(14612):  at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:178) 
01-24 11:41:54.895: WARN/System.err(14612):  ... 20 more 
01-24 11:41:54.995: WARN/InputManagerService(99): Starting input on non-focused client [email protected] (uid=10060 pid=14093) 

就像我提到的,當我剛剛完成身份驗證,一切工作正常,但如果我再次啓動我的申請,我得到這條信息。

我使用的是運行Android 2.2的HTC Incredible。該應用程序正在爲Android 1.6+開發。

任何意見或幫助將不勝感激!

最佳,

Ignus

回答

1

我真的不知道你在做什麼,但你可以在Zwitscher https://github.com/pilhuhn/ZwitscherA尤其是在https://github.com/pilhuhn/ZwitscherA/blob/v065/src/de/bsd/zwitscher/LoginActivity.java方法,然後調用到TwitterHelper看看這裏。

當用戶第一次登錄並且從未登錄時,活動會檢查該問題並顯示帶有「getPinFromTwitter」按鈕的屏幕 - 這會將用戶重定向到Twitter,以便他可以登錄並獲取引腳。 用戶再次啓動該應用程序,輸入密碼並單擊「setPin」。 在這個版本的Zwitscher中,帳戶存儲在數據庫中;在早期版本中(只需查看v065標籤,例如:https://github.com/pilhuhn/ZwitscherA/tree/v065),這是通過共享首選項完成的。 來源目前有點不穩定。

+0

嘿Heiko,謝謝你的回覆。我發現我的錯誤,並且是由於我在處理應用程序重定向(使用回調)時意圖回到我的Activity。 – tribe84 2011-01-24 19:26:55