2013-07-06 3 views
17

Я хочу интегрировать твиттер в приложение android и нашел много учебников. Реализовано 2 из них. Но после внедрения, когда я запускал приложение, я узнал, что они используют более старую версию библиотеки twitter4J.Интеграция в Android Twitter с использованием oauth и twitter4j

Хотя доступно множество других учебных пособий, но ни один из них не является последним 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

Я решил проблему. Я внес изменения в код, который я нашел в учебнике, чтобы он работал. Копирование всего кода здесь. Просто замените ваши ConsumerKey и ConsumerSecret.

Вам необходимо добавить библиотеку 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.java и AndroidManifest.xml.

+0

Здравствуйте, @akash r u решил проблему ур? i m использует библиотеку twitter4j 2.3.5, которая содержит метод отправки твита другого пользователя. если и не все еще решена проблема ур, тогда ответьте. извините за поздний ответ Спасибо. – Jeetu

+0

@Jeetu Я решил. Спасибо за ваши проблемы. – Geek

+1

Я пробовал этот код, токен доступа возвращается null plz help – Ravi

9

Я нашел хороший пример, который хорошо работает с twitter4j 3.0.3 на Android. Другие не работают. http://hintdesk.com/how-to-tweet-in-twitter-within-android-client/

+0

Ссылка не ответ. И эта ссылка даже не обеспечивает полный код.Если бы вы могли заставить это работать, отправьте код. – dranxo

+5

@rcompton Эта ссылка представляет собой полный учебник. Здесь нет необходимости копировать и вставлять все содержимое. Он не обеспечивает полный проект, но он обеспечивает основной код. Каждый, кто изучил Android-программирование в течение нескольких дней, должен это понимать. Я googled и пробовал много примеров, но все они не работают хорошо. Возможно, это связано с тем, что twitter изменил api на oauth v1.1, и эти примеры не обновляются. Этот пример является единственным, который работает с twitter4j 3.0.3 на Android. –

3

Чтобы проиллюстрировать мой комментарий выше, вот мой последний рабочий класс MainActivity. Довольно похож на приведенный выше код, различия:

  • внутренний класс OAuthAccessTokenTask, который включает в себя извлечение маркеров и пользователя информации OAuth
  • его обратного вызова onRequestTokenRetrieved(Exception)

Кроме того, к сведению что, чтобы заставить это работать, вы должны объявить URL-адрес обратного вызова в настройках вашего Twitter-приложения, даже фальшивый. Мне потребовалось несколько часов, чтобы понять, как это работает.

Когда вы проверяете документацию 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

URL-адрес обратного вызова Twitter в вашем блоге. Настройки приложения Dev должны быть в формате http: // или https: //, даже если во время выполнения ваше приложение для Android будет предоставлять свое собственное oauth: // t4jsample value – 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

Нет, я не столкнулся с этой проблемой, и после входа в систему я закрыл свой веб-просмотр, поэтому я не вижу этой проблемы с этим потоком. – Ravi