2012-08-01 56 views
3

我想使用Twitter4J連接到Twitter。 MainActivity致電TwitterLoginActivity。 TwitterLoginActivity顯示一個WebView,然後通過OnNewIntent()獲取accessToken。我在「SignIn」Twitter之後,問題是WebView顯示「網頁不可用」。這是我的代碼。Twitter不會重定向到Android應用 - Twitter4J

MainActivity調用TwitterLoginActivity:

   final Intent intent = new Intent(MainActivity.this, TwitterLoginActivity.class); 
       intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 
       startActivityForResult(intent, Constant.LOGIN_REQUEST); 

TwitterLoginActivity顯示的WebView。

final WebView twitterSite = new WebView(this); 
    final ViewGroup viewGroup = (ViewGroup)findViewById(R.id.twitterLoginRoot); 
    viewGroup.addView(twitterSite); 

    // Open keyboard when focusing on Twitter login form. 
    twitterSite.requestFocus(View.FOCUS_DOWN); 
    twitterSite.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(final View v, final MotionEvent event) { 
      switch (event.getAction()) { 
       case MotionEvent.ACTION_DOWN: 
       case MotionEvent.ACTION_UP: 
        if (!v.hasFocus()) { 
         v.requestFocus(); 
        } 
        break; 
      } 
      return false; 
     } 
    }); 
    twitterSite.setWebViewClient(new CustomWebViewClient()); 

    try { 
     final RequestToken requestToken = twitter.getOAuthRequestToken(Constant.CALLBACK_URL); 
     twitterSite.loadUrl(requestToken.getAuthenticationURL()); 
    } catch (final TwitterException e) { 
     e.printStackTrace(); 
    } 

onNewIntent:

@Override 
protected void onNewIntent(final Intent intent) { 
    super.onNewIntent(intent); 
    System.out.println("HIEU================================="); 
    setResult(RESULT_OK); 
    finish(); 
} 

我用這個來防止默認瀏覽器加載。

private class CustomWebViewClient extends WebViewClient { 
    @Override 
    public boolean shouldOverrideUrlLoading(final WebView view, final String url) { 
     view.loadUrl(url); 
     return true; 
    } 
} 

清單文件:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.twitterapitest" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="15" /> 

    <uses-permission 
     android:name="android.permission.INTERNET" /> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name=".MainActivity" 
      android:label="@string/title_activity_main" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 


     <activity 
      android:name=".TwitterLoginActivity" 
      android:label="@string/title_activity_main" 
      android:launchMode="singleInstance"> 
      <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="test123"/> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

回調URI:

public static final String CALLBACK_URL = "test123:///"; 

回答

0

使用以下網址爲您的回調URL,它會解決你的問題。

public static final String CALLBACK_URL = "x-oauthflow-twitter://callback"; 
+0

我已經試過,但它不工作。我通過在我的java文件以及清單文件中更改它來嘗試它。 – Akram 2012-08-28 06:19:42

+1

請參閱此博客,瞭解與twitter4j庫的twitter集成。 http://androidcodeexamples.blogspot.in/2011/12/how-to-integrate-twitter-in-android.html – 2012-08-28 06:24:41

+1

@IGP如果我使用你的建議在網絡瀏覽器中打開Twitter授權(如果Twitter應用程序不是安裝在android上),那麼它給了我以下錯誤:「網頁不可用,x-oauthflow-twitter:// callback?oauth_token = ......中的網頁可能暫時關閉。」 – 2012-11-29 22:40:32

2

我想你想要當你的登錄成功時twitter返回的「oauth_verifier」,對不對?

您可以從返回shouldOverrideUrlLoading方法的url中獲取它。做這樣的事情:

webView.setWebViewClient(new WebViewClient(){ 
    @Override 
    public void onPageStarted(WebView view, String url, Bitmap favicon) { 
     progressDialog.show(); 
    } 

    @Override 
    public void onPageFinished(WebView view, final String url) { 
     progressDialog.dismiss(); 
    } 

    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
     String oauthVerifier = url.substring(url.indexOf("oauth_verifier=") + 15); 
     Intent intent = new Intent(context); 
     Bundle bundle = new Bundle(); 

     bundle.putString("oauth_verifier", oauthVerifier); 
     intent.putExtras(bundle); 

     ((Activity) ctx).setResult(RESULT_OK, intent); 

     return true; 
    }     
}); 

我有一個類似於你的問題。我不知道如何將onNewIntent調用到WebViewClient中,所以我不得不重新思考真正需要的內容,並且在我的結論中我意識到我只需要oauth_verifier,並且可以從返回的URL中獲取它。

我希望這可以幫到你:

+0

我認爲這是最好的解決方案。 – jzafrilla 2014-05-29 11:59:34