├── .classpath ├── .gitignore ├── .project ├── AndroidManifest.xml ├── libs ├── twitter4j-core-3.0.3.jar └── twitter4j-stream-3.0.3.jar ├── lint.xml ├── proguard.cfg ├── project.properties ├── res ├── drawable-hdpi │ └── icon.png ├── drawable-ldpi │ └── icon.png ├── drawable-mdpi │ └── icon.png ├── layout │ └── main.xml └── values │ └── strings.xml └── src └── com └── pigmal └── android └── ex └── twitter4j ├── Const.java └── TwitterApp.java /.classpath: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | gen 2 | bin 3 | -------------------------------------------------------------------------------- /.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | Twitter4jSample 4 | 5 | 6 | 7 | 8 | 9 | com.android.ide.eclipse.adt.ResourceManagerBuilder 10 | 11 | 12 | 13 | 14 | com.android.ide.eclipse.adt.PreCompilerBuilder 15 | 16 | 17 | 18 | 19 | org.eclipse.jdt.core.javabuilder 20 | 21 | 22 | 23 | 24 | com.android.ide.eclipse.adt.ApkBuilder 25 | 26 | 27 | 28 | 29 | 30 | com.android.ide.eclipse.adt.AndroidNature 31 | org.eclipse.jdt.core.javanature 32 | 33 | 34 | -------------------------------------------------------------------------------- /AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /libs/twitter4j-core-3.0.3.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itog/Twitter4j-android-Sample/02f05a5386dd018fbc2f5cc5556ec975b0a9ceeb/libs/twitter4j-core-3.0.3.jar -------------------------------------------------------------------------------- /libs/twitter4j-stream-3.0.3.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itog/Twitter4j-android-Sample/02f05a5386dd018fbc2f5cc5556ec975b0a9ceeb/libs/twitter4j-stream-3.0.3.jar -------------------------------------------------------------------------------- /lint.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /proguard.cfg: -------------------------------------------------------------------------------- 1 | -optimizationpasses 5 2 | -dontusemixedcaseclassnames 3 | -dontskipnonpubliclibraryclasses 4 | -dontpreverify 5 | -verbose 6 | -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 7 | 8 | -keep public class * extends android.app.Activity 9 | -keep public class * extends android.app.Application 10 | -keep public class * extends android.app.Service 11 | -keep public class * extends android.content.BroadcastReceiver 12 | -keep public class * extends android.content.ContentProvider 13 | -keep public class * extends android.app.backup.BackupAgentHelper 14 | -keep public class * extends android.preference.Preference 15 | -keep public class com.android.vending.licensing.ILicensingService 16 | 17 | -keepclasseswithmembernames class * { 18 | native ; 19 | } 20 | 21 | -keepclasseswithmembernames class * { 22 | public (android.content.Context, android.util.AttributeSet); 23 | } 24 | 25 | -keepclasseswithmembernames class * { 26 | public (android.content.Context, android.util.AttributeSet, int); 27 | } 28 | 29 | -keepclassmembers enum * { 30 | public static **[] values(); 31 | public static ** valueOf(java.lang.String); 32 | } 33 | 34 | -keep class * implements android.os.Parcelable { 35 | public static final android.os.Parcelable$Creator *; 36 | } 37 | -------------------------------------------------------------------------------- /project.properties: -------------------------------------------------------------------------------- 1 | # This file is automatically generated by Android Tools. 2 | # Do not modify this file -- YOUR CHANGES WILL BE ERASED! 3 | # 4 | # This file must be checked in Version Control Systems. 5 | # 6 | # To customize properties used by the Ant build system use, 7 | # "ant.properties", and override values to adapt the script to your 8 | # project structure. 9 | 10 | # Project target. 11 | target=Google Inc.:Google APIs:7 12 | -------------------------------------------------------------------------------- /res/drawable-hdpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itog/Twitter4j-android-Sample/02f05a5386dd018fbc2f5cc5556ec975b0a9ceeb/res/drawable-hdpi/icon.png -------------------------------------------------------------------------------- /res/drawable-ldpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itog/Twitter4j-android-Sample/02f05a5386dd018fbc2f5cc5556ec975b0a9ceeb/res/drawable-ldpi/icon.png -------------------------------------------------------------------------------- /res/drawable-mdpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itog/Twitter4j-android-Sample/02f05a5386dd018fbc2f5cc5556ec975b0a9ceeb/res/drawable-mdpi/icon.png -------------------------------------------------------------------------------- /res/layout/main.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 7 | 9 | 11 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Twitter4jSample 4 | Disconnect 5 | Connect to Twitter 6 | 7 | -------------------------------------------------------------------------------- /src/com/pigmal/android/ex/twitter4j/Const.java: -------------------------------------------------------------------------------- 1 | package com.pigmal.android.ex.twitter4j; 2 | 3 | public class Const { 4 | static String CONSUMER_KEY = "YOUR_CONSUMER_KEY"; 5 | static String CONSUMER_SECRET = "YOUR_CONSUMER_SECRET"; 6 | 7 | static String PREFERENCE_NAME = "twitter_oauth"; 8 | static final String PREF_KEY_SECRET = "oauth_token_secret"; 9 | static final String PREF_KEY_TOKEN = "oauth_token"; 10 | 11 | static final String CALLBACK_URL = "oauth://t4jsample"; 12 | 13 | static final String IEXTRA_AUTH_URL = "auth_url"; 14 | static final String IEXTRA_OAUTH_VERIFIER = "oauth_verifier"; 15 | static final String IEXTRA_OAUTH_TOKEN = "oauth_token"; 16 | } 17 | -------------------------------------------------------------------------------- /src/com/pigmal/android/ex/twitter4j/TwitterApp.java: -------------------------------------------------------------------------------- 1 | package com.pigmal.android.ex.twitter4j; 2 | 3 | import twitter4j.DirectMessage; 4 | import twitter4j.StallWarning; 5 | import twitter4j.Status; 6 | import twitter4j.StatusDeletionNotice; 7 | import twitter4j.Twitter; 8 | import twitter4j.TwitterException; 9 | import twitter4j.TwitterFactory; 10 | import twitter4j.TwitterStream; 11 | import twitter4j.TwitterStreamFactory; 12 | import twitter4j.User; 13 | import twitter4j.UserList; 14 | import twitter4j.UserStreamListener; 15 | import twitter4j.auth.AccessToken; 16 | import twitter4j.auth.RequestToken; 17 | import twitter4j.conf.Configuration; 18 | import twitter4j.conf.ConfigurationBuilder; 19 | import android.app.Activity; 20 | import android.content.Intent; 21 | import android.content.SharedPreferences; 22 | import android.content.SharedPreferences.Editor; 23 | import android.net.Uri; 24 | import android.os.Bundle; 25 | import android.util.Log; 26 | import android.view.View; 27 | import android.view.View.OnClickListener; 28 | import android.widget.Button; 29 | import android.widget.ScrollView; 30 | import android.widget.TextView; 31 | import android.widget.Toast; 32 | 33 | public class TwitterApp extends Activity implements OnClickListener { 34 | private static final String TAG = "T4JSample"; 35 | 36 | private Button buttonLogin; 37 | private Button getTweetButton; 38 | private TextView tweetText; 39 | private ScrollView scrollView; 40 | 41 | private static Twitter twitter; 42 | private static RequestToken requestToken; 43 | private static SharedPreferences mSharedPreferences; 44 | private static TwitterStream twitterStream; 45 | private boolean running = false; 46 | 47 | @Override 48 | public void onCreate(Bundle savedInstanceState) { 49 | super.onCreate(savedInstanceState); 50 | setContentView(R.layout.main); 51 | 52 | mSharedPreferences = getSharedPreferences(Const.PREFERENCE_NAME, MODE_PRIVATE); 53 | scrollView = (ScrollView)findViewById(R.id.scrollView); 54 | tweetText =(TextView)findViewById(R.id.tweetText); 55 | getTweetButton = (Button)findViewById(R.id.getTweet); 56 | getTweetButton.setOnClickListener(this); 57 | buttonLogin = (Button) findViewById(R.id.twitterLogin); 58 | buttonLogin.setOnClickListener(this); 59 | 60 | /** 61 | * Handle OAuth Callback 62 | */ 63 | Uri uri = getIntent().getData(); 64 | if (uri != null && uri.toString().startsWith(Const.CALLBACK_URL)) { 65 | String verifier = uri.getQueryParameter(Const.IEXTRA_OAUTH_VERIFIER); 66 | try { 67 | AccessToken accessToken = twitter.getOAuthAccessToken(requestToken, verifier); 68 | Editor e = mSharedPreferences.edit(); 69 | e.putString(Const.PREF_KEY_TOKEN, accessToken.getToken()); 70 | e.putString(Const.PREF_KEY_SECRET, accessToken.getTokenSecret()); 71 | e.commit(); 72 | } catch (Exception e) { 73 | Log.e(TAG, e.getMessage()); 74 | Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show(); 75 | } 76 | } 77 | } 78 | 79 | protected void onResume() { 80 | super.onResume(); 81 | 82 | if (isConnected()) { 83 | String oauthAccessToken = mSharedPreferences.getString(Const.PREF_KEY_TOKEN, ""); 84 | String oAuthAccessTokenSecret = mSharedPreferences.getString(Const.PREF_KEY_SECRET, ""); 85 | 86 | ConfigurationBuilder confbuilder = new ConfigurationBuilder(); 87 | Configuration conf = confbuilder 88 | .setOAuthConsumerKey(Const.CONSUMER_KEY) 89 | .setOAuthConsumerSecret(Const.CONSUMER_SECRET) 90 | .setOAuthAccessToken(oauthAccessToken) 91 | .setOAuthAccessTokenSecret(oAuthAccessTokenSecret) 92 | .build(); 93 | twitterStream = new TwitterStreamFactory(conf).getInstance(); 94 | 95 | buttonLogin.setText(R.string.label_disconnect); 96 | getTweetButton.setEnabled(true); 97 | } else { 98 | buttonLogin.setText(R.string.label_connect); 99 | } 100 | } 101 | 102 | /** 103 | * check if the account is authorized 104 | * @return 105 | */ 106 | private boolean isConnected() { 107 | return mSharedPreferences.getString(Const.PREF_KEY_TOKEN, null) != null; 108 | } 109 | 110 | private void askOAuth() { 111 | ConfigurationBuilder configurationBuilder = new ConfigurationBuilder(); 112 | configurationBuilder.setOAuthConsumerKey(Const.CONSUMER_KEY); 113 | configurationBuilder.setOAuthConsumerSecret(Const.CONSUMER_SECRET); 114 | Configuration configuration = configurationBuilder.build(); 115 | twitter = new TwitterFactory(configuration).getInstance(); 116 | 117 | try { 118 | requestToken = twitter.getOAuthRequestToken(Const.CALLBACK_URL); 119 | Toast.makeText(this, "Please authorize this app!", Toast.LENGTH_LONG).show(); 120 | this.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(requestToken.getAuthenticationURL()))); 121 | } catch (TwitterException e) { 122 | e.printStackTrace(); 123 | } 124 | } 125 | 126 | /** 127 | * Remove Token, Secret from preferences 128 | */ 129 | private void disconnectTwitter() { 130 | SharedPreferences.Editor editor = mSharedPreferences.edit(); 131 | editor.remove(Const.PREF_KEY_TOKEN); 132 | editor.remove(Const.PREF_KEY_SECRET); 133 | 134 | editor.commit(); 135 | } 136 | 137 | @Override 138 | public void onClick(View v) { 139 | switch (v.getId()) { 140 | case R.id.twitterLogin: 141 | if (isConnected()) { 142 | disconnectTwitter(); 143 | buttonLogin.setText(R.string.label_connect); 144 | } else { 145 | askOAuth(); 146 | } 147 | break; 148 | case R.id.getTweet: 149 | if (running) { 150 | stopStreamingTimeline(); 151 | running = false; 152 | getTweetButton.setText("start streaming"); 153 | } else { 154 | startStreamingTimeline(); 155 | running = true; 156 | getTweetButton.setText("stop streaming"); 157 | } 158 | break; 159 | } 160 | } 161 | 162 | private void stopStreamingTimeline() { 163 | twitterStream.shutdown(); 164 | } 165 | 166 | public void startStreamingTimeline() { 167 | UserStreamListener listener = new UserStreamListener() { 168 | 169 | @Override 170 | public void onDeletionNotice(StatusDeletionNotice arg0) { 171 | System.out.println("deletionnotice"); 172 | } 173 | 174 | @Override 175 | public void onScrubGeo(long arg0, long arg1) { 176 | System.out.println("scrubget"); 177 | } 178 | 179 | @Override 180 | public void onStatus(Status status) { 181 | final String tweet = "@" + status.getUser().getScreenName() + " : " + status.getText() + "\n"; 182 | System.out.println(tweet); 183 | tweetText.post(new Runnable() { 184 | @Override 185 | public void run() { 186 | tweetText.append(tweet); 187 | scrollView.fullScroll(View.FOCUS_DOWN); 188 | } 189 | }); 190 | } 191 | 192 | @Override 193 | public void onTrackLimitationNotice(int arg0) { 194 | System.out.println("trackLimitation"); 195 | } 196 | 197 | @Override 198 | public void onException(Exception arg0) { 199 | // TODO Auto-generated method stub 200 | } 201 | 202 | @Override 203 | public void onBlock(User arg0, User arg1) { 204 | // TODO Auto-generated method stub 205 | } 206 | 207 | @Override 208 | public void onDeletionNotice(long arg0, long arg1) { 209 | // TODO Auto-generated method stub 210 | } 211 | 212 | @Override 213 | public void onDirectMessage(DirectMessage arg0) { 214 | // TODO Auto-generated method stub 215 | } 216 | 217 | @Override 218 | public void onFavorite(User arg0, User arg1, Status arg2) { 219 | // TODO Auto-generated method stub 220 | } 221 | 222 | @Override 223 | public void onFollow(User arg0, User arg1) { 224 | // TODO Auto-generated method stub 225 | } 226 | 227 | @Override 228 | public void onFriendList(long[] arg0) { 229 | // TODO Auto-generated method stub 230 | } 231 | 232 | @Override 233 | public void onUnblock(User arg0, User arg1) { 234 | // TODO Auto-generated method stub 235 | } 236 | 237 | @Override 238 | public void onUnfavorite(User arg0, User arg1, Status arg2) { 239 | // TODO Auto-generated method stub 240 | } 241 | 242 | @Override 243 | public void onUserListCreation(User arg0, UserList arg1) { 244 | // TODO Auto-generated method stub 245 | } 246 | 247 | @Override 248 | public void onUserListDeletion(User arg0, UserList arg1) { 249 | // TODO Auto-generated method stub 250 | } 251 | 252 | @Override 253 | public void onUserListMemberAddition(User arg0, User arg1, UserList arg2) { 254 | // TODO Auto-generated method stub 255 | } 256 | 257 | @Override 258 | public void onUserListMemberDeletion(User arg0, User arg1, UserList arg2) { 259 | // TODO Auto-generated method stub 260 | } 261 | 262 | @Override 263 | public void onUserListSubscription(User arg0, User arg1, UserList arg2) { 264 | // TODO Auto-generated method stub 265 | } 266 | 267 | @Override 268 | public void onUserListUnsubscription(User arg0, User arg1, UserList arg2) { 269 | // TODO Auto-generated method stub 270 | } 271 | 272 | @Override 273 | public void onUserListUpdate(User arg0, UserList arg1) { 274 | // TODO Auto-generated method stub 275 | } 276 | 277 | @Override 278 | public void onUserProfileUpdate(User arg0) { 279 | // TODO Auto-generated method stub 280 | } 281 | 282 | @Override 283 | public void onStallWarning(StallWarning arg0) { 284 | // TODO Auto-generated method stub 285 | 286 | } 287 | }; 288 | twitterStream.addListener(listener); 289 | twitterStream.user(); 290 | } 291 | } 292 | --------------------------------------------------------------------------------