Android 与 Twitter 的连接 - 从 twitter 获取空答案 [英] Android Connection With Twitter - Get null answer from twitter

查看:42
本文介绍了Android 与 Twitter 的连接 - 从 twitter 获取空答案的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在连接到 Twitter 时遇到了 %&·$5#~€ 问题.(代码贴在下面)

I have a %&·$5#~€ problem with the connection to twitter. (The code is post below this)

首先,我已经完成所有配置(twitter 键、清单中的回调等),然后调用 twitter 并打开浏览器,然后登录 twitter 并接受应用程序,然后浏览器返回应用程序并尝试从 twitter 获得响应,但我得到 NULL 作为答案.

First, I have all configured (twitter keys, callback in the manifest, etc), then I do the call to twitter and get browser open, then I signIn in twitter and I accept the application, then the browser returns to application and try to get the response from twitter, but I get NULL as answer.

谁能帮我看看这是怎么回事?

Can anyone help me to find what's going on with this?

问候

PD:我遵循本教程:http://www.androidhive.info/2012/09/android-twitter-oauth-connect-tutorial/

PD 2 : 有些人认为问题是手机的日期和时间 (https://dev.twitter.com/discussions/374),但我改变了它并且不起作用

PD 2 : Some people thinks that the problem is the date&time of the phone (https://dev.twitter.com/discussions/374), but I changed that and doesn't work

import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.User;
import twitter4j.auth.AccessToken;
import twitter4j.auth.RequestToken;
import twitter4j.conf.Configuration;
import twitter4j.conf.ConfigurationBuilder;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.os.StrictMode;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.Toast;


@SuppressLint("NewApi")
public class TwitterActivity extends Activity {

    Intent TWITTER_INTENT = null;
    //TWITTER THINGS
        static String TWITTER_CONSUMER_KEY = "CONSUMER_KEY_HERE";
        static String TWITTER_CONSUMER_SECRET = "CONSUMER_SECRET_HERE";
        static final String TWITTER_CALLBACK_URL = "oauth://t4jsample";

        // Twitter oauth urls
        static final String URL_TWITTER_AUTH = "https://api.twitter.com/oauth/authorize";
        static final String URL_TWITTER_OAUTH_VERIFIER = "https://api.twitter.com/oauth/access_token";
        static final String URL_TWITTER_OAUTH_TOKEN = "https://api.twitter.com/oauth/request_token";

        // Progress dialog
        ProgressDialog pDialog;

        // Twitter
        public static Twitter twitter;
        public static String twitter_token, twitter_secret; 


        // Internet Connection detector
        private ConnectionDetector cd;

        // Alert Dialog Manager
        AlertDialogManager alert = new AlertDialogManager();



    // Preference Constants
    static String PREFERENCE_NAME = "twitter_oauth";
    static final String PREF_KEY_OAUTH_TOKEN = "oauth_token";
    static final String PREF_KEY_OAUTH_SECRET = "oauth_token_secret";
    static final String PREF_KEY_TWITTER_LOGIN = "isTwitterLogedIn";



    // Twitter

    private static RequestToken requestToken;

    // Shared Preferences
    private static SharedPreferences mSharedPreferences;



    @SuppressLint("NewApi")
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_twitter);
        if (Build.VERSION.SDK_INT > 9) {
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);
        }
        //setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

        cd = new ConnectionDetector(getApplicationContext());

        // Check if Internet present
        if (!cd.isConnectingToInternet()) {
            // Internet Connection is not present
            alert.showAlertDialog(TwitterActivity.this, "Internet Connection Error","Please connect to working Internet connection", false);
            // stop executing code by return
            return;
        }

        // Check if twitter keys are set
        if(TWITTER_CONSUMER_KEY.trim().length() == 0 || TWITTER_CONSUMER_SECRET.trim().length() == 0){
            // Internet Connection is not present
            alert.showAlertDialog(TwitterActivity.this, "Twitter oAuth tokens", "Please set your twitter oauth tokens first!", false);
            // stop executing code by return
            return;
        }


        // Shared Preferences
        mSharedPreferences = getApplicationContext().getSharedPreferences("MyPref", 0);



        ImageView TW = (ImageView) findViewById(R.id.twitter_boton);
        TW.setClickable(true);
        TW.setOnClickListener(new OnClickListener(){
            public void onClick(View v){
                loginToTwitter();
            }
        });


        /** This if conditions is tested once is
         * redirected from twitter page. Parse the uri to get oAuth
         * Verifier
         * */
        if (!isTwitterLoggedInAlready()) {
            Uri uri = getIntent().getData();
            if (uri != null && uri.toString().startsWith(TWITTER_CALLBACK_URL)) {
                // oAuth verifier
                String verifier = uri.getQueryParameter(URL_TWITTER_OAUTH_VERIFIER);

                try {
                    // Get the access token
                    AccessToken accessToken = twitter.getOAuthAccessToken(
                            requestToken, verifier);

                    // Shared Preferences
                    Editor e = mSharedPreferences.edit();

                    // After getting access token, access token secret
                    // store them in application preferences
                    e.putString(PREF_KEY_OAUTH_TOKEN, accessToken.getToken());
                    e.putString(PREF_KEY_OAUTH_SECRET,
                            accessToken.getTokenSecret());
                    // Store login status - true
                    e.putBoolean(PREF_KEY_TWITTER_LOGIN, true);
                    e.commit(); // save changes

                    Log.e("Twitter OAuth Token", "> " + accessToken.getToken());



                    // Getting user details from twitter
                    // For now i am getting his name only
                    long userID = accessToken.getUserId();
                    User user = twitter.showUser(userID);
                    String username = user.getName();
                    Log.d("nombre",username);
                } catch (Exception e) {
                    // Check log for login errors
                    Log.e("Twitter Login Error", "> " + e.toString());
                    Log.e("Twitter Login Error", "> " + e.getMessage());
                }
            }
        }

    }

    /**
     * Function to login twitter
     * */
    private void loginToTwitter() {
        // Check if already logged in
        if (!isTwitterLoggedInAlready()) {
            ConfigurationBuilder builder = new ConfigurationBuilder();
            builder.setOAuthConsumerKey(TWITTER_CONSUMER_KEY);
            builder.setOAuthConsumerSecret(TWITTER_CONSUMER_SECRET);
            Configuration configuration = builder.build();

            TwitterFactory factory = new TwitterFactory(configuration);
            twitter = factory.getInstance();

            if(!(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)) {
                try {
                    requestToken = twitter.getOAuthRequestToken(TWITTER_CALLBACK_URL);
                    this.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(requestToken.getAuthenticationURL())));
                } catch (TwitterException e) {
                    e.printStackTrace();
                }
            }
            else
            {
                new Thread(new Runnable() {
                    public void run() {
                        try {   
                            requestToken = twitter.getOAuthRequestToken(TWITTER_CALLBACK_URL);
                            TwitterActivity.this.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(requestToken.getAuthenticationURL())));
                        } catch (TwitterException e) {
                            e.printStackTrace();
                        }
                    }
                }).start();
            }
        } else {
            // user already logged into twitter
            Toast.makeText(getApplicationContext(),
                    "Already Logged into twitter", Toast.LENGTH_LONG).show();
        }
    }

    /**
     * Function to update status
     * */
    class updateTwitterStatus extends AsyncTask<String, String, String> {

        /**
         * Before starting background thread Show Progress Dialog
         * */
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(TwitterActivity.this);
            pDialog.setMessage("Updating to twitter...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
            pDialog.show();
        }

        /**
         * getting Places JSON
         * */
        protected String doInBackground(String... args) {
            Log.d("Tweet Text", "> " + args[0]);
            String status = args[0];
            try {
                ConfigurationBuilder builder = new ConfigurationBuilder();
                builder.setOAuthConsumerKey(TWITTER_CONSUMER_KEY);
                builder.setOAuthConsumerSecret(TWITTER_CONSUMER_SECRET);

                // Access Token
                String access_token = mSharedPreferences.getString(PREF_KEY_OAUTH_TOKEN, "");
                // Access Token Secret
                String access_token_secret = mSharedPreferences.getString(PREF_KEY_OAUTH_SECRET, "");

                AccessToken accessToken = new AccessToken(access_token, access_token_secret);
                Twitter twitter = new TwitterFactory(builder.build()).getInstance(accessToken);

                // Update status
                twitter4j.Status response = twitter.updateStatus(status);

                Log.d("Status", "> " + response.getText());
            } catch (TwitterException e) {
                // Error in updating status
                Log.d("Twitter Update Error", e.getMessage());
            }
            return null;
        }

        /**
         * After completing background task Dismiss the progress dialog and show
         * the data in UI Always use runOnUiThread(new Runnable()) to update UI
         * from background thread, otherwise you will get error
         * **/
        protected void onPostExecute(String file_url) {
            // dismiss the dialog after getting all products
            pDialog.dismiss();
            // updating UI from Background Thread
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(getApplicationContext(),
                            "Status tweeted successfully", Toast.LENGTH_SHORT)
                            .show();
                    // Clearing EditText field

                }
            });
        }

    }



    /**
     * Check user already logged in your application using twitter Login flag is
     * fetched from Shared Preferences
     * */
    private boolean isTwitterLoggedInAlready() {
        // return twitter login status from Shared Preferences
        return mSharedPreferences.getBoolean(PREF_KEY_TWITTER_LOGIN, false);
    }

    protected void onResume() {
        super.onResume();
    }

}

推荐答案

在花了几个小时阅读文档后(我现在没有眼睛),当我尝试获取 access_token 时,我称之为:

After spending hours reading documentation (I don't have eyes now), when I try to get the access_token I call this:

// Get the access token
AccessToken accessToken = twitter.getOAuthAccessToken(requestToken, verifier);

我通过了验证者(这是 pin pass,但 pin pass 不再使用)并且他是 null 因为不再用于 twitter,那么我只需要用这个重写它:

I pass the verifier( which is the pin pass, but the pin pass isn't use anymore ) and he is null because doesn't use anymore for twitter, then I only need to rewrite that with this:

// Get the access token
AccessToken accessToken = twitter.getOAuthAccessToken(requestToken);

获取access_token只需要requestToken.

Only need the requestToken for get the access_token.

我希望这能帮助任何有同样问题的人.

I hope this helping anyone who have the same problem.

问候.

这篇关于Android 与 Twitter 的连接 - 从 twitter 获取空答案的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆