【问题标题】:Android - AccountManager Twitter OAuth, no authentication challenges foundAndroid - AccountManager Twitter OAuth,未发现身份验证挑战
【发布时间】:2015-06-03 17:43:47
【问题描述】:

我正在尝试从 AccountManager 获取 Twitter 帐户的 OAuth 令牌,并使用 Twitter4j 使用它来跟踪 Twitter 句柄。但我发现没有发现身份验证挑战 TwitterException。

下面是获取token并关注用户的代码:

 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)

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

【问题讨论】:

  • 否决选民,你能给个理由吗?请指出原因。任何帮助表示赞赏,我有点卡在这里。

标签: android twitter oauth twitter4j accountmanager


【解决方案1】:

你根本没有做错任何事,这是图书馆的问题。在 Android 中,HTTP 响应代码 401 会导致抛出 IOException。库实现者checks for the message string of the IOException to catch it,但是您的消息字符串略有不同,因此不会执行异常处理。不幸的是,that GitHub project 没有启用问题跟踪器,但您可以尝试联系the project owner,也许他会为您解决。否则你将不得不修改库代码并自己构建它。

【讨论】:

  • 而且,您认为应该如何处理该异常?
  • 即使我们处理它,它是一个 401,那是一个失败。
  • 正如代码所说(见第一个链接),原因是令牌过期,解决方案应该是第二次调用相同的请求,但库不这样做,因为错误消息是在你的 android 版本中有所不同。看来图书馆需要修复。如果项目所有者没有响应,您可以分叉 github 项目来执行此操作。我认为比较消息字符串不是一个好方法。也许在每种情况下第二次拨打电话就足够了。如果异常的原因不同,则很可能再次发生。
猜你喜欢
  • 1970-01-01
  • 2012-10-14
  • 1970-01-01
  • 2013-09-05
  • 2013-07-05
  • 1970-01-01
  • 1970-01-01
  • 2013-11-27
  • 1970-01-01
相关资源
最近更新 更多