Twitter OAuth 身份验证回调返回空值 - Twitter4J.



首先,我已经在这个网站上查看了至少两次有关该主题的每个问题,但我找不到任何东西。

我使用了一些教程来创建一个简单的Twitter客户端,其中包含Twitter4J,该客户端仅提供OAuth登录。该代码将用户带到浏览器,在那里接受 OAuth,然后浏览器将我返回到我的应用程序。

但是,我无法使用方法获取OAuth Access令牌 getOAuthAccessToken() ,在方法onNewIntent(Intent intent)中,日志显示错误只是Twitter Login Error > null

我尝试使用onResume,onNewIntent将getOAuthAccessToken()的位置更改为,我已经将活动设置为单个实例和单个任务,并且我已经正确设置了日期和时间。如果有人可以帮助我在从浏览器返回时从 Twitter 获取访问令牌,那就太好了,谢谢!这是我的代码:

public class mAppActivity extends Activity {
    // constants
    static final String TWITTER_CONSUMER_KEY = "";
    static final String TWITTER_CONSUMER_SECRET = 
            "";
    // preference constants
    static final 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 = "isTwitterLoggedIn";
    static final String TWITTER_CALLBACK_URL = "callback://x-oauthflow-twitter";
    // Twitter OAuth URLS
    static final String URL_TWITTER_AUTH = "auth_url";
    static final String URL_TWITTER_OAUTH_VERIFIER = "oauth_verifier";
    static final String URL_TWITTER_OAUTH_TOKEN = "oauth_token";
    // Buttons
    Button btnLoginTwitter;
    Button btnUpdateStatus;
    Button btnLogoutTwitter;
    // EditText for update
    EditText txtUpdate;
    // lbl update
    TextView lblUpdate;
    TextView lblUserName;
    // ProgressDialog
    ProgressDialog pdialog;
    // Twitter 
    private static Twitter twitter;
    private static RequestToken requestToken;
    private AccessToken accessToken;
    // SharedPreferences
    private static SharedPreferences mSharedPreferences;
    // Internet ConnectionDetector
    private ConnectionDetector cd;
    // AlertDialogManager
    AlertDialogManager alert = new AlertDialogManager();
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_app_m);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        cd = new ConnectionDetector(getApplicationContext());
        // check if connected to Internet
        if (!cd.isConnectingToInternet()) {
            // show error message
            alert.showAlertDialog(mAppActivity.this, 
                    "Internet Connection Error", 
                    "Please connect to working Internet connection", 
                    false);
            // stop code by returning
            return;
        }
        // check if Twitter keys are set
        if (TWITTER_CONSUMER_KEY.trim().length() == 0 ||
            TWITTER_CONSUMER_SECRET.trim().length() == 0) {
            // show error message
            alert.showAlertDialog(mAppActivity.this, 
                    "Twitter OAuth Tokens Error",
                    "Please set your Twitter OAuth tokens first!", 
                    false);
            // stop code by returning
            return;
        }
        // All UI elements
        btnLoginTwitter = (Button) findViewById(R.id.btnLoginTwitter);
        btnUpdateStatus = (Button) findViewById(R.id.btnUpdateStatus);
        btnLogoutTwitter = (Button) findViewById(R.id.btnLogoutTwitter);
        txtUpdate = (EditText) findViewById(R.id.txtUpdateStatus);
        lblUpdate = (TextView) findViewById(R.id.lblUpdate);
        lblUserName = (TextView) findViewById(R.id.lblUserName);
        // SharedPreferences
        mSharedPreferences = getApplicationContext()
                            .getSharedPreferences("MyPrefs", 0);
        /**
         * Twitter login button click event 
         * will call loginToTwitter() function 
         */
        btnLoginTwitter.setOnClickListener(new View.OnClickListener() {
            @Override 
            public void onClick(View arg0) {
                // Call Twitter login function
                loginToTwitter();
            }
        });
        /**
         * Twitter logout button click 
         */
        btnLogoutTwitter.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                // call Twitter logout function
                logoutFromTwitter();
            }
        });            
    }
    /**
     * Function to log in to Twitter
     */
    private void loginToTwitter() {
        // Check if already logged in
        if (!isTwitterLoggedInAlready()) {
            ConfigurationBuilder builder = new ConfigurationBuilder();
            builder.setUseSSL(true);
            builder.setOAuthConsumerKey(TWITTER_CONSUMER_KEY);
            builder.setOAuthConsumerSecret(TWITTER_CONSUMER_SECRET);
            Configuration configuration = builder.build();
            TwitterFactory factory = new TwitterFactory(configuration);
            twitter = factory.getInstance();
            Thread thread = new Thread(new Runnable(){
                @Override
                public void run() {
                    try {
                        requestToken = twitter
                                .getOAuthRequestToken(TWITTER_CALLBACK_URL);
                        mAppActivity.this.startActivity(new Intent(Intent.ACTION_VIEW, Uri
                                .parse(requestToken.getAuthenticationURL())));
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
            thread.start();
        } else {
            // user is already logged in into Twitter
            Toast.makeText(getApplicationContext(),
                    "Already Logged into Twitter", Toast.LENGTH_LONG).show();
        }
    }
    /**
     * Checks if user is already logged in using Twitter login 
     * fetched from Shared Preferences
     */
    private boolean isTwitterLoggedInAlready() {
        // return Twitter login status from SharedPreferences
        return mSharedPreferences.getBoolean(PREF_KEY_TWITTER_LOGIN, false); 
    }
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        /** 
         * This if condition is tested user is 
         * redirected from Twitter page. Parse the URI to OAuth Verifier
         */
        Uri uri = intent.getData();
        Toast.makeText(getApplicationContext(),
                uri.toString(), Toast.LENGTH_LONG).show(); 
        if (uri != null && uri.toString().startsWith(TWITTER_CALLBACK_URL)) {   
            // OAuth verifier 
            final String verifier = uri
                    .getQueryParameter(URL_TWITTER_OAUTH_VERIFIER);
            try {                           
                // get the access token
                        mAppActivity.this.accessToken = 
                                twitter.getOAuthAccessToken(
                                requestToken);
                        // SharedPreferences
                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());
                // hide login button
                btnLoginTwitter.setVisibility(View.GONE);
                // show update Twitter
                lblUpdate.setVisibility(View.VISIBLE);
                txtUpdate.setVisibility(View.VISIBLE);
                btnUpdateStatus.setVisibility(View.VISIBLE);
                btnLogoutTwitter.setVisibility(View.VISIBLE);
                // get user details from Twitter
                // for now only username is being gotten
                long userID = accessToken.getUserId();
                User user = twitter.showUser(userID);
                String username = user.getName();
                // display in xml ui 
                lblUserName.setText(Html.fromHtml("<b>Welcome " + username + "</b>"));
            } catch (Exception e) {
                // catch log for login errors
                Log.e("Twitter Login Error", "> " + e.getMessage());
            }                
        }
    }
}

清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.messagingapplication"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />
    <!-- Permission - Internet Connect -->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- Network State Permissions -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.messagingapplication.mAppActivity"
            android:label="@string/app_name"
            android:launchMode="singleTask">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data
                    android:host="x-oauthflow-twitter"
                    android:scheme="callback" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.example.messagingapplication.MAppMainActivity"
            android:label="@string/title_activity_mapp_main" >
        </activity>
        <activity
            android:name="com.example.messagingapplication.Teest"
            android:label="@string/title_activity_teest" >
        </activity>
    </application>
</manifest>

需要传入 OAuth 验证程序字符串,该字符串已从查询参数中检索到,但尚未正确传递给 getOAuthAccessToken 方法:

        // OAuth verifier 
        final String verifier = uri
                .getQueryParameter(URL_TWITTER_OAUTH_VERIFIER);
        try {                           
            // get the access token
                    mAppActivity.this.accessToken = 
                            twitter.getOAuthAccessToken(
                            requestToken,
                            verifier); // You forgot to pass this in.

我解决了同样的问题。 它阻止了您的用户界面。 您只需在异步任务中尝试一下。 您只需在异步任务中调用该代码即可。

requestToken = twitter.getOAuthRequestToken(TWITTER_CALLBACK_URL);或

喜欢这个

class TwitterLogin extends AsyncTask<String, String, String> 
    {
        @Override
        protected String doInBackground(String... params) 
        {
            // TODO Auto-generated method stub
            Uri uri = getIntent().getData();                
            if (uri != null && uri.toString().startsWith(TWITTER_CALLBACK_URL))
            {
                String verifier = uri.getQueryParameter(URL_TWITTER_OAUTH_VERIFIER);
                try 
                {
                    AccessToken accessToken = twitter.getOAuthAccessToken(requestToken, verifier);
                    // Shared Preferences
                    Editor e = loginPrefs.edit();
                    e.putString(PREF_KEY_OAUTH_TOKEN, accessToken.getToken());
                    e.putString(PREF_KEY_OAUTH_SECRET,accessToken.getTokenSecret());
                    e.putBoolean(PREF_KEY_TWITTER_LOGIN, true);
                    e.commit();
                    Log.e("Twitter OAuth Token", "> " + accessToken.getToken());

                    long userID = accessToken.getUserId();
                    User user = twitter.showUser(userID);
                    String username = user.getName();
                    Log.e("UserID: ", "userID: "+userID+""+username);
                    Log.v("Welcome:","Thanks:"+Html.fromHtml("<b>Welcome " + username + "</b>"));
                } 
                catch (Exception e) 
                {
                    Log.e("Twitter Login Error", "> " + e.getMessage());
                }
            }
            return null;
        }
        @Override
        protected void onPostExecute(String result) 
        {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
        }
        @Override
        protected void onPreExecute() 
        {
            // TODO Auto-generated method stub
            super.onPreExecute();
        }
    }

问题是你在移动设备而不是模拟器中运行应用程序,你需要添加线程才能从推特回调获得响应

最新更新