Send A Tweet

By blundell  

Implemented this myself so thought I would share.
This isn’t the prettiest solution but it gives you all the facts and is nice an quick.
I’ve kept it all in one Activity to try and give you the overview you can deal with the OO later yourself.

Source file downloads are at the bottom of this post.

Ok What we are going to do:

Authorise your app to use a users twitter account.
Send a tweet from this account.

Workflow:

User presses Login Button
Checks if user has logged in before
Twitter webpage is opened
User logins in to twitter
App is then allowed to post tweets
Users presses Tweet Button
Tweet is sent to Twitter
Simple!

A sneak preview of what it’ll look like:

Setup:

You need to create a Twitter Application (takes 2 mins) on the Twitter site: https://dev.twitter.com/apps/

Just like this :
twitter create settings

Ensure
Application Type: Browser
Permissions: Read & Write
Callback URL; doesnt matter put anything http://google.com

Next you need the Twitter4j Jar, this does all the hard work behind the scenes.

You can download it here: Twitter4J jar

Unzip it.
You then have to add it to your project.

Eclipse:
Right Click on your project > Properties > Java Build Path > Add External Jars > twitter4j-core-android-2.2.3.jar> OK

Easy!

Ok now to the coding!

First your manifest needs to be able to receive the twitter call back from the browser, it also needs the activity to be single instance:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?xml version= "1.0" encoding= "utf-8" ?>
<manifest
         xmlns:android= "http://schemas.android.com/apk/res/android"
         package = "com.blundell.tut.ttt"
         android:versionCode= "1"
         android:versionName= "1.0" >
         <uses-sdk
                 android:minSdkVersion= "4" />
  
         <!-- used by twitter integration -->
         <uses-permission
                 android:name= "android.permission.INTERNET" />
  
         <application
                 android:icon= "@drawable/icon"
                 android:label= "@string/app_name" >
                 <activity
                         android:name= ".TweetToTwitterActivity"
                         android:label= "@string/app_name"
                         android:launchMode= "singleInstance" >
                         <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:scheme= "tweet-to-twitter-blundell-01-android" />
                         </intent-filter>
                 </activity>
  
         </application>
</manifest>

Then I’ve compacted it all into a single Activity with comments so you should be able to understand what is going on:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
package com.blundell.tut.ttt;
  
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.auth.AccessToken;
import twitter4j.auth.RequestToken;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.webkit.WebView;
import android.widget.Button;
import android.widget.Toast;
  
public class TweetToTwitterActivity extends Activity {
  
         private static final String TAG = "Blundell.TweetToTwitterActivity" ;
  
         /** Name to store the users access token */
         private static final String PREF_ACCESS_TOKEN = "accessToken" ;
         /** Name to store the users access token secret */
         private static final String PREF_ACCESS_TOKEN_SECRET = "accessTokenSecret" ;
         /** Consumer Key generated when you registered your app at https://dev.twitter.com/apps/ */
         private static final String CONSUMER_KEY = "yourConsumerKey" ;
         /** Consumer Secret generated when you registered your app at https://dev.twitter.com/apps/  */
         private static final String CONSUMER_SECRET = "yourConsumerSecret" ; // XXX Encode in your app
         /** The url that Twitter will redirect to after a user log's in - this will be picked up by your app manifest and redirected into this activity */
         private static final String CALLBACK_URL = "tweet-to-twitter-blundell-01-android:///" ;
         /** Preferences to store a logged in users credentials */
         private SharedPreferences mPrefs;
         /** Twitter4j object */
         private Twitter mTwitter;
         /** The request token signifies the unique ID of the request you are sending to twitter  */
         private RequestToken mReqToken;
  
         private Button mLoginButton;
         private Button mTweetButton;
  
         /** Called when the activity is first created. */
         @Override
         public void onCreate(Bundle savedInstanceState) {
                 super .onCreate(savedInstanceState);
                 Log.i(TAG, "Loading TweetToTwitterActivity" );
                 setContentView(R.layout.main);
                
                 // Create a new shared preference object to remember if the user has
                 // already given us permission
                 mPrefs = getSharedPreferences( "twitterPrefs" , MODE_PRIVATE);
                 Log.i(TAG, "Got Preferences" );
                
                 // Load the twitter4j helper
                 mTwitter = new TwitterFactory().getInstance();
                 Log.i(TAG, "Got Twitter4j" );
                
                 // Tell twitter4j that we want to use it with our app
                 mTwitter.setOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
                 Log.i(TAG, "Inflated Twitter4j" );
                
                 mLoginButton = (Button) findViewById(R.id.login_button);
                 mTweetButton = (Button) findViewById(R.id.tweet_button);
         }
  
         /**
          * Button clickables are declared in XML as this projects min SDK is 1.6</br> </br>
          * Checks if the user has given this app permission to use twitter
          * before</br> If so login and enable tweeting</br>
          * Otherwise redirect to Twitter for permission
          *
          * @param v the clicked button
          */
         public void buttonLogin(View v) {
                 Log.i(TAG, "Login Pressed" );
                 if (mPrefs.contains(PREF_ACCESS_TOKEN)) {
                         Log.i(TAG, "Repeat User" );
                         loginAuthorisedUser();
                 } else {
                         Log.i(TAG, "New User" );
                         loginNewUser();
                 }
         }
  
         /**
          * Button clickables are declared in XML as this projects min SDK is 1.6</br> </br>
          *
          * @param v the clicked button
          */
         public void buttonTweet(View v) {
                 Log.i(TAG, "Tweet Pressed" );
                 tweetMessage();
         }
  
         /**
          * Create a request that is sent to Twitter asking 'can our app have permission to use Twitter for this user'</br>
          * We are given back the {@link mReqToken}
          * that is a unique indetifier to this request</br>
          * The browser then pops up on the twitter website and the user logins in ( we never see this informaton
          * )</br> Twitter then redirects us to {@link CALLBACK_URL} if the login was a success</br>
          *
          */
         private void loginNewUser() {
                 try {
                         Log.i(TAG, "Request App Authentication" );
                         mReqToken = mTwitter.getOAuthRequestToken(CALLBACK_URL);
  
                         Log.i(TAG, "Starting Webview to login to twitter" );
                         WebView twitterSite = new WebView( this );
                         twitterSite.loadUrl(mReqToken.getAuthenticationURL());
                         setContentView(twitterSite);
  
                 } catch (TwitterException e) {
                         Toast.makeText( this , "Twitter Login error, try again later" , Toast.LENGTH_SHORT).show();
                 }
         }
  
         /**
          * The user had previously given our app permission to use Twitter</br>
          * Therefore we retrieve these credentials and fill out the Twitter4j helper
          */
         private void loginAuthorisedUser() {
                 String token = mPrefs.getString(PREF_ACCESS_TOKEN, null );
                 String secret = mPrefs.getString(PREF_ACCESS_TOKEN_SECRET, null );
  
                 // Create the twitter access token from the credentials we got previously
                 AccessToken at = new AccessToken(token, secret);
  
                 mTwitter.setOAuthAccessToken(at);
                
                 Toast.makeText( this , "Welcome back" , Toast.LENGTH_SHORT).show();
                
                 enableTweetButton();
         }
  
         /**
          * Catch when Twitter redirects back to our {@link CALLBACK_URL}</br>
          * We use onNewIntent as in our manifest we have singleInstance="true" if we did not the
          * getOAuthAccessToken() call would fail
          */
         @Override
         protected void onNewIntent(Intent intent) {
                 super .onNewIntent(intent);
                 Log.i(TAG, "New Intent Arrived" );
                 dealWithTwitterResponse(intent);
         }
  
         @Override
         protected void onResume() {
                 super .onResume();
                 Log.i(TAG, "Arrived at onResume" );
         }
        
         /**
          * Twitter has sent us back into our app</br>
          * Within the intent it set back we have a 'key' we can use to authenticate the user
          *
          * @param intent
          */
         private void dealWithTwitterResponse(Intent intent) {
                 Uri uri = intent.getData();
                 if (uri != null && uri.toString().startsWith(CALLBACK_URL)) { // If the user has just logged in
                         String oauthVerifier = uri.getQueryParameter( "oauth_verifier" );
  
                         authoriseNewUser(oauthVerifier);
                 }
         }
  
         /**
          * Create an access token for this new user</br>
          * Fill out the Twitter4j helper</br>
          * And save these credentials so we can log the user straight in next time
          *
          * @param oauthVerifier
          */
         private void authoriseNewUser(String oauthVerifier) {
                 try {
                         AccessToken at = mTwitter.getOAuthAccessToken(mReqToken, oauthVerifier);
                         mTwitter.setOAuthAccessToken(at);
  
                         saveAccessToken(at);
  
                         // Set the content view back after we changed to a webview
                         setContentView(R.layout.main);
                        
                         enableTweetButton();
                 } catch (TwitterException e) {
                         Toast.makeText( this , "Twitter auth error x01, try again later" , Toast.LENGTH_SHORT).show();
                 }
         }
  
         /**
          * Allow the user to Tweet
          */
         private void enableTweetButton() {
                 Log.i(TAG, "User logged in - allowing to tweet" );
                 mLoginButton.setEnabled( false );
                 mTweetButton.setEnabled( true );
         }
  
         /**
          * Send a tweet on your timeline, with a Toast msg for success or failure
          */
         private void tweetMessage() {
                 try {
                         mTwitter.updateStatus( "Test - Tweeting with @Blundell_apps #AndroidDev Tutorial using #Twitter4j http://blog.blundell-apps.com/sending-a-tweet" );
  
                         Toast.makeText( this , "Tweet Successful!" , Toast.LENGTH_SHORT).show();
                 } catch (TwitterException e) {
                         Toast.makeText( this , "Tweet error, try again later" , Toast.LENGTH_SHORT).show();
                 }
         }
  
         private void saveAccessToken(AccessToken at) {
                 String token = at.getToken();
                 String secret = at.getTokenSecret();
                 Editor editor = mPrefs.edit();
                 editor.putString(PREF_ACCESS_TOKEN, token);
                 editor.putString(PREF_ACCESS_TOKEN_SECRET, secret);
                 editor.commit();
         }
}

If you find this helpful please say thanks :-) Happy Coding

And any questions just ask!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值