安卓-账户管理器Twitter OAuth,未发现身份验证挑战

3
我正在尝试从AccountManager获取Twitter帐户的OAuth令牌,并使用它来关注一个Twitter账号,使用的是Twitter4j。但我得到了“未发现身份验证挑战”的TwitterException错误。
以下是获取令牌并关注用户的代码:
 try{

     AccountManager accountManager = AccountManager.get(getActivity());
     Account twitterAccount = accountManager.getAccountsByType(AccountType.TWITTER.getType())[0];
 AccountManagerFuture<Bundle> tokenFuture =  accountManager.getAuthToken(twitterAccount, "com.twitter.android.oauth.token", null, true, new AccountManagerCallback<Bundle>() {
                    public void run(AccountManagerFuture<Bundle> result) {
                        Bundle bundle;
                        try {
                            bundle = result.getResult();
                            Intent intent = (Intent) bundle.get(AccountManager.KEY_INTENT);
                            if (intent != null) {
                                // User input required
                                getActivity().startActivity(intent);
                            } else {
                                String token = bundle.getString(AccountManager.KEY_AUTHTOKEN);
                                Log.i(TAG, "Token:" + token);
                              userToken = token;
                            }
                        } catch (Exception e) {
                            Log.e(TAG, "Error getting token", e);
                        }

                }

            }, null);

            AccountManagerFuture<Bundle> secretFuture =   accountManager.getAuthToken(twitterAccount, "com.twitter.android.oauth.token.secret", null, true, new AccountManagerCallback<Bundle>() {
                public void run(AccountManagerFuture<Bundle> result) {
                    Bundle bundle;
                    try {
                        bundle = result.getResult();
                        Intent intent = (Intent) bundle.get(AccountManager.KEY_INTENT);
                        if (intent != null) {
                            // User input required
                            getActivity().startActivity(intent);
                        } else {
                            String secret = bundle.getString(AccountManager.KEY_AUTHTOKEN);
                            Log.i(TAG, "Secret Token:" + secret);
                           userSecret = secret;

                        }
                    } catch (Exception e) {
                        Log.e(TAG, "Error getting token", e);
                    }

                }

            }, null);
            ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
            configurationBuilder
                    .setOAuthConsumerKey(<Consumer-key>);
            configurationBuilder
                    .setOAuthConsumerSecret(<Consumer-Secret>);

              configurationBuilder.setOAuthAccessToken(userToken);
            configurationBuilder.setOAuthAccessTokenSecret(userSecret);
            Twitter twitter = new TwitterFactory(configurationBuilder.build()).getInstance();
            User user = twitter.createFriendship(param.getUserName());
            Toast.makeText(followListActivity,"Followed user @"+user.getScreenName()+" :)",Toast.LENGTH_SHORT);


        }  catch (TwitterException e) {
            e.printStackTrace();
        }

遇到以下异常:

TwitterException{exceptionCode=[ec1fe56d-1e3b4ac5 3ea58453-a92e09a2], statusCode=-1, message=null, code=-1, retryAfter=-1, rateLimitStatus=null, version=4.0.2}
at twitter4j.HttpClientImpl.handleRequest(HttpClientImpl.java:178)
at twitter4j.HttpClientBase.request(HttpClientBase.java:53)
at twitter4j.HttpClientBase.get(HttpClientBase.java:71)
at twitter4j.TwitterBaseImpl.fillInIDAndScreenName(TwitterBaseImpl.java:128)
at twitter4j.TwitterImpl.verifyCredentials(TwitterImpl.java:545)
at asynctask.FollowTwitterUserAsyncTask.doInBackground(FollowTwitterUserAsyncTask.java:113)
 at asynctask.FollowTwitterUserAsyncTask.doInBackground(FollowTwitterUserAsyncTask.java:33)
 at android.os.AsyncTask$2.call(AsyncTask.java:287)
 at java.util.concurrent.FutureTask.run(FutureTask.java:234)
 at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
 at java.lang.Thread.run(Thread.java:841)
 Caused by: java.io.IOException: No authentication challenges found
at libcore.net.http.HttpURLConnectionImpl.getAuthorizationCredentials(HttpURLConnectionImpl.java:438)
at libcore.net.http.HttpURLConnectionImpl.processAuthHeader(HttpURLConnectionImpl.java:418)
at libcore.net.http.HttpURLConnectionImpl.processResponseHeaders(HttpURLConnectionImpl.java:367)
at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:301)
at libcore.net.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:497)
at libcore.net.http.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:134)
at twitter4j.HttpResponseImpl.<init>(HttpResponseImpl.java:35)
at twitter4j.HttpClientImpl.handleRequest(HttpClientImpl.java:142)

请指出我在这里做错了什么。

给我投反对票的人,能否给一个理由吗?请指出原因。非常感谢任何帮助,我有点卡在这里了。 - vivek_jonam
1个回答

0

你没有做错任何事情,那是库的问题。在Android中,返回HTTP状态码401会导致抛出IOException。库实现者检查IOException的消息字符串以捕获它,但是你的消息字符串略有不同,因此异常处理不执行。不幸的是,该GitHub项目未启用问题跟踪器,但你可以尝试联系项目所有者,也许他会为你解决这个问题。否则,你将不得不修改库代码并自行构建。


那么,你认为应该如何处理这个异常? - vivek_jonam
即使我们处理了它,它仍然是401错误,也就是失败了。 - vivek_jonam
根据代码(请参见第一个链接),原因是令牌过期,解决方法应该是再次调用相同的请求,但库没有这样做,因为您的Android版本中的错误消息不同。看起来库需要修复。如果项目所有者没有回应,您可以分叉GitHub项目来完成此操作。我认为比较消息字符串不是一个好的方法。也许在每种情况下都进行第二次调用就足够了。如果异常有不同的原因,那么它很可能会再次发生。 - Matthias Ronge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接