Android Twitter4j OAuth回调成功,但测试tweet失败

Android Twitter4j OAuth回调成功,但测试tweet失败,android,oauth,twitter-oauth,twitter4j,Android,Oauth,Twitter Oauth,Twitter4j,在Twitter4j中与OAuth相处不愉快。在此之前,我有详细的问题和401错误,但最终修复了这些,并遇到了一个更难解决的问题 Twitter应用程序授权页面在浏览器中启动,我登录并批准我帐户的应用程序。然后它重定向回应用程序,但什么也没有发生。该视图与启动授权页面之前的视图完全相同 为了看看它是否有效,我将它设置为在onResume或onNewIntent(如下所示)中显示一条消息,上面写着“登录Twitter成功”,这条消息永远不会弹出。但是,当此条目显示在LogCat中时,会收到成功的回

在Twitter4j中与OAuth相处不愉快。在此之前,我有详细的问题和401错误,但最终修复了这些,并遇到了一个更难解决的问题

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

为了看看它是否有效,我将它设置为在onResume或onNewIntent(如下所示)中显示一条消息,上面写着“登录Twitter成功”,这条消息永远不会弹出。但是,当此条目显示在LogCat中时,会收到成功的回调URL:

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的虚拟克隆):

以及我清单中的相关部分:

 <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>

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

如果这不起作用,我建议您尝试从清单行删除android:host:

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

因此,您只剩下:

<data android:scheme="snapp" />

然后在调用getOauthRequestToken的代码中,传递值“snap://”。这基本上就是我第一次让它工作时所做的

如果这样做有效,您可以尝试将android:host=“twitter”放回原处,然后更改传递给getOauthRequestToken的值

如果这不起作用,您是否看到了onNewIntent是否被调用,即它是否只是没有通过uri.toString().startsWith(CALLBACKURL)测试,因为只有通过了测试,才会显示toast?您可以尝试登录或在调试器中添加断点

Toast.makeText(getBaseContext(),“登录twitter成功!”,Toast.LENGTH\u LONG)

当你想祝酒时,别忘了调用“show()”。

你的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();

        }
    }
类TwitterLogin扩展了异步任务
{
@凌驾
受保护的字符串doInBackground(字符串…参数)
{
//TODO自动生成的方法存根
Uri=getIntent().getData();
if(uri!=null&&uri.toString().startsWith(TWITTER\u CALLBACK\u URL))
{
字符串验证器=uri.getQueryParameter(URL\uTwitter\uOAuth\uVerifier);
尝试
{
AccessToken AccessToken=twitter.getOAuthAccessToken(requestToken,验证器);
//共享首选项
编辑器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、 提交();
e(“Twitter OAuth Token”,“>”+accessToken.getToken());
long userID=accessToken.getUserId();
User User=twitter.showUser(userID);
字符串username=user.getName();
Log.e(“UserID:”,“UserID:”+UserID+“”+username);
Log.v(“欢迎:”、“谢谢:”+Html.fromHtml(“欢迎”+username+));
} 
捕获(例外e)
{
Log.e(“Twitter登录错误”,“>”+e.getMessage());
}
}
返回null;
}
@凌驾
受保护的void onPostExecute(字符串结果)
{
//TODO自动生成的方法存根
super.onPostExecute(结果);
}
@凌驾
受保护的void onPreExecute()
{
//TODO自动生成的方法存根
super.onPreExecute();
}
}

我也有同样的问题。你找到解决问题的办法了吗?
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();

        }
    }