Android Twitter集成中的非法状态异常

Android Twitter集成中的非法状态异常,android,twitter,twitter4j,Android,Twitter,Twitter4j,我正在尝试将twitter集成到Android中,并遵循Twitter4j库。我已经给出了正确的使用者密钥和密码,并在清单中添加了所需的行。在twitter中添加了回调URL。起初,我能够成功登录,但后来它开始抛出非法状态Exception MainActivity.java: package com.example.feb_1twitterintegration; import android.os.Bundle; import android.annotation.SuppressLint

我正在尝试将twitter集成到Android中,并遵循Twitter4j库。我已经给出了正确的使用者密钥和密码,并在清单中添加了所需的行。在twitter中添加了回调URL。起初,我能够成功登录,但后来它开始抛出非法状态Exception

MainActivity.java:

package com.example.feb_1twitterintegration;

import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.view.Menu;

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.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.pm.ActivityInfo;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.StrictMode;
import android.text.Html;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {
    static String TWITTER_CONSUMER_KEY = "XXXXXX";
    static String TWITTER_CONSUMER_SECRET = "XXXXXX";
    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";
    static final String TWITTER_CALLBACK_URL = "oauth://t4jsample";
    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";
    ProgressDialog pDialog;
    private static Twitter twitter;
    private static RequestToken requestToken = new RequestToken(PREF_KEY_OAUTH_TOKEN, PREF_KEY_OAUTH_SECRET);
    private static SharedPreferences mSharedPreferences;
    private ConnectionDetector cd;
    AlertDialogManager alert = new AlertDialogManager();
    EditText sts;

    @SuppressLint("NewApi")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        if (android.os.Build.VERSION.SDK_INT > 9) {
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                    .permitAll().build();
            StrictMode.setThreadPolicy(policy);
        }
        cd = new ConnectionDetector(getApplicationContext());
        if (!cd.isConnectingToInternet()) {
            alert.showAlertDialog(MainActivity.this,
                    "Internet Connection Error",
                    "Please connect to working Internet connection", false);
            return;
        }
        // Check if twitter keys are set
        if (TWITTER_CONSUMER_KEY.trim().length() == 0
                || TWITTER_CONSUMER_SECRET.trim().length() == 0) {
            alert.showAlertDialog(MainActivity.this, "Twitter oAuth tokens",
                    "Please set your twitter oauth tokens first!", false);
            return;
        }
        mSharedPreferences = getApplicationContext().getSharedPreferences(
                "MyPref", 0);

        findViewById(R.id.login).setOnClickListener(
                new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        loginToTwitter();
                    }
                });
        findViewById(R.id.tweet).setOnClickListener(
                new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        sts = (EditText) findViewById(R.id.editText1);
                        String status = sts.getText().toString();
                        if (status.trim().length() > 0) {
                            new updateTwitterStatus().execute(status);
                        } else {
                            Toast.makeText(getApplicationContext(),
                                    "Please enter status message",
                                    Toast.LENGTH_SHORT).show();
                        }
                    }
                });
        if (!isTwitterLoggedInAlready()) {
            final String verifier;
            Uri uri = getIntent().getData();
            if (uri != null && uri.toString().startsWith(TWITTER_CALLBACK_URL)) {
                //verifier = uri.getQueryParameter(URL_TWITTER_OAUTH_VERIFIER);
                verifier = uri.getQueryParameter(URL_TWITTER_OAUTH_VERIFIER);
                System.out.println(verifier);
                try {
                    System.out.println("Request token: "+requestToken.getAuthenticationURL());
                    requestToken = twitter.getOAuthRequestToken(TWITTER_CALLBACK_URL);
                    System.out.println("after login");
                    AccessToken accessToken = twitter.getOAuthAccessToken(requestToken);
                    System.out.println(accessToken.getToken());
                    // Shared Preferences
                    Editor e = mSharedPreferences.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());
                    findViewById(R.id.login).setVisibility(View.GONE);
                    findViewById(R.id.editText1).setVisibility(View.VISIBLE);
                    findViewById(R.id.tweet).setVisibility(View.VISIBLE);
                    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) {
                    Toast.makeText(MainActivity.this, e.getMessage(), 1000)
                            .show();
                    Log.e("Twitter Login Error", "> " + e.getMessage());
                    e.printStackTrace();
                }

            }
        }
    }

    private void loginToTwitter() {
        if (!isTwitterLoggedInAlready()) {
            new Thread() {
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    super.run();
                    ConfigurationBuilder builder = new ConfigurationBuilder();
                    builder.setOAuthConsumerKey(TWITTER_CONSUMER_KEY);
                    builder.setOAuthConsumerSecret(TWITTER_CONSUMER_SECRET);
                    builder.setUseSSL(true);
                    builder.setApplicationOnlyAuthEnabled(true);

                       /*configurationBuilder.setOAuth2TokenType(getOAuth2Token().getTokenType());
                       configurationBuilder.setOAuth2AccessToken(getOAuth2Token().getAccessToken());*/
                    Configuration configuration = builder.build();
                    TwitterFactory factory = new TwitterFactory(configuration);
                    twitter4j.Twitter twitter = factory.getInstance();
                    try {
                        System.out.println("Request token: "+requestToken.getAuthenticationURL());

                        requestToken = twitter.getOAuthRequestToken(TWITTER_CALLBACK_URL);
                        System.out.println("Req Token: "+requestToken);
                        MainActivity.this.startActivity(new Intent(
                                Intent.ACTION_VIEW, Uri.parse(requestToken
                                        .getAuthenticationURL())));
                    } catch (TwitterException e) {
                        e.printStackTrace();
                    }
                }
            }.start();
        } else {
            Toast.makeText(getApplicationContext(),
                    "Already Logged into twitter", Toast.LENGTH_LONG).show();
        }
    }

    private boolean isTwitterLoggedInAlready() {
        System.out.println("Request Token in already logged in twitter: "+requestToken);
        return mSharedPreferences.getBoolean(PREF_KEY_TWITTER_LOGIN, false);
    }

    class updateTwitterStatus extends AsyncTask<String, String, String> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(MainActivity.this);
            pDialog.setMessage("Updating to twitter...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
            pDialog.show();
        }

        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;
        }

        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
                    sts.setText("");
                }
            });
        }
    }
}
02-03 14:01:54.407: D/Network(21178): NETWORKnAME: WIFI
02-03 14:01:54.407: I/System.out(21178): Request Token in already logged in twitter: OAuthToken{token='oauth_token', tokenSecret='oauth_token_secret', secretKeySpec=null}
02-03 14:01:54.447: D/libEGL(21178): loaded /system/lib/egl/libGLES_android.so
02-03 14:01:54.467: D/libEGL(21178): loaded /system/lib/egl/libEGL_adreno200.so
02-03 14:01:54.487: D/libEGL(21178): loaded /system/lib/egl/libGLESv1_CM_adreno200.so
02-03 14:01:54.487: D/libEGL(21178): loaded /system/lib/egl/libGLESv2_adreno200.so
02-03 14:01:54.567: I/Adreno200-EGLSUB(21178): <ConfigWindowMatch:2078>: Format RGBA_8888.
02-03 14:01:54.577: D/OpenGLRenderer(21178): Enabling debug mode 0
02-03 14:01:54.627: D/OpenGLRenderer(21178): has fontRender patch
02-03 14:01:54.657: D/OpenGLRenderer(21178): has fontRender patch
02-03 14:01:56.128: I/System.out(21178): Request Token in already logged in twitter: OAuthToken{token='oauth_token', tokenSecret='oauth_token_secret', secretKeySpec=null}
02-03 14:01:56.168: I/System.out(21178): Request token: https://api.twitter.com/oauth/authenticate?oauth_token=oauth_token
02-03 14:01:56.168: W/dalvikvm(21178): threadid=11: thread exiting with uncaught exception (group=0x40aa9228)
02-03 14:01:56.178: E/AndroidRuntime(21178): FATAL EXCEPTION: Thread-65119
02-03 14:01:56.178: E/AndroidRuntime(21178): java.lang.IllegalStateException: OAuth consumer key/secret combination not supplied
02-03 14:01:56.178: E/AndroidRuntime(21178):    at twitter4j.TwitterBaseImpl.getOAuth(TwitterBaseImpl.java:403)
02-03 14:01:56.178: E/AndroidRuntime(21178):    at twitter4j.TwitterBaseImpl.getOAuthRequestToken(TwitterBaseImpl.java:298)
02-03 14:01:56.178: E/AndroidRuntime(21178):    at com.example.feb_1twitterintegration.MainActivity$3.run(MainActivity.java:166)
02-03 14:01:58.741: D/OpenGLRenderer(21178): Flushing caches (mode 0)
02-03 14:01:58.751: D/memalloc(21178): /dev/pmem: Unmapping buffer base:0x52368000 size:3072000 offset:1536000

是否知道是什么原因导致此问题突然出现。在过去的两天里,我一直在研究这个问题,但这个错误不知从何而来。我们将非常感谢您的帮助。提前谢谢

你的错误非常严重。Logcat告诉您:

FATAL EXCEPTION: Thread-65119
02-03 14:01:56.178: E/AndroidRuntime(21178): java.lang.IllegalStateException: OAuth consumer key/secret combination not supplied
您需要将您的
Twitter
对象声明为类变量,因为您只为该对象的一个实例设置使用者密钥和机密密钥,但是当您请求auth令牌时,您会得到一个新的实例,该实例没有设置密钥的配置

私有静态Twitter

然后在
私有void loginToTwitter()
中使用此twitter对象,并将其替换为:

twitter4j.Twitter=factory.getInstance()

twitter=factory.getInstance()

您的twitter对象现在是一个类iVar

下面是我自己实现的一个示例,它应该可以帮助您:

public class TwitterRequestTokenActivity extends Activity {

final String TAG = getClass().getName();

// 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_DENIED = "denied";
static final String URL_TWITTER_OAUTH_TOKEN = "oauth_token";
static final String TWITTER_CALLBACK_URL = "appnameoauth://twitterLogin";

private static Twitter twitter;
private static RequestToken requestToken;
private AccessToken accessToken;

/** Progress */
ProgressDialog mProgressDialog;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    authenticate();
}

@Override
public void onDestroy() {
    super.onDestroy();
}   

/**
 * Called when the OAuthRequestTokenTask finishes (user has authorized the request token).
 * The callback URL will be intercepted here.
 */
@Override
public void onNewIntent(Intent intent) 
{
    super.onNewIntent(intent);
    final Uri uri = intent.getData();
    if (uri != null && uri.toString().startsWith(TWITTER_CALLBACK_URL)) {
        //check if user did cancel the twitter auth
        final String error = uri.getQueryParameter(URL_TWITTER_OAUTH_DENIED);
        if (error==null)
            getTwitterAccessToken(uri);
        else {
            // Login failed
            Toast.makeText(TwitterRequestTokenActivity.this, getString(R.string.twitter_login_failed), Toast.LENGTH_LONG).show();
            //user did not authenticate
            finish();
        }
    } 
    else {
        // Assume error: such as no connection
        Toast.makeText(TwitterRequestTokenActivity.this, getString(R.string.twitter_login_failed), Toast.LENGTH_LONG).show();
        finish();
    }
}

/**
 * Gets our token data once we obtain our accessToken from the asyncTask
 */
private void uploadToken() {
    // upload data to our server
    mProgressDialog = ProgressDialog.show(TwitterRequestTokenActivity.this, getString(R.string.generic_wait), getString(R.string.generic_sync), true, false);
    // Getting user details from twitter
    long userID = accessToken.getUserId();

    //upload code to our server (irrelevant to question)
}

private void getTwitterAccessToken(Uri uri) {
    mProgressDialog = ProgressDialog.show(TwitterRequestTokenActivity.this, getString(R.string.generic_wait), getString(R.string.twitter_logging_in), true, false);
    final String verifier = uri.getQueryParameter(URL_TWITTER_OAUTH_VERIFIER);
    // get the Token from Twitter       
    AsyncTask<Void, Void, Void> tokenTask = new AsyncTask<Void, Void, Void>() {
        @Override
        protected Void doInBackground(Void... params) {
            try {
                TwitterRequestTokenActivity.this.accessToken = twitter.getOAuthAccessToken(requestToken, verifier);
            }
            catch (Exception e) {
                e.printStackTrace();
            }

            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            hideProgress();
            if (TwitterRequestTokenActivity.this.accessToken==null){
                hideProgress();
                finish();                   
            }
            else
                uploadToken();
        }
    };

    tokenTask.execute();
}

/**
 * Starts the oAuth request with our callback URL
 */
private void authenticate() {
    ConfigurationBuilder builder = new ConfigurationBuilder();
    builder.setOAuthConsumerKey(Global.TWITTER_CONSUMER_KEY);
    builder.setOAuthConsumerSecret(Global.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);
                    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(requestToken.getAuthenticationURL())).setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_FROM_BACKGROUND);
                    TwitterRequestTokenActivity.this.startActivity(intent);
                }
                catch (Exception e) {
                    finish();
                }
            }
        });

        thread.start();
}

/**
 * Hides the progress bar
 */
private void hideProgress() {
    try {
        mProgressDialog.dismiss();
    } catch (Exception e) {}
}
公共类TwitterRequestTokenActivity扩展活动{
最后一个字符串标记=getClass().getName();
//Twitter oauth URL
静态最终字符串URL\u TWITTER\u AUTH=“AUTH\u URL”;
静态最终字符串URL\u TWITTER\u OAUTH\u VERIFIER=“OAUTH\u VERIFIER”;
静态最终字符串URL\u TWITTER\u OAUTH\u DENIED=“DENIED”;
静态最终字符串URL\u TWITTER\u OAUTH\u TOKEN=“OAUTH\u TOKEN”;
静态最终字符串TWITTER\u CALLBACK\u URL=“appnameoauth://twitterLogin";
私有静态Twitter;
私有静态RequestToken RequestToken;
专用AccessToken AccessToken;
/**进展*/
进程对话框;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
验证();
}
@凌驾
公共空间{
super.ondestory();
}   
/**
*在OAuthRequestTokenTask完成时调用(用户已授权请求令牌)。
*将在此处拦截回调URL。
*/
@凌驾
公共帐篷(意向)
{
super.onNewIntent(意向);
最终Uri=intent.getData();
if(uri!=null&&uri.toString().startsWith(TWITTER\u CALLBACK\u URL)){
//检查用户是否取消了twitter验证
最终字符串错误=uri.getQueryParameter(URL\u TWITTER\u OAUTH\u拒绝);
如果(错误==null)
getTwitterAccessToken(uri);
否则{
//登录失败
Toast.makeText(TwitterRequestTokenActivity.this、getString(R.string.twitter\u login\u失败)、Toast.LENGTH\u LONG.show();
//用户未进行身份验证
完成();
}
} 
否则{
//假设错误:例如没有连接
Toast.makeText(TwitterRequestTokenActivity.this、getString(R.string.twitter\u login\u失败)、Toast.LENGTH\u LONG.show();
完成();
}
}
/**
*从asyncTask获取accessToken后获取令牌数据
*/
私有void uploadToken(){
//将数据上传到我们的服务器
mProgressDialog=ProgressDialog.show(TwitterRequestTokenActivity.this、getString(R.string.generic\u wait)、getString(R.string.generic\u sync)、true、false);
//从twitter获取用户详细信息
long userID=accessToken.getUserId();
//将代码上传到我们的服务器(与问题无关)
}
私有void getTwitterAccessToken(Uri){
mProgressDialog=ProgressDialog.show(TwitterRequestTokenActivity.this、getString(R.string.generic_wait)、getString(R.string.twitter_logging_in)、true、false);
最终字符串验证器=uri.getQueryParameter(URL\uTwitter\uOAuth\uVerifier);
//从Twitter获取令牌
AsyncTask tokenTask=新建AsyncTask(){
@凌驾
受保护的Void doInBackground(Void…参数){
试一试{
TwitterRequestTokenActivity.this.accessToken=twitter.getOAuthAccessToken(requestToken,验证器);
}
捕获(例外e){
e、 printStackTrace();
}
返回null;
}
@凌驾
受保护的void onPostExecute(void避免){
hideProgress();
if(TwitterRequestTokenActivity.this.accessToken==null){
hideProgress();
完成();
}
其他的
uploadToken();
}
};
tokenTask.execute();
}
/**
*使用回调URL启动oAuth请求
*/
私有void身份验证(){
ConfigurationBuilder=新的ConfigurationBuilder();
setOAuthConsumerKey(Global.TWITTER\u CONSUMER\u KEY);
setOAuthConsumerCret(Global.TWITTER\u CONSUMER\u SECRET);
配置=builder.build();

TwitterFactory=新TwitterFactory(配置); twitter=factory.getInstance(); Thread Thread=新线程(new Runnable(){ @凌驾 公开募捐{ 试一试{ requestToken=twitter.getOAuthRequestToken(twitter\u回调\u URL); Intent Intent=new Intent(Intent.ACTION_视图,Uri.parse(requestToken.getAuthenticationURL()).setFlags(Intent.FLAG_活动_SINGLE_TOP | Intent.FLAG_FROM_BACKGROUND); TwitterRequestTokenActivity.this.startActivity(intent); } 捕获(例外e){ 完成(); } } }); thread.start(); } /** *隐藏进度条 */ 私有void hideProgress(){ 试一试{ mProgressDialog.disclose(); }捕获(例外e){} }
}

此外,您还需要确保此活动在清单中声明为si
public class TwitterRequestTokenActivity extends Activity {

final String TAG = getClass().getName();

// 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_DENIED = "denied";
static final String URL_TWITTER_OAUTH_TOKEN = "oauth_token";
static final String TWITTER_CALLBACK_URL = "appnameoauth://twitterLogin";

private static Twitter twitter;
private static RequestToken requestToken;
private AccessToken accessToken;

/** Progress */
ProgressDialog mProgressDialog;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    authenticate();
}

@Override
public void onDestroy() {
    super.onDestroy();
}   

/**
 * Called when the OAuthRequestTokenTask finishes (user has authorized the request token).
 * The callback URL will be intercepted here.
 */
@Override
public void onNewIntent(Intent intent) 
{
    super.onNewIntent(intent);
    final Uri uri = intent.getData();
    if (uri != null && uri.toString().startsWith(TWITTER_CALLBACK_URL)) {
        //check if user did cancel the twitter auth
        final String error = uri.getQueryParameter(URL_TWITTER_OAUTH_DENIED);
        if (error==null)
            getTwitterAccessToken(uri);
        else {
            // Login failed
            Toast.makeText(TwitterRequestTokenActivity.this, getString(R.string.twitter_login_failed), Toast.LENGTH_LONG).show();
            //user did not authenticate
            finish();
        }
    } 
    else {
        // Assume error: such as no connection
        Toast.makeText(TwitterRequestTokenActivity.this, getString(R.string.twitter_login_failed), Toast.LENGTH_LONG).show();
        finish();
    }
}

/**
 * Gets our token data once we obtain our accessToken from the asyncTask
 */
private void uploadToken() {
    // upload data to our server
    mProgressDialog = ProgressDialog.show(TwitterRequestTokenActivity.this, getString(R.string.generic_wait), getString(R.string.generic_sync), true, false);
    // Getting user details from twitter
    long userID = accessToken.getUserId();

    //upload code to our server (irrelevant to question)
}

private void getTwitterAccessToken(Uri uri) {
    mProgressDialog = ProgressDialog.show(TwitterRequestTokenActivity.this, getString(R.string.generic_wait), getString(R.string.twitter_logging_in), true, false);
    final String verifier = uri.getQueryParameter(URL_TWITTER_OAUTH_VERIFIER);
    // get the Token from Twitter       
    AsyncTask<Void, Void, Void> tokenTask = new AsyncTask<Void, Void, Void>() {
        @Override
        protected Void doInBackground(Void... params) {
            try {
                TwitterRequestTokenActivity.this.accessToken = twitter.getOAuthAccessToken(requestToken, verifier);
            }
            catch (Exception e) {
                e.printStackTrace();
            }

            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            hideProgress();
            if (TwitterRequestTokenActivity.this.accessToken==null){
                hideProgress();
                finish();                   
            }
            else
                uploadToken();
        }
    };

    tokenTask.execute();
}

/**
 * Starts the oAuth request with our callback URL
 */
private void authenticate() {
    ConfigurationBuilder builder = new ConfigurationBuilder();
    builder.setOAuthConsumerKey(Global.TWITTER_CONSUMER_KEY);
    builder.setOAuthConsumerSecret(Global.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);
                    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(requestToken.getAuthenticationURL())).setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_FROM_BACKGROUND);
                    TwitterRequestTokenActivity.this.startActivity(intent);
                }
                catch (Exception e) {
                    finish();
                }
            }
        });

        thread.start();
}

/**
 * Hides the progress bar
 */
private void hideProgress() {
    try {
        mProgressDialog.dismiss();
    } catch (Exception e) {}
}
    <activity
        android:name=".twitter.TwitterRequestTokenActivity"
        android:configChanges="keyboardHidden|orientation"
        android:launchMode="singleTask" >
        <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="twitterLogin"
                android:scheme="appnameoauth" />
        </intent-filter>
    </activity>
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();

        }
    }