简体   繁体   English

401验证错误(Twitter4j)

[英]401 Authentication Error(Twitter4j )

I've tried using twitter4j to enable a user to make posts to twitter, but sadly I continuously got the 401 error. 我尝试使用twitter4j来使用户向Twitter发布帖子,但可悲的是,我不断遇到401错误。 I've triple checked my credentials and requested for new keys but that bore no fruit. 我已经三重检查了我的凭据并要求提供新的密钥,但是没有结果。 Here's my code: 这是我的代码:

  public class LoginFragment extends Fragment {
    ImageView login;
    Twitter twitter;
    RequestToken requestToken = null;
    AccessToken accessToken;
    String oauth_url,oauth_verifier,profile_url;
    Dialog auth_dialog;
    WebView web;
    SharedPreferences pref;
    ProgressDialog progress;
    Bitmap bitmap;
    String TAG = LoginFragment.class.getSimpleName();
    @Override
    public View onCreateView(LayoutInflater inflater,ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.login_fragment, container, false);
        login = (ImageView)view.findViewById(R.id.login);
        pref = getActivity().getPreferences(0);


        ConfigurationBuilder builder = new ConfigurationBuilder();
        builder.setDebugEnabled(true);
        builder.setOAuthConsumerKey(pref.getString("CONSUMER_KEY", ""));
        builder.setOAuthConsumerSecret(pref.getString("CONSUMER_SECRET",""));
        builder.setOAuthAccessToken(null);
        builder.setOAuthAccessTokenSecret(null);


        TwitterFactory factory = new TwitterFactory(builder.build());
        twitter = factory.getInstance();

//        twitter = new TwitterFactory().getInstance();
//        Toast.makeText(getActivity(),"Key is " + pref.getString("CONSUMER_KEY","") + "Secret is " + pref.getString("CONSUMER_SECRET",""),Toast.LENGTH_LONG).show();
//        twitter.setOAuthConsumer(pref.getString("CONSUMER_KEY", ""), pref.getString("CONSUMER_SECRET", ""));
        login.setOnClickListener(new LoginProcess());
        return view;
    }
    private class LoginProcess implements OnClickListener {

        @Override
        public void onClick(View v) {
            Toast.makeText(getActivity(),"Pressed",Toast.LENGTH_LONG).show();
            // TODO Auto-generated method stub
            new TokenGet().execute();
        }}
    private class TokenGet extends AsyncTask<String, String, String> {

        @Override
        protected String doInBackground(String... args) {
            try {
                //Toast.makeText(getActivity(),"Do in Background",Toast.LENGTH_LONG).show();
//                requestToken = twitter.getOAuthRequestToken();
//                Log.d(TAG, "Sheldon the RequestToken is " + requestToken);
//                oauth_url = requestToken.getAuthorizationURL();


                requestToken = twitter.getOAuthRequestToken("http://tweetie.com");
                Log.d(TAG, "Sheldon the RequestToken is " + requestToken);
                oauth_url = requestToken.getAuthorizationURL();

                //End
            } catch (TwitterException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            Log.d(TAG,"Sheldon the OAUTH URL is " +  oauth_url);
            return oauth_url;

        }

        @Override
        protected void onPostExecute(String oauth_url) {

            if(oauth_url != null){
                Log.e("URL", oauth_url);
                auth_dialog = new Dialog(getActivity());
                auth_dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
                auth_dialog.setContentView(R.layout.auth_dialog);
                web = (WebView)auth_dialog.findViewById(R.id.webv);
                web.getSettings().setJavaScriptEnabled(true);
                web.loadUrl(oauth_url);
                web.setWebViewClient(new WebViewClient() {
                    boolean authComplete = false;
                    @Override
                    public void onPageStarted(WebView view, String url, Bitmap favicon){
                        super.onPageStarted(view, url, favicon);
                    }
                    @Override
                    public void onPageFinished(WebView view, String url) {
                        super.onPageFinished(view, url);
                        if (url.contains("oauth_verifier") && authComplete == false){
                            authComplete = true;
                            Log.e("Url",url);
                            Uri uri = Uri.parse(url);
                            oauth_verifier = uri.getQueryParameter("oauth_verifier");
                            auth_dialog.dismiss();
                            new AccessTokenGet().execute();
                        }else if(url.contains("denied")){
                            auth_dialog.dismiss();
                            Toast.makeText(getActivity(), "Sorry !, Permission Denied", Toast.LENGTH_SHORT).show();
                        }
                    }
                });
                auth_dialog.show();
                auth_dialog.setCancelable(true);
            }else{
                Toast.makeText(getActivity(), "Sorry !, Network Error or Invalid Credentials", Toast.LENGTH_SHORT).show();
            }
        }
    }
    private class AccessTokenGet extends AsyncTask<String, String, Boolean> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            progress = new ProgressDialog(getActivity());
            progress.setMessage("Fetching Data ...");
            progress.setProgressStyle(ProgressDialog.STYLE_SPINNER);
            progress.setIndeterminate(true);
            progress.show();
        }
        @Override
        protected Boolean doInBackground(String... args) {
            try {
                accessToken = twitter.getOAuthAccessToken(requestToken, oauth_verifier);
                SharedPreferences.Editor edit = pref.edit();
                edit.putString("ACCESS_TOKEN", accessToken.getToken());
                edit.putString("ACCESS_TOKEN_SECRET", accessToken.getTokenSecret());
                User user = twitter.showUser(accessToken.getUserId());
                profile_url = user.getOriginalProfileImageURL();
                edit.putString("NAME", user.getName());
                edit.putString("IMAGE_URL", user.getOriginalProfileImageURL());
                edit.commit();
            } catch (TwitterException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return true;
        }
        @Override
        protected void onPostExecute(Boolean response) {
            if(response){
                progress.hide();
                Fragment profile = new ProfileFragment();
                FragmentTransaction ft = getActivity().getFragmentManager().beginTransaction();
                ft.replace(R.id.content_frame, profile);
                ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                ft.addToBackStack(null);
                ft.commit();
            }
        }
    }
}

I had a similar error using twitter4j, version 3.0.x. 使用twitter4j 3.0.x版时,我遇到了类似的错误。

I fixed it by updating twitter4j to version 4.0.0. 我通过将twitter4j更新到版本4.0.0修复了它。

Hope this will help somebody. 希望这会帮助到别人。

Fill up the "Callback URL" field and "Organization URL" in your Twitter settings dev account. 在您的Twitter设置开发帐户中填写“回调URL”字段和“组织URL”。 But Dont enable callback locking, This worked like a gem for me! 但是不要启用回调锁定,这对我来说就像是一颗宝石!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM