2013-07-06 35 views
17

我想將twitter整合到android應用程序中,並找到許多教程。實施了其中2個。但是在實現之後,當運行應用程序時,我開始知道他們使用舊版本的twitter4J庫。使用oauth和twitter4j進行Android Twitter整合

雖然有很多其他教程可用,但沒有一個是最新的one.i.e.只有2-3個月大。我需要一個教程或例子,它使用最新的twitter4J庫版本,它是twitter4j-core-3.0.3

我的主要目的是讓用戶在他/她的賬戶上發帖tweets。但是,如果用戶沒有登錄,那麼我首先需要索取憑證。另外,如果用戶點擊logout按鈕,那麼我需要一些方法來記錄用戶。

+0

Twitter使用[OAuth 1.0A](https://dev.twitter.com/docs/auth/oauth) – brillenheini

+0

@brillenheini謝謝你讓我知道這一點。我會相應地編輯我的問題。 – Geek

+0

按照這個教程http://tech-papers.org/integrate-twitter-with-android-application/ –

回答

29

我解決了這個問題。我對教程中找到的代碼進行了更改,以使其工作。在這裏複製整個代碼。只需更換您的ConsumerKeyConsumerSecret即可。

您需要將twitter4j庫添加到您項目的libs文件夾中。

的AndroidManifest.xml:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.androidhive.twitterconnect" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="14" 
     android:targetSdkVersion="17" /> 

    <!-- 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=".MainActivity" 
      android:label="@string/title_activity_main" > 
      <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="t4jsample" 
        android:scheme="oauth" /> 

      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

MainActivity.java:

package com.androidhive.twitterconnect; 

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 com.androidhive.twitterconnect.R; 
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.text.Html; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.widget.Toast; 

public class MainActivity extends Activity { 
    // Constants 
    /** 
    * Register your here app https://dev.twitter.com/apps/new and get your 
    * consumer key and secret 
    * */ 
    static String TWITTER_CONSUMER_KEY = "PutYourConsumerKeyHere"; // place your cosumer key here 
    static String TWITTER_CONSUMER_SECRET = "PutYourConsumerSecretHere"; // place your consumer secret here 

    // 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"; 

    static final String TWITTER_CALLBACK_URL = "oauth://t4jsample"; 

    // 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"; 

    // Login button 
    Button btnLoginTwitter; 
    // Update status button 
    Button btnUpdateStatus; 
    // Logout button 
    Button btnLogoutTwitter; 
    // EditText for update 
    EditText txtUpdate; 
    // lbl update 
    TextView lblUpdate; 
    TextView lblUserName; 

    // Progress dialog 
    ProgressDialog pDialog; 

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

    // Shared Preferences 
    private static SharedPreferences mSharedPreferences; 

    // Internet Connection detector 
    private ConnectionDetector cd; 

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

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

     cd = new ConnectionDetector(getApplicationContext()); 

     // Check if Internet present 
     if (!cd.isConnectingToInternet()) { 
      // Internet Connection is not present 
      alert.showAlertDialog(MainActivity.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(MainActivity.this, "Twitter oAuth tokens", "Please set your twitter oauth tokens first!", false); 
      // stop executing code by return 
      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); 

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

     /** 
     * Twitter login button click event will call loginToTwitter() function 
     * */ 
     btnLoginTwitter.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       // Call login twitter function 
       loginToTwitter(); 
      } 
     }); 

     /** 
     * Button click event to Update Status, will call updateTwitterStatus() 
     * function 
     * */ 
     btnUpdateStatus.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // Call update status function 
       // Get the status from EditText 
       String status = txtUpdate.getText().toString(); 

       // Check for blank text 
       if (status.trim().length() > 0) { 
        // update status 
        new updateTwitterStatus().execute(status); 
       } else { 
        // EditText is empty 
        Toast.makeText(getApplicationContext(), 
          "Please enter status message", Toast.LENGTH_SHORT) 
          .show(); 
       } 
      } 
     }); 

     /** 
     * Button click event for logout from twitter 
     * */ 
     btnLogoutTwitter.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       // Call logout twitter function 
       logoutFromTwitter(); 
      } 
     }); 

     /** 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 
       final String verifier = uri 
         .getQueryParameter(URL_TWITTER_OAUTH_VERIFIER); 

       try { 

        Thread thread = new Thread(new Runnable(){ 
         @Override 
         public void run() { 
          try { 

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

          } catch (Exception e) { 
           e.printStackTrace(); 
          } 
         } 
        }); 
        thread.start(); 

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

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

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

        // Displaying in xml ui 
        lblUserName.setText(Html.fromHtml("<b>Welcome " + username + "</b>")); 
       } catch (Exception e) { 
        // Check log for login errors 
        Log.e("Twitter Login Error", "> " + e.getMessage()); 
        e.printStackTrace(); 
       } 
      } 
     } 

    } 

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


       Thread thread = new Thread(new Runnable(){ 
        @Override 
        public void run() { 
         try { 

          requestToken = twitter 
            .getOAuthRequestToken(TWITTER_CALLBACK_URL); 
          MainActivity.this.startActivity(new Intent(Intent.ACTION_VIEW, Uri 
            .parse(requestToken.getAuthenticationURL()))); 

         } catch (Exception e) { 
          e.printStackTrace(); 
         } 
        } 
       }); 
       thread.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(MainActivity.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()); 
       e.printStackTrace(); 
      } 
      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 
        txtUpdate.setText(""); 
       } 
      }); 
     } 

    } 

    /** 
    * Function to logout from twitter 
    * It will just clear the application shared preferences 
    * */ 
    private void logoutFromTwitter() { 
     // Clear the shared preferences 
     Editor e = mSharedPreferences.edit(); 
     e.remove(PREF_KEY_OAUTH_TOKEN); 
     e.remove(PREF_KEY_OAUTH_SECRET); 
     e.remove(PREF_KEY_TWITTER_LOGIN); 
     e.commit(); 

     // After this take the appropriate action 
     // I am showing the hiding/showing buttons again 
     // You might not needed this code 
     btnLogoutTwitter.setVisibility(View.GONE); 
     btnUpdateStatus.setVisibility(View.GONE); 
     txtUpdate.setVisibility(View.GONE); 
     lblUpdate.setVisibility(View.GONE); 
     lblUserName.setText(""); 
     lblUserName.setVisibility(View.GONE); 

     btnLoginTwitter.setVisibility(View.VISIBLE); 
    } 

    /** 
    * 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(); 
    } 

} 

AlertDialogManager.java:

package com.androidhive.twitterconnect; 

import android.app.AlertDialog; 
import android.content.Context; 
import android.content.DialogInterface; 

public class AlertDialogManager { 
    /** 
    * Function to display simple Alert Dialog 
    * @param context - application context 
    * @param title - alert dialog title 
    * @param message - alert message 
    * @param status - success/failure (used to set icon) 
    *    - pass null if you don't want icon 
    * */ 
    public void showAlertDialog(Context context, String title, String message, 
     Boolean status) { 
     AlertDialog alertDialog = new AlertDialog.Builder(context).create(); 

     // Setting Dialog Title 
     alertDialog.setTitle(title); 

     // Setting Dialog Message 
      alertDialog.setMessage(message); 

     if(status != null) 
      // Setting alert dialog icon 
      alertDialog.setIcon((status) ? R.drawable.success : R.drawable.fail); 

     // Setting OK Button 
     alertDialog.setButton("OK", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
      } 
     }); 

     // Showing Alert Message 
     alertDialog.show(); 
    } 
} 

ConnectionDetector.java:

package com.androidhive.twitterconnect; 

import android.content.Context; 
import android.net.ConnectivityManager; 
import android.net.NetworkInfo; 

public class ConnectionDetector { 

    private Context _context; 

    public ConnectionDetector(Context context){ 
     this._context = context; 
    } 

    /** 
    * Checking for all possible internet providers 
    * **/ 
    public boolean isConnectingToInternet(){ 
     ConnectivityManager connectivity = (ConnectivityManager) _context.getSystemService(Context.CONNECTIVITY_SERVICE); 
      if (connectivity != null) 
      { 
       NetworkInfo[] info = connectivity.getAllNetworkInfo(); 
       if (info != null) 
        for (int i = 0; i < info.length; i++) 
         if (info[i].getState() == NetworkInfo.State.CONNECTED) 
         { 
          return true; 
         } 

      } 
      return false; 
    } 
} 

這是original code由拉維玉田。我所做的更改僅限於MainActivity.javaAndroidManifest.xml文件。

+0

你好@akash你解決你的問題?我使用twitter4j 2.3.5庫包含方法發送鳴叫另一個用戶。如果你還沒有解決你的問題,然後回覆。抱歉,遲到的答覆謝謝。 – Jeetu

+0

@Jeetu我解決了它。感謝您的關注。 – Geek

+1

我試過這段代碼訪問令牌返回null plz幫助 – Ravi

9

我發現了一個很好的例子,它適用於android上的twitter4j 3.0.3。其他人不工作。 http://hintdesk.com/how-to-tweet-in-twitter-within-android-client/

+0

鏈接不是答案。而且該鏈接甚至不提供完整的代碼。如果你能夠得到這個工作,請發佈代碼。 – dranxo

+5

@rcompton該鏈接是一個完整的教程。這裏沒有必要複製和粘貼所有內容。它不提供完整的項目,但它提供了核心代碼。每天學習Android編程的人都應該理解它。我用google搜索了很多例子,但所有的例子都不太好。也許這是因爲twitter將api更改爲oauth v1.1,並且這些示例未更新。 這個例子是唯一一個在android上與twitter4j 3.0.3一起使用的例子。 –

3

爲了說明我上面的評論,這裏是我最後的MainActivity類。 漂亮類似於上面的代碼中,區別是:

  • 內部類OAuthAccessTokenTask,其包括OAuth令牌和用戶信息
  • 其回調onRequestTokenRetrieved(Exception)

此外,請注意檢索爲了得到這個工作,你必須在你的twitter應用設置中聲明一個回調url,甚至是一個假的。我花了幾個小時才弄清楚它的工作方式。

當您檢查twitter4j文檔時,第一部分代碼是指您必須從授權網頁獲取的PIN碼。這就是在你的應用中沒有設置回調URL的情況。這就是所謂的基於PIN的身份驗證和你不想使用它在移動:)

public class MainActivity extends Activity { 
    // Constants 
    /** 
    * Register your here app https://dev.twitter.com/apps/new and get your 
    * consumer key and secret 
    * */ 
    static String TWITTER_CONSUMER_KEY = "PutYourConsumerKeyHere"; // place your cosumer key here 
    static String TWITTER_CONSUMER_SECRET = "PutYourConsumerSecretHere"; // place your consumer secret here 

    // 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"; 

    static final String TWITTER_CALLBACK_URL = "oauth://t4jsample"; 

    // 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"; 

    // Login button 
    Button btnLoginTwitter; 
    // Update status button 
    Button btnUpdateStatus; 
    // Logout button 
    Button btnLogoutTwitter; 
    // EditText for update 
    EditText txtUpdate; 
    // lbl update 
    TextView lblUpdate; 
    TextView lblUserName; 

    // Progress dialog 
    ProgressDialog pDialog; 

    // Twitter 
    private static Twitter twitter; 
    private static RequestToken requestToken; 
    private AccessToken accessToken; 
    private User user; 

    // Shared Preferences 
    private static SharedPreferences mSharedPreferences; 

    // Internet Connection detector 
    private ConnectionDetector cd; 

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

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

     cd = new ConnectionDetector(getApplicationContext()); 

     // Check if Internet present 
     if (!cd.isConnectingToInternet()) { 
      // Internet Connection is not present 
      alert.showAlertDialog(MainActivity.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(MainActivity.this, "Twitter oAuth tokens", "Please set your twitter oauth tokens first!", false); 
      // stop executing code by return 
      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); 

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

     /** 
     * Twitter login button click event will call loginToTwitter() function 
     * */ 
     btnLoginTwitter.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       // Call login twitter function 
       loginToTwitter(); 
      } 
     }); 

     /** 
     * Button click event to Update Status, will call updateTwitterStatus() 
     * function 
     * */ 
     btnUpdateStatus.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // Call update status function 
       // Get the status from EditText 
       String status = txtUpdate.getText().toString(); 

       // Check for blank text 
       if (status.trim().length() > 0) { 
        // update status 
        new updateTwitterStatus().execute(status); 
       } else { 
        // EditText is empty 
        Toast.makeText(
          getApplicationContext(), 
          "Please enter status message", 
          Toast.LENGTH_SHORT 
        ).show(); 
       } 
      } 
     }); 

     /** 
     * Button click event for logout from twitter 
     * */ 
     btnLogoutTwitter.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       // Call logout twitter function 
       logoutFromTwitter(); 
      } 
     }); 

     /** 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); 
       new OAuthAccessTokenTask().execute(verifier); 
      } 
     } 

    } 

    private class OAuthAccessTokenTask extends AsyncTask<String, Void, Exception> 
    { 
     @Override 
     protected Exception doInBackground(String... params) { 
      Exception toReturn = null; 

      try { 
       accessToken = twitter.getOAuthAccessToken(requestToken, params[0]); 
       user = twitter.showUser(accessToken.getUserId()); 

      } 
      catch(TwitterException e) { 
       Log.e(MainActivity.class.getName(), "TwitterError: " + e.getErrorMessage()); 
       toReturn = e; 
      } 
      catch(Exception e) { 
       Log.e(MainActivity.class.getName(), "Error: " + e.getMessage()); 
       toReturn = e; 
      } 

      return toReturn; 
     } 

     @Override 
     protected void onPostExecute(Exception exception) { 
      onRequestTokenRetrieved(exception); 
     } 
    } 

    private void onRequestTokenRetrieved(Exception result) { 

     if (result != null) { 
      Toast.makeText(
        this, 
        result.getMessage(), 
        Toast.LENGTH_LONG 
        ).show(); 
     } 

     else { 
      try { 
       // Shared Preferences 
       Editor editor = mSharedPreferences.edit(); 

       // After getting access token, access token secret 
       // store them in application preferences 
       editor.putString(PREF_KEY_OAUTH_TOKEN, accessToken.getToken()); 
       editor.putString(PREF_KEY_OAUTH_SECRET, 
         accessToken.getTokenSecret()); 
       // Store login status - true 
       editor.putBoolean(PREF_KEY_TWITTER_LOGIN, true); 
       editor.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); 

       // Getting user details from twitter 
       String username = user.getName(); 

       // Displaying in xml ui 
       lblUserName.setText(Html.fromHtml("<b>Welcome " + username + "</b>")); 
      } 
      catch (Exception ex) { 
       // Check log for login errors 
       Log.e("Twitter Login Error", "> " + ex.getMessage()); 
       ex.printStackTrace(); 
      } 
     } 
    } 

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


       Thread thread = new Thread(new Runnable(){ 
        @Override 
        public void run() { 
         try { 
          requestToken = twitter.getOAuthRequestToken(TWITTER_CALLBACK_URL); 
          MainActivity.this.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(requestToken.getAuthenticationURL()))); 

         } catch (Exception e) { 
          e.printStackTrace(); 
          Toast.makeText(getApplicationContext(), "Already Logged into twitter", Toast.LENGTH_LONG).show(); 
         } 
        } 
       }); 
       thread.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(MainActivity.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()); 
       e.printStackTrace(); 
      } 
      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 
        txtUpdate.setText(""); 
       } 
      }); 
     } 
    } 

    /** 
    * Function to logout from twitter 
    * It will just clear the application shared preferences 
    * */ 
    private void logoutFromTwitter() { 
     // Clear the shared preferences 
     Editor e = mSharedPreferences.edit(); 
     e.remove(PREF_KEY_OAUTH_TOKEN); 
     e.remove(PREF_KEY_OAUTH_SECRET); 
     e.remove(PREF_KEY_TWITTER_LOGIN); 
     e.commit(); 

     // After this take the appropriate action 
     // I am showing the hiding/showing buttons again 
     // You might not needed this code 
     btnLogoutTwitter.setVisibility(View.GONE); 
     btnUpdateStatus.setVisibility(View.GONE); 
     txtUpdate.setVisibility(View.GONE); 
     lblUpdate.setVisibility(View.GONE); 
     lblUserName.setText(""); 
     lblUserName.setVisibility(View.GONE); 

     btnLoginTwitter.setVisibility(View.VISIBLE); 
    } 

    /** 
    * 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(); 
    } 
} 
+0

Twitter開發人員應用程序設置中的Twitter回調URL必須採用http://或https://格式,即使在運行時,您的Android應用程序也會提供其自己的oauth:// t4jsample值 – realgt

+0

@daffycricket您是否面臨同樣的問題這個http://stackoverflow.com/questions/24204855/android-app-is-opened-in-browser-when-coming-back-from-twitter-login-page-log? – Geek

3

這是從我的代碼工作的例子,我使用twitter4j,你也不必設置任何意圖在清單中,因爲我使用webview而不是瀏覽器。

將您的消費和祕密密鑰,你應該是好去

package com.example.mysituationtwittertest; 

import twitter4j.Twitter; 
import twitter4j.TwitterException; 
import twitter4j.TwitterFactory; 
import twitter4j.auth.AccessToken; 
import twitter4j.auth.RequestToken; 
import twitter4j.conf.Configuration; 
import twitter4j.conf.ConfigurationBuilder; 
import android.app.Activity; 
import android.content.SharedPreferences; 
import android.content.SharedPreferences.Editor; 
import android.net.Uri; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.webkit.WebView; 
import android.webkit.WebViewClient; 
import android.widget.Button; 
import android.widget.Toast; 

public class MainActivity extends Activity { 
// Constants 
/** 
* Register your here app https://dev.twitter.com/apps/new and get your 
* consumer key and secret 
* */ 
static String TWITTER_CONSUMER_KEY = "XXXXXXXXXXXXXXXXXXX"; // place your 
                   // cosumer 
                   // key here 
static String TWITTER_CONSUMER_SECRET = "XXXXXXXXXXXXXXXX"; // place 
                        // your 
                        // consumer 
                        // secret 
                        // here 

// 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"; 

static final String TWITTER_CALLBACK_URL = "oauth://youdare"; 

// 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"; 

// Login button 
Button btnShareTwitter; 

WebView myWebView; 

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

// Shared Preferences 
private static SharedPreferences mSharedPreferences; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    // All UI elements 
    btnShareTwitter = (Button) findViewById(R.id.btnShareTwitter); 
    myWebView = (WebView) findViewById(R.id.webView1); 

    myWebView.setWebViewClient(new WebViewClient() { 
     @Override 
     public boolean shouldOverrideUrlLoading(WebView webView, String url) { 
      if (url != null && url.startsWith(TWITTER_CALLBACK_URL)) 
       new AfterLoginTask().execute(url); 
      else 
       webView.loadUrl(url); 
      return true; 
     } 
    }); 

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

    /** 
    * Twitter login button click event will call loginToTwitter() function 
    * */ 
    btnShareTwitter.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
      // Call login twitter function 
      new LoginTask().execute(); 
     } 
    }); 

} 

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

     try { 
      requestToken = twitter 
        .getOAuthRequestToken(TWITTER_CALLBACK_URL); 
     } catch (TwitterException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 

    else { 
     // user already logged into twitter 
     Toast.makeText(getApplicationContext(), 
       "Already Logged into twitter", Toast.LENGTH_LONG).show(); 
    } 
} 

/** 
* 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); 
} 

public void handleTwitterCallback(String url) { 

    Uri uri = Uri.parse(url); 

    // oAuth verifier 
    final String verifier = uri 
      .getQueryParameter(URL_TWITTER_OAUTH_VERIFIER); 

    try { 

     // Get the access token 
     MainActivity.this.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()); 

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

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

class LoginTask extends AsyncTask<Void, Void, Boolean> { 

    @Override 
    protected Boolean doInBackground(Void... params) { 
     // TODO Auto-generated method stub 
     loginToTwitter(); 
     return true; 
    } 

    @Override 
    protected void onPostExecute(Boolean result) { 
     // TODO Auto-generated method stub 

     myWebView.loadUrl(requestToken.getAuthenticationURL()); 
     myWebView.setVisibility(View.VISIBLE); 
     myWebView.requestFocus(View.FOCUS_DOWN); 

    } 

} 

class AfterLoginTask extends AsyncTask<String, Void, Boolean> { 

    @Override 
    protected void onPreExecute() { 
     // TODO Auto-generated method stub 
     myWebView.clearHistory(); 
    } 

    @Override 
    protected Boolean doInBackground(String... params) { 
     // TODO Auto-generated method stub 
     handleTwitterCallback(params[0]); 
     return true; 
    } 

    @Override 
    protected void onPostExecute(Boolean result) { 
     // TODO Auto-generated method stub 
     myWebView.setVisibility(View.GONE); 
     Toast.makeText(MainActivity.this, "Tweet Successful", 
       Toast.LENGTH_SHORT).show(); 

    } 

} 

@Override 
public void onBackPressed() { 
    if (myWebView.getVisibility() == View.VISIBLE) { 
     if (myWebView.canGoBack()) { 
      myWebView.goBack(); 
      return; 
     } else { 
      myWebView.setVisibility(View.GONE); 
      return; 
     } 
    } 
    super.onBackPressed(); 
} 

} 
+0

您是否面臨與此相同的問題http://stackoverflow.com/questions/24204855/android-app-is-opened-in-browser-when-coming-back-from-twitter-login-page-log? – Geek

+0

不,我沒有面對這個問題,登錄後我關閉了我的web視圖,所以我不會有這個問題與此流程。 – Ravi