不能用twitter4j发推文

时间:2011-12-03 23:34:49

标签: android twitter-oauth twitter4j

尝试从我的Android应用发送推文(固定消息)时遇到问题。我尝试了4个不同的代码示例(所有这些使用twitter4j),取自不同的论坛,但总是得到相同的结果:我把我的用户和密码,身份验证工作正常,但之后我总是重定向到“callback_url”中指定的URL(我已经使用现有的网址进行了测试,并且不存在),并且未发布推文。 正如您所看到的,我已经分离了身份验证和发送推文的方法,但是一旦身份验证完成,控件就永远不会返回到我的应用程序。我正在使用android 2.1(也用2.2测试)。 任何帮助将非常感激。 提前谢谢。

public void onCreate(Bundle savedInstanceState) {

   mTwitter = new TwitterFactory().getInstance();
   mTwitter.setOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
   if (mPrefs.contains(PREF_ACCESS_TOKEN)) {
       loginAuthorisedUser();
   } else {
    loginNewUser();
   }
}

private void loginNewUser() {
    try {
        mReqToken = mTwitter.getOAuthRequestToken(CALLBACK_URL);

        WebView twitterSite = new WebView(this);
        twitterSite.loadUrl(mReqToken.getAuthenticationURL());
        setContentView(twitterSite);

    } catch (TwitterException e) {
        Toast.makeText(this, "Twitter Login error, try again later", Toast.LENGTH_SHORT).show();
    }
}

private void loginAuthorisedUser() {
    String token = mPrefs.getString(PREF_ACCESS_TOKEN, null);
    String secret = mPrefs.getString(PREF_ACCESS_TOKEN_SECRET, null);

    // Create the twitter access token from the credentials we got previously
    AccessToken at = new AccessToken(token, secret);

    mTwitter.setOAuthAccessToken(at);

    Toast.makeText(this, "Welcome back", Toast.LENGTH_SHORT).show();

    buttonTweet(null);
}

/**
 * Catch when Twitter redirects back to our {@link CALLBACK_URL}</br> 
 * We use onNewIntent as in our manifest we have singleInstance="true" if we did not the
 * getOAuthAccessToken() call would fail
 */
@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    dealWithTwitterResponse(intent);
}

/**
 * Twitter has sent us back into our app</br> 
 * Within the intent it set back we have a 'key' we can use to authenticate the user
 * 
 * @param intent
 */
private void dealWithTwitterResponse(Intent intent) {
    Uri uri = intent.getData();
    if (uri != null && uri.toString().startsWith(CALLBACK_URL)) { // If the user has just logged in
        String oauthVerifier = uri.getQueryParameter("oauth_verifier");

        authoriseNewUser(oauthVerifier);
    }
}

/**
 * Create an access token for this new user</br> 
 * Fill out the Twitter4j helper</br> 
 * And save these credentials so we can log the user straight in next time
 * 
 * @param oauthVerifier
 */
private void authoriseNewUser(String oauthVerifier) {
    try {
        AccessToken at = mTwitter.getOAuthAccessToken(mReqToken, oauthVerifier);
        mTwitter.setOAuthAccessToken(at);

        saveAccessToken(at);

        // Set the content view back after we changed to a webview
//          setContentView(R.layout.main);

        tweetMessage();
    } catch (TwitterException e) {
        Toast.makeText(this, "Twitter auth error x01, try again later", Toast.LENGTH_SHORT).show();
    }
}

private void tweetMessage() {
    try {
        mTwitter.updateStatus("Test - Tweeting");

        Toast.makeText(this, "Tweet Successful!", Toast.LENGTH_SHORT).show();
    } catch (TwitterException e) {
        Toast.makeText(this, "Tweet error, try again later", Toast.LENGTH_SHORT).show();
    }
}

private void saveAccessToken(AccessToken at) {
    String token = at.getToken();
    String secret = at.getTokenSecret();
    Editor editor = mPrefs.edit();
    editor.putString(PREF_ACCESS_TOKEN, token);
    editor.putString(PREF_ACCESS_TOKEN_SECRET, secret);
    editor.commit();
}

AndroidManifest中的活动声明:

<activity android:name=".share.twitter.TwitterActivity" 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="http://www.someurl.com" />
    </intent-filter>
</activity>

2 个答案:

答案 0 :(得分:0)

你的Android应用程序中的方案和主机应该是应用程序独有的东西,以便android知道应该处理回调的应用程序。你现在拥有的东西让android认为你的应用程序可以使用“http”方案处理网页浏览。 Check out the answers to the post here.具体来说,frankenstein描述了如何设置方案和主机,我的代码将向您展示如何处理onResume()。

答案 1 :(得分:0)

Here是一个文件解决方案的链接,它解释了如何将图片/文本推文整合到Android应用中。

我刚刚解决了这个问题,而不是尝试使用提供的代码来修复代码。它应该可以不加修改地工作,并且可以发送一条推文,一次调用tweet()函数。