在Twitter4j中与OAuth度过了一段艰难的时光。在此之前,我在#3255153中详细解释了问题并且出现了401错误,但最终解决了这些问题,并且遇到了更难以解决的问题。
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);
}
}
}
我的Manifest的相关部分:
<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 :(得分:0)
我最近一直在玩Twitter4j并且遇到了一些类似于您遇到的问题。我在你发布的代码中看不出任何错误,但我想知道你传递给getOauthRequestToken的回调网址是什么?我自己也遇到了一些问题。我认为您的CALLBACKURL需要设置为“snapp:// twitter”。请注意,您需要冒号。
如果这不起作用,我建议您尝试从清单行中删除android:host:
<data android:scheme="snapp" android:host="twitter" />
所以你离开了:
<data android:scheme="snapp" />
然后在您调用getOauthRequestToken的代码中,传递值“snapp:///”。这基本上就是我第一次让它发挥作用。
如果这样可行,你可以尝试将android:host =“twitter”放回去,然后改变传递给getOauthRequestToken的值。
如果这不起作用,你看到是否完全调用了onNewIntent - 即它是否只是没有传递uri.toString()。startsWith(CALLBACKURL)测试,因为你的toast只有在它通过时才显示?您可以尝试进行一些登录或在调试器中添加断点。
答案 1 :(得分:0)
Toast.makeText(getBaseContext(), "Login to twitter successful!", Toast.LENGTH_LONG);
当你想要祝酒时,不要忘记叫'show()'。
答案 2 :(得分: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();
}
}