├── .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 |
--------------------------------------------------------------------------------