2010-12-08 17 views
2

私は自分のアプリにTwitterを統合しようとしていますが、動かすことができません。Twitter認証後のコールバック

これは私のコードです:

public class OAuthForTwitter extends Activity { 

    private CommonsHttpOAuthConsumer httpOauthConsumer; 
    private OAuthProvider httpOauthprovider; 
    public final static String consumerKey = "xxxxxxxxxxxxxx"; 
    public final static String consumerSecret = "xxxxxxxxxxxx"; 
    private final String CALLBACKURL = "sosInternational:///HierBenIkNu"; 
    private Twitter twitter; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     doOAuth(); 
    } 

    /** 
    * Opens the browser using signpost jar with application specific 
    * consumerkey and consumerSecret. 
    */ 

    private void doOAuth() { 
     try { 
      httpOauthConsumer = new CommonsHttpOAuthConsumer(consumerKey, consumerSecret); 
      httpOauthprovider = new DefaultOAuthProvider(
        "http://twitter.com/oauth/request_token", 
        "http://twitter.com/oauth/access_token", 
        "http://twitter.com/oauth/authorize"); 
      String authUrl = httpOauthprovider.retrieveRequestToken(httpOauthConsumer, CALLBACKURL); 
      this.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(authUrl))); 
     } catch (Exception e) { 
      Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show(); 
     } 
    } 

    @Override 
    protected void onNewIntent(Intent intent) { 

     super.onNewIntent(intent); 

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

      String verifier = uri 
        .getQueryParameter(oauth.signpost.OAuth.OAUTH_VERIFIER); 

      try { 
       // this will populate token and token_secret in consumer 

       httpOauthprovider.retrieveAccessToken(httpOauthConsumer, 
         verifier); 

       // TODO: you might want to store token and token_secret in you 
       // app settings!!!!!!!! 

       AccessToken a = new AccessToken(httpOauthConsumer.getToken(), 
         httpOauthConsumer.getTokenSecret()); 

       // initialize Twitter4J 

       twitter = new TwitterFactory().getInstance(); 
       twitter.setOAuthConsumer(consumerKey, consumerSecret); 
       twitter.setOAuthAccessToken(a); 

       // create a tweet 

       Date d = new Date(System.currentTimeMillis()); 
       String tweet = "#OAuth working! " + d.toLocaleString(); 

       // send the tweet 

       twitter.updateStatus(tweet); 

      } catch (Exception e) { 

       Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show(); 
      } 

     } 
    } 
} 

私はTwitterのサイトで認証を行う終わりだとき、それはアプリを私に戻ってリダイレクトする必要があります。私は私が得るキーで私のアプリに戻ることができますどのように

<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="sosInternational" android:host="HierBenIkNu"></data> 
    </intent-filter> 

:私は私のAndroidManifestでこれを持って

alt text

しかし、その代わりに、私が見つかりませんこのページを取得しますバック?

+5

次回は**消費者キーと消費者の秘密を削除してください**。これは悪意のある開発者が使用することができます。私はあなたのためにそれを削除しました。 –

+0

うわー、それは私の非常に愚かだった。警告ありがとう! – Galip

+0

あまりにも遅れて、それは歴史の中に見えます。キーをできるだけ早く変更してください。 –

答えて

7

これはかなり間違っていました。

<activity 
     android:name=".OAuthForTwitter" 
     android:label="@string/app_name" 
     android:configChanges="orientation|keyboardHidden" 
     android:launchMode="singleInstance"> 
     <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="sosInternational" android:host="OAuthForTwitter"></data> 
     </intent-filter> 
    </activity> 

この種のオフの作品は、それだけで最初から全アプリをロードします。

<intent-filter>

これが今どのように..ですアプリケーションの内部ではなかったです。

アプリ全体を再起動せずに前回のアクティビティに戻ることはできませんか?

+1

singleInstance、それは私のバグでした!ありがとうございました! – gilm

0

JavaコードのコールバックURLは、 "sosInternational:// HierBenIkNu"( "sosInternational:/// HierBenIkNu"ではなく)でなければなりません。

private final String CALLBACKURL = "sosInternational://HierBenIkNu"; 
5

私はこれを解決しました。正確にあなたが開発した方法ではなく、わずかに異なる方法。ここでは、私が何をしたのかを説明するステップがあります。

  1. Webブラウザで開くのではなく、webviewを使用します。重要な利点の1つは、URLのリダイレクトを追跡できることです。

  2. setWebViewClientあなたのwebviewのメソッドとあなたのクラスのshouldOverrideUrlLoadingメソッドをオーバーライドするには、私は内部クラスを使用しています。

  3. メソッドにurlパラメータがあります。自分のコールバックURLで始まるかどうかを確認します(注:このURLには、ユーザトークンと認証に必要なユーザシークレットが含まれています)。

  4. タスクを完了したら、そのアクティビティを非表示にするか、WebViewまたは任意のものを削除できます。

EDIT:これは、通常のWebアプリケーションで使用されるのOAuthの方法ですので、私たちは、XAUTHの方法を必要としません。 (他のコミュニティメンバーが知らない場合)

希望すると助かります。

関連する問題