2012-08-01 52 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