前面申请CONSUMER_KEY和CONSUMER_SECRET的过程就忽略了,这里直接上代码。
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.twitter_demo" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <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="com.example.twitter_demo.MainActivity" android:label="@string/app_name" > <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>
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".TwitterHomeActivity" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_marginLeft="106dp" android:layout_marginTop="21dp" android:text="@string/hello_world" android:textColor="#A52A2A" android:textStyle="bold" android:typeface="serif" /> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/textView1" android:layout_below="@+id/textView1" android:layout_marginTop="80dp" android:text="Login to twitter" /> <EditText android:id="@+id/editText1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:visibility="gone" android:ems="10" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/editText1" android:layout_centerHorizontal="true" android:layout_marginTop="34dp" android:visibility="gone" android:text="Tweets" /> </RelativeLayout>
AlertDialogManager.java
package com.example.twitter_demo; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; public class AlertDialogManager { 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.example.twitter_demo; import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.util.Log; public class ConnectionDetector { private Context _context; public ConnectionDetector(Context context) { this._context = context; } 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) { Log.d("Network", "NETWORKnAME: " + info[i].getTypeName()); return true; } } return false; } }
MainActivity.java
package com.example.twitter_demo; 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 android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; 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.text.Html; import android.util.Log; import android.view.Menu; import android.view.View; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends Activity { static String TWITTER_CONSUMER_KEY = "gWuDKEHVD4Ito3TKNaexmg"; static String TWITTER_CONSUMER_SECRET = "0DYm4kSSOnZ0iYmUojJPZOs0KppYivN9jiVnkba574"; 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"; 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"; ProgressDialog pDialog; private static Twitter twitter; private static RequestToken requestToken; private static SharedPreferences mSharedPreferences; private ConnectionDetector cd; AlertDialogManager alert = new AlertDialogManager(); EditText sts; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); cd = new ConnectionDetector(getApplicationContext()); if (!cd.isConnectingToInternet()) { alert.showAlertDialog(MainActivity.this, "Internet Connection Error", "Please connect to working Internet connection", false); return; } // Check if twitter keys are set if (TWITTER_CONSUMER_KEY.trim().length() == 0 || TWITTER_CONSUMER_SECRET.trim().length() == 0) { alert.showAlertDialog(MainActivity.this, "Twitter oAuth tokens", "Please set your twitter oauth tokens first!", false); return; } mSharedPreferences = getApplicationContext().getSharedPreferences( "MyPref", 0); findViewById(R.id.button1).setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { loginToTwitter(); } }); findViewById(R.id.button2).setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { sts = (EditText) findViewById(R.id.editText1); String status = sts.getText().toString(); if (status.trim().length() > 0) { new updateTwitterStatus().execute(status); } else { Toast.makeText(getApplicationContext(), "Please enter status message", Toast.LENGTH_SHORT).show(); } } }); if (!isTwitterLoggedInAlready()) { Uri uri = getIntent().getData(); if (uri != null && uri.toString().startsWith(TWITTER_CALLBACK_URL)) { if (pDialog == null) { pDialog = new ProgressDialog(MainActivity.this); } pDialog.setMessage("Access Tiwtter..."); pDialog.show(); new AccessTwitter().execute(uri); } } else { findViewById(R.id.button1).setVisibility(View.GONE); findViewById(R.id.editText1).setVisibility(View.VISIBLE); findViewById(R.id.button2).setVisibility(View.VISIBLE); } } private ProgressDialog getProgressDialog() { ProgressDialog progressDialog = new ProgressDialog(MainActivity.this); progressDialog.setTitle("login..."); progressDialog.setMessage("please wait..."); return progressDialog; } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. return true; } private void loginToTwitter() { 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(); new RequestTwitter().execute(); } else { Toast.makeText(getApplicationContext(), "Already Logged into twitter", Toast.LENGTH_LONG).show(); } } private class RequestTwitter extends AsyncTask<String, String, String> { @Override protected String doInBackground(String... params) { try { requestToken = twitter .getOAuthRequestToken(TWITTER_CALLBACK_URL); } catch (TwitterException e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(String result) { if (requestToken != null) { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(requestToken.getAuthenticationURL())); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); MainActivity.this.startActivity(intent); } else { Log.e("TAG", "requstToken error"); } super.onPostExecute(result); } } private class AccessTwitter extends AsyncTask<Uri, String, Boolean> { @Override protected Boolean doInBackground(Uri... params) { Uri uri = params[0]; if (uri != null && uri.toString().startsWith(TWITTER_CALLBACK_URL)) { String verifier = uri .getQueryParameter(URL_TWITTER_OAUTH_VERIFIER); try { AccessToken accessToken = twitter.getOAuthAccessToken( requestToken, verifier); // Shared Preferences Editor e = mSharedPreferences.edit(); e.putString(PREF_KEY_OAUTH_TOKEN, accessToken.getToken()); e.putString(PREF_KEY_OAUTH_SECRET, accessToken.getTokenSecret()); e.putBoolean(PREF_KEY_TWITTER_LOGIN, true); e.commit(); Log.e("Twitter OAuth Token", "> " + accessToken.getToken()); long userID = accessToken.getUserId(); User user = twitter.showUser(userID); String username = user.getName(); Log.e("UserID: ", "userID: " + userID + "" + username); Log.v("Welcome:", "Thanks:" + Html.fromHtml("<b>Welcome " + username + "</b>")); return true; } catch (Exception e) { Log.e("Twitter Login Error", "> " + e.getMessage(), e); } } return false; } @Override protected void onPostExecute(Boolean result) { pDialog.dismiss(); if (result) { findViewById(R.id.button1).setVisibility(View.GONE); findViewById(R.id.editText1).setVisibility(View.VISIBLE); findViewById(R.id.button2).setVisibility(View.VISIBLE); } else { Log.e("TAG", "accessToken error"); } super.onPostExecute(result); } } private boolean isTwitterLoggedInAlready() { return mSharedPreferences.getBoolean(PREF_KEY_TWITTER_LOGIN, false); } class updateTwitterStatus extends AsyncTask<String, String, String> { @Override protected void onPreExecute() { super.onPreExecute(); if (pDialog == null) { pDialog = new ProgressDialog(MainActivity.this); } pDialog.setMessage("Updating to twitter..."); pDialog.setIndeterminate(false); pDialog.setCancelable(false); pDialog.show(); } 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()); } return null; } 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 sts.setText(""); } }); } } }