簡體   English   中英

Twitter OAuth身份驗證回調返回空-Twitter4J

[英]Twitter OAuth Authentication Callback Returning Null - Twitter4J

首先,我至少兩次瀏覽了該站點上與該主題相關的每個問題,但是我什么都找不到。

我使用了一些教程,使用Twitter4J創建一個僅提供OAuth登錄的簡單Twitter客戶端。 該代碼將用戶帶到瀏覽器,在該瀏覽器中接受OAuth,然后瀏覽器將我返回到我的應用。

但是,我無法使用onNewIntent(Intent intent)方法中的getOAuthAccessToken()方法獲取OAuth訪問令牌,並且日志顯示錯誤僅是Twitter Login Error > null

我嘗試使用onResume,onNewIntent將getOAuthAccessToken()的位置更改為on,將Activity設置為singleInstance和singleTask,並正確設置了日期和時間。 如果有人可以幫助我從瀏覽器返回后從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.

我解決了同樣的問題。 它會阻塞您的用戶界面。 你只要在asynctask中嘗試一下。 您只需在asynctask中調用該代碼即可。

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();

        }
    }

我要在移動設備而非模擬器上運行應用程序的問題是,您需要添加Thread才能從twitter CallBack獲得響應

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM