2011-12-18 152 views
1

在Twitter4j中使用OAuth玩了一段时间。在此之前,我遇到了#3255153中详细描述的问题和401错误,但终于修复了这些问题,并且遇到了难以解决的问题。Twitter4j OAuth回调成功,但测试鸣叫失败

Twitter应用程序授权页面在浏览器中启动,我登录并批准我的帐户的应用程序。然后它重定向回应用程序,并且没有任何反应。该视图与启动授权页面之前完全相同。

要查看它是否有效,我将它设置为Toast消息,说明“登录到Twitter成功”,在onResume或onNewIntent(如下所示)中,它永远不会弹出。成功的回调URL被接收,但是,由于该项在logcat中显示出来:

12-18 09:25:50.426: I/ActivityManager(186): Starting: Intent { act=android.intent.action.VIEW cat=[android.intent.category.BROWSABLE] dat=snapp://twitter?oauth_token=tokenhere&oauth_verifier=verifierhere cmp=com.infini_servers.snapp/.SnappActivity } from pid 7853 

这里是我的onNewIntent(也有的onResume虚拟克隆):

@Override 
    protected void onNewIntent(Intent intent) 
    { 
     super.onNewIntent(intent);   

     Uri uri = intent.getData(); 
     if (uri != null && uri.toString().startsWith(CALLBACKURL)) 
     { 
      Toast.makeText(getBaseContext(), "Login to twitter successful!", Toast.LENGTH_LONG); 
      String verifier = uri.getQueryParameter(oauth.signpost.OAuth.OAUTH_VERIFIER); 
      try 
      { 
       provider.retrieveAccessToken(consumer, verifier); 

       AccessToken accessToken = new AccessToken(consumer.getToken(), 
         consumer.getTokenSecret()); 
       twitter.setOAuthConsumer(consumerKey, consumerSecret); 
       twitter.setOAuthAccessToken(accessToken); 
       String tweet = "Test"; 
       twitter.updateStatus(tweet); 
       Toast.makeText(getBaseContext(), "Tweet Successful!", Toast.LENGTH_LONG); 
      } 
      catch (Exception e) 
      { 
       Toast.makeText(getBaseContext(), e.getMessage(), Toast.LENGTH_LONG); 
      } 
     }  
    } 

和相关位我清单:

<activity 
      android:label="@string/app_name" 
      android:name=".SnappLaunch" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
      </activity> 
     <activity 
      android:label="@string/app_name" 
      android:name=".SnappActivity" 
      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="snapp" android:host="twitter" /> 
      </intent-filter> 
     </activity> 
+0

我有同样的问题。你是否设法为你的问题找到解决方案? – Dilberted 2012-04-30 07:30:33

回答

0

我最近一直在玩Twitter4j,并有一些问题,听起来类似于你正在遇到的问题。我在你发布的代码中看不到任何错误,但是我想知道你传递给getOauthRequestToken的回调URL是什么?我自己也有一些问题。我认为你的CALLBACKURL需要设置为“snapp:// twitter”。请注意,您需要冒号。

如果不工作,我建议你尝试删除了android:从清单线主机:你留下了

<data android:scheme="snapp" android:host="twitter" /> 

这样:

<data android:scheme="snapp" /> 

,然后在代码在你调用getOauthRequestToken的地方传递值“snapp:///”。这基本上是我做的第一个工作。

如果这样,那么可以尝试将android:host =“twitter”放回去,然后更改传递给getOauthRequestToken的值。

如果这不起作用,您是否看到过是否调用了onNewIntent - 即它是否仅传递uri.toString()。startsWith(CALLBACKURL)测试,因为只有在传递时才显示toast?您可以尝试在调试器中进行一些登录或添加一个断点。

0

Toast.makeText(getBaseContext(), "Login to twitter successful!", Toast.LENGTH_LONG);

不要忘了叫 '秀()' 当你想敬酒。

0

你的onResume()方法代码放在asynctask里面。它的工作正常。

看到样品,

class TwitterLogin extends AsyncTask<String, String, String> 
    { 

     @Override 
     protected String doInBackground(String... params) 
     { 
      // TODO Auto-generated method stub 

      Uri uri = getIntent().getData();     
      if (uri != null && uri.toString().startsWith(TWITTER_CALLBACK_URL)) 
      { 
       String verifier = uri.getQueryParameter(URL_TWITTER_OAUTH_VERIFIER); 
       try 
       { 
        AccessToken accessToken = twitter.getOAuthAccessToken(requestToken, verifier); 
        // Shared Preferences 
        Editor e = loginPrefs.edit(); 
        e.putString(PREF_KEY_OAUTH_TOKEN, accessToken.getToken()); 
        e.putString(PREF_KEY_OAUTH_SECRET,accessToken.getTokenSecret()); 
        e.putBoolean(PREF_KEY_TWITTER_LOGIN, true); 
        e.commit(); 

        Log.e("Twitter OAuth Token", "> " + accessToken.getToken()); 


        long userID = accessToken.getUserId(); 
        User user = twitter.showUser(userID); 
        String username = user.getName(); 
        Log.e("UserID: ", "userID: "+userID+""+username); 

        Log.v("Welcome:","Thanks:"+Html.fromHtml("<b>Welcome " + username + "</b>")); 
       } 
       catch (Exception e) 
       { 
        Log.e("Twitter Login Error", "> " + e.getMessage()); 
       } 
      } 

      return null; 
     } 

     @Override 
     protected void onPostExecute(String result) 
     { 
      // TODO Auto-generated method stub 
      super.onPostExecute(result); 

     } 

     @Override 
     protected void onPreExecute() 
     { 
      // TODO Auto-generated method stub 
      super.onPreExecute(); 

     } 
    }