【问题标题】:Error with Twitter4J from Android with browser user authentication: No authentication challenges found来自 Android 的 Twitter4J 与浏览器用户身份验证出错:未找到身份验证挑战
【发布时间】:2014-02-15 12:20:13
【问题描述】:

我正在尝试使用 Android Studio 0.4.2 和 Twitter4J 库开发我自己的 Android 应用程序。我的想法是使用 WebView 在那里加载 Twitter 身份验证页面并从那里获取 AccessToken。我可以得到 oauth_token 和 oauth_verifier,但是在那之后所有的 Twitter 方法来获取关注者,发布推文,无论什么都不起作用。

这是我的代码:

public class TwitterLoginFragment extends Fragment {
    private static String TWITTER_CONSUMER_KEY = "***";
    private static String TWITTER_CONSUMER_SECRET = "***";
    private static final String TWITTER_CALLBACK_URL = "http://www.hita.pro";

    private static SharedPreferences sharedPreferences;
    private Button btnTwitterLogin;
    private Button btnTwitterLogOut;
    private WebView wvTwitterLogin;

    private IDs iDs;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        sharedPreferences = getActivity().getSharedPreferences("CONNECTION_INFO", Context.MODE_PRIVATE);
        TwitterFactory.getSingleton().setOAuthConsumer(TWITTER_CONSUMER_KEY, TWITTER_CONSUMER_SECRET);
        return inflater.inflate(R.layout.fragment_twitter_login, container, false);
    }

    @Override
    public void onActivityCreated(Bundle savedInstance) {
        super.onActivityCreated(savedInstance);

        wvTwitterLogin = (WebView) getView().findViewById(R.id.wvTwitterLogin);
        wvTwitterLogin.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                SharedPreferences.Editor editor = sharedPreferences.edit();
                editor.putBoolean("KEY_TWITTER_LOGIN", true);
                editor.putString("OAUTH_TOKEN", url.substring(url.indexOf("oauth_token=") + 12, url.indexOf("&")));
                editor.putString("OAUTH_VERIFIER", url.substring(url.indexOf("oauth_verifier=") + 15));
                editor.commit();

                TwitterFactory.getSingleton().setOAuthAccessToken(new AccessToken(sharedPreferences.getString("OAUTH_TOKEN", ""), sharedPreferences.getString("OAUTH_VERIFIER", "")));

                new GetTwitterFollowers().execute();

                return true;
            }
        });

        btnTwitterLogin = (Button) getView().findViewById(R.id.btnTwitterLogin);
        btnTwitterLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                loginToTwitter();
            }
        });

        btnTwitterLogOut = (Button) getView().findViewById(R.id.btnTwitterLogOut);
        btnTwitterLogOut.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                twitterLogOut();
            }
        });
    }

    public void loginToTwitter() {
        if (!isTwitterLoggedInAlready()) {
            Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        wvTwitterLogin.loadUrl(TwitterFactory.getSingleton().getOAuthRequestToken(TWITTER_CALLBACK_URL).getAuthenticationURL());

                        getActivity().runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                goToTwitterLogin();
                            }
                        });
                    } catch (Exception e) {
                        e.printStackTrace();
                        Toast.makeText(getActivity(), getString(R.string.error_already_logged_twitter), Toast.LENGTH_LONG).show();
                    }
                }
            });

            thread.start();
        } else
            Toast.makeText(getActivity(), getString(R.string.error_already_logged_twitter), Toast.LENGTH_LONG).show();
    }

    private void goToTwitterLogin() {
        btnTwitterLogin.setVisibility(View.GONE);
        btnTwitterLogOut.setVisibility(View.GONE);
        wvTwitterLogin.setVisibility(View.VISIBLE);
    }

    private boolean isTwitterLoggedInAlready() {
        return sharedPreferences.getBoolean("KEY_TWITTER_LOGIN", false);
    }

    private void twitterLogOut() {
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putBoolean("KEY_TWITTER_LOGIN", false);
        editor.commit();
    }

    private class GetTwitterFollowers extends AsyncTask<Void, Void, Void> {
        @Override
        protected Void doInBackground(Void... v) {
            try {
                iDs = TwitterFactory.getSingleton().getFollowersIDs(-1);
            } catch (TwitterException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            iDs.getIDs();
        }
    }
}

当我在用户登录后调用 TwitterFactory.getSingleton().getFollowersIDs(-1) 时,我收到了这个异常:

java.io.IOException: No authentication challenges found

我绝望了,我花了一周时间试图解决这个问题,但是我在 StackOverflow 和其他网站上找到的所有线程都无法正常工作。系统时钟没问题,我试过ConfigurationBuilder等解决方案,但没有运气。有人可以帮帮我吗?

非常感谢!

【问题讨论】:

    标签: java android twitter android-studio twitter4j


    【解决方案1】:

    您是否尝试过使用 TwitterFactory 中的非单例实例?

    Uri    uri      = Uri.parse(url);
    String token    = uri.getQueryParameter("OAUTH_TOKEN");
    String verifier = uri.getQueryParameter("OAUTH_VERIFIER");
    
    Twitter twitter = TwitterFactory.getInstance(
            new AccessToken(token,verifier);
    
    twitter.getFollowers(-1);
    

    【讨论】:

      猜你喜欢
      • 2012-10-14
      • 1970-01-01
      • 2013-07-05
      • 2013-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-27
      • 2013-09-05
      相关资源
      最近更新 更多