继上面一片介绍了FaceBook的登录和分享,现在再来实现Twitter的登录和分享。

1.首先要说明的是,我没找到官方提供的SDK,查阅很多文章都提到了一个帮助实现的包Twitter4j.jar

 此处不给连接了 自行百度下载吧,git上面也有。


2. 到官网去申请自己的app

着吏要注意 申请之后的设置Setting 里面去设置获取相关的Key    permissions设置读写的权限

提别注意一个callback url,回调的链接。


3. OK我们现在可以开始写代码了

本人代码中有四个类(前提 导入了所需的jar包)

TwitterApp  管理    

TwitterDialog窗口显示   

TwitterSession数据存储   

 TwitterTest Activity

public class TwitterApp {

private Twitter mTwitter;

private TwitterSession mSession;

private AccessToken mAccessToken;

private CommonsHttpOAuthConsumer mHttpOauthConsumer;

private OAuthProvider mHttpOauthprovider;

private String mConsumerKey;

private String mSecretKey;

private ProgressDialog mProgressDlg;

private TwDialogListener mListener;

private Context context;


public static final String CALLBACK_URL = "twitterapp://connect";

private static final String TAG = "TwitterApp";


public TwitterApp(Context context, String consumerKey, String secretKey) {

this.context = context;


mTwitter = new TwitterFactory().getInstance();

mSession = new TwitterSession(context);

mProgressDlg = new ProgressDialog(context);


mProgressDlg.requestWindowFeature(Window.FEATURE_NO_TITLE);


mConsumerKey = consumerKey;

mSecretKey = secretKey;


mHttpOauthConsumer = new CommonsHttpOAuthConsumer(mConsumerKey, mSecretKey);

mHttpOauthprovider = new DefaultOAuthProvider("https://api.twitter.com/oauth/request_token",

"https://api.twitter.com/oauth/access_token",

"https://api.twitter.com/oauth/authorize");


mAccessToken = mSession.getAccessToken();


configureToken();

}


public void setListener(TwDialogListener listener) {

mListener = listener;

}


@SuppressWarnings("deprecation")

private void configureToken() {

if (mAccessToken != null) {

mTwitter.setOAuthConsumer(mConsumerKey, mSecretKey);


mTwitter.setOAuthAccessToken(mAccessToken);

}

}


public boolean hasAccessToken() {

return (mAccessToken == null) ? false : true;

}


public void resetAccessToken() {

if (mAccessToken != null) {

mSession.resetAccessToken();


mAccessToken = null;

}

}


public String getUsername() {

return mSession.getUsername();

}


public void updateStatus(String status) throws Exception {

try {

mTwitter.updateStatus(status);

} catch (TwitterException e) {

throw e;

}

}


public void authorize() {

mProgressDlg.setMessage("Initializing ...");

mProgressDlg.show();


new Thread() {

@Override

public void run() {

String authUrl = "";

int what = 1;


try {

authUrl = mHttpOauthprovider.retrieveRequestToken(mHttpOauthConsumer, CALLBACK_URL);


what = 0;


Log.d(TAG, "Request token url " + authUrl);

} catch (Exception e) {

Log.d(TAG, "Failed to get request token");


e.printStackTrace();

}


mHandler.sendMessage(mHandler.obtainMessage(what, 1, 0, authUrl));

}

}.start();

}


public void processToken(String callbackUrl)  {

mProgressDlg.setMessage("Finalizing ...");

mProgressDlg.show();


final String verifier = getVerifier(callbackUrl);


new Thread() {

@Override

public void run() {

int what = 1;


try {

mHttpOauthprovider.retrieveAccessToken(mHttpOauthConsumer, verifier);


mAccessToken = new AccessToken(mHttpOauthConsumer.getToken(), mHttpOauthConsumer.getTokenSecret());


configureToken();


User user = mTwitter.verifyCredentials();


       mSession.storeAccessToken(mAccessToken, user.getName());


       what = 0;

} catch (Exception e){

Log.d(TAG, "Error getting access token");


e.printStackTrace();

}


mHandler.sendMessage(mHandler.obtainMessage(what, 2, 0));

}

}.start();

}


private String getVerifier(String callbackUrl) {

String verifier = "";


try {

callbackUrl = callbackUrl.replace("twitterapp", "http");


URL url = new URL(callbackUrl);

String query = url.getQuery();


String array[] = query.split("&");


for (String parameter : array) {

            String v[] = parameter.split("=");


            if (URLDecoder.decode(v[0]).equals(oauth.signpost.OAuth.OAUTH_VERIFIER)) {

            verifier = URLDecoder.decode(v[1]);

            break;

            }

       }

} catch (MalformedURLException e) {

e.printStackTrace();

}


return verifier;

}


private void showLoginDialog(String url) {

final TwDialogListener listener = new TwDialogListener() {

@Override

public void onComplete(String value) {

processToken(value);

}


@Override

public void onError(String value) {

mListener.onError("Failed opening authorization page");

}

};


new TwitterDialog(context, url, listener).show();

}


private Handler mHandler = new Handler() {

@Override

public void handleMessage(Message msg) {

mProgressDlg.dismiss();


if (msg.what == 1) {

if (msg.arg1 == 1)

mListener.onError("Error getting request token");

else

mListener.onError("Error getting access token");

} else {

if (msg.arg1 == 1)

showLoginDialog((String) msg.obj);

else

mListener.onComplete("");

}

}

};


public interface TwDialogListener {

public void onComplete(String value);


public void onError(String value);

}

}


public class TwitterDialog extends Dialog {


    static final float[] DIMENSIONS_LANDSCAPE = {460, 260};

    static final float[] DIMENSIONS_PORTRAIT = {280, 420};

    static final FrameLayout.LayoutParams FILL = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,

                          ViewGroup.LayoutParams.FILL_PARENT);

    static final int MARGIN = 4;

    static final int PADDING = 2;


    private String mUrl;

    private TwDialogListener mListener;

    private ProgressDialog mSpinner;

    private WebView mWebView;

    private LinearLayout mContent;

    private TextView mTitle;


    private static final String TAG = "Twitter-WebView";


    public TwitterDialog(Context context, String url, TwDialogListener listener) {

        super(context);


        mUrl = url;

        mListener = listener;

    }


    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);


        mSpinner = new ProgressDialog(getContext());


        mSpinner.requestWindowFeature(Window.FEATURE_NO_TITLE);

        mSpinner.setMessage("Loading...");


        mContent = new LinearLayout(getContext());


        mContent.setOrientation(LinearLayout.VERTICAL);


        setUpTitle();

        setUpWebView();


        Display display = getWindow().getWindowManager().getDefaultDisplay();

        final float scale = getContext().getResources().getDisplayMetrics().density;

        float[] dimensions = (display.getWidth() < display.getHeight()) ? DIMENSIONS_PORTRAIT : DIMENSIONS_LANDSCAPE;


        addContentView(mContent, new FrameLayout.LayoutParams((int) (dimensions[0] * scale + 0.5f),

        (int) (dimensions[1] * scale + 0.5f)));

    }


    private void setUpTitle() {

        requestWindowFeature(Window.FEATURE_NO_TITLE);


        Drawable icon = getContext().getResources().getDrawable(R.drawable.com_facebook_logo);


        mTitle = new TextView(getContext());


        mTitle.setText("Twitter");

        mTitle.setTextColor(Color.WHITE);

        mTitle.setTypeface(Typeface.DEFAULT_BOLD);

        mTitle.setBackgroundColor(0xFFbbd7e9);

        mTitle.setPadding(MARGIN + PADDING, MARGIN, MARGIN, MARGIN);

        mTitle.setCompoundDrawablePadding(MARGIN + PADDING);

        mTitle.setCompoundDrawablesWithIntrinsicBounds(icon, null, null, null);


        mContent.addView(mTitle);

    }


    private void setUpWebView() {

        mWebView = new WebView(getContext());


        mWebView.setVerticalScrollBarEnabled(false);

        mWebView.setHorizontalScrollBarEnabled(false);

        mWebView.setWebViewClient(new TwitterWebViewClient());

        mWebView.getSettings().setJavaScriptEnabled(true);

        mWebView.loadUrl(mUrl);

        mWebView.setLayoutParams(FILL);


        mContent.addView(mWebView);

    }


    private class TwitterWebViewClient extends WebViewClient {


        @Override

        public boolean shouldOverrideUrlLoading(WebView view, String url) {

        Log.d(TAG, "Redirecting URL " + url);


        if (url.startsWith(TwitterApp.CALLBACK_URL)) {

        mListener.onComplete(url);


        TwitterDialog.this.dismiss();


        return true;

        }  else if (url.startsWith("authorize")) {

        return false;

        }


            return true;

        }


        @Override

        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {

        Log.d(TAG, "Page error: " + description);


            super.onReceivedError(view, errorCode, description, failingUrl);


            mListener.onError(description);


            TwitterDialog.this.dismiss();

        }


        @Override

        public void onPageStarted(WebView view, String url, Bitmap favicon) {

            Log.d(TAG, "Loading URL: " + url);

            super.onPageStarted(view, url, favicon);

            mSpinner.show();

        }


        @Override

        public void onPageFinished(WebView view, String url) {

            super.onPageFinished(view, url);

            String title = mWebView.getTitle();

            if (title != null && title.length() > 0) {

                mTitle.setText(title);

            }

            mSpinner.dismiss();

        }


    }

}


public class TwitterSession {

private SharedPreferences sharedPref;

private Editor editor;


private static final String TWEET_AUTH_KEY = "auth_key";

private static final String TWEET_AUTH_SECRET_KEY = "auth_secret_key";

private static final String TWEET_USER_NAME = "user_name";

private static final String SHARED = "Twitter_Preferences";


public TwitterSession(Context context) {

sharedPref  = context.getSharedPreferences(SHARED, Context.MODE_PRIVATE);


editor  = sharedPref.edit();

}


public void storeAccessToken(AccessToken accessToken, String username) {

editor.putString(TWEET_AUTH_KEY, accessToken.getToken());

editor.putString(TWEET_AUTH_SECRET_KEY, accessToken.getTokenSecret());

editor.putString(TWEET_USER_NAME, username);


editor.commit();

}


public void resetAccessToken() {

editor.putString(TWEET_AUTH_KEY, null);

editor.putString(TWEET_AUTH_SECRET_KEY, null);

editor.putString(TWEET_USER_NAME, null);


editor.commit();

}


public String getUsername() {

return sharedPref.getString(TWEET_USER_NAME, "");

}


public AccessToken getAccessToken() {

String token = sharedPref.getString(TWEET_AUTH_KEY, null);

String tokenSecret = sharedPref.getString(TWEET_AUTH_SECRET_KEY, null);


if (token != null && tokenSecret != null) 

return new AccessToken(token, tokenSecret);

else

return null;

}

}


public class TwitterTest extends Activity implements OnClickListener{


private static final String twitter_consumer_key = "i5wpPPqwllrdx2pFr0LdOEXhB";

private static final String twitter_secret_key = "0vAmYSPNP8TI3WSEjcqUrbe50y62JXWbJBDaWco69jpzBZZv7W";

private TwitterApp mTwitter;


private Button m_twitter_login;

private Button m_twitter_share;

private Button m_twitter_login_out;


//Share

private ProgressDialog pDialog;


@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.twitter);


initLayout();


mTwitter = new TwitterApp(this, twitter_consumer_key,twitter_secret_key);

mTwitter.setListener(mTwLoginDialogListener);

}


private void initLayout(){

m_twitter_login = (Button) this.findViewById(R.id.twitter_login);

m_twitter_share = (Button) this.findViewById(R.id.twitter_share);

m_twitter_login_out = (Button) this.findViewById(R.id.twitter_login_out);


m_twitter_login.setOnClickListener(this);

m_twitter_share.setOnClickListener(this);

m_twitter_login_out.setOnClickListener(this);

}


@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.twitter_login:

doLogin();

break;


case R.id.twitter_share:

if(mTwitter.hasAccessToken()){

doShare();

}else{

doLogin();

}


break;


case R.id.twitter_login_out:

doLoginOut();

break;


default:

break;

}

}


private void doLogin() {

if (mTwitter.hasAccessToken()) {

final AlertDialog.Builder builder = new AlertDialog.Builder(this);


builder.setMessage("Delete current Twitter connection?")

      .setCancelable(false)

      .setPositiveButton("Yes", new DialogInterface.OnClickListener() {

          public void onClick(DialogInterface dialog, int id) {

          mTwitter.resetAccessToken();


          }

      })

      .setNegativeButton("No", new DialogInterface.OnClickListener() {

          public void onClick(DialogInterface dialog, int id) {

               dialog.cancel();


          }

      });

final AlertDialog alert = builder.create();


alert.show();

} else {


mTwitter.authorize();

}

}



private void doShare(){

new updateTwitterStatus().execute("123");

}


private void doLoginOut(){

 mTwitter.resetAccessToken();

}


//登录的回调函数

private final TwDialogListener mTwLoginDialogListener = new TwDialogListener() {

@Override

public void onComplete(String value) {

String username = mTwitter.getUsername();

username = (username.equals("")) ? "No Name" : username;


Toast.makeText(TwitterTest.this, "Connected to Twitter as " + username, Toast.LENGTH_LONG).show();


TwitterSession mSession = new TwitterSession(TwitterTest.this);

AccessToken mAccessToken = mSession.getAccessToken();

Toast.makeText(TwitterTest.this, "mAccessToken " + mAccessToken.getToken(), Toast.LENGTH_LONG).show();

}


@Override

public void onError(String value) {

Toast.makeText(TwitterTest.this, "Twitter connection failed", Toast.LENGTH_LONG).show();

}

};



class updateTwitterStatus extends AsyncTask<String, String, String> {


private String shareStatu= null;//分享成功与否


   /**

    * Before starting background thread Show Progress Dialog

    * */

   @Override

   protected void onPreExecute() {

       super.onPreExecute();

       pDialog = new ProgressDialog(TwitterTest.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_secret_key);


           TwitterSession mSession = new TwitterSession(TwitterTest.this);

AccessToken mAccessToken = mSession.getAccessToken();

           // Access Token Access Token Secret

           String access_token = mAccessToken.getToken();

           String access_token_secret = mAccessToken.getTokenSecret();


           AccessToken accessToken = new AccessToken(access_token, access_token_secret);

           Twitter twitter = new TwitterFactory(builder.build()).getInstance(accessToken);


           // Update status

           StatusUpdate mstatus = new StatusUpdate(status);

           mstatus.setMedia(new File("/sdcard/tencent/QQ_Images/99931af6b37591d57906.JPG"));

           twitter4j.Status response = twitter.updateStatus(mstatus);


           shareStatu = "suc";

           Log.d("Status", "> " + response.getText());

       } catch (TwitterException e) {

           // Error in updating status

           Log.d("Twitter Update Error", e.getMessage());

       }

       return shareStatu;

   }


   /**

    * 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

       if(shareStatu == null){

        Toast.makeText(TwitterTest.this, "Fail", Toast.LENGTH_LONG).show();

       }else{

        runOnUiThread(new Runnable() {

           @Override

           public void run() {

               Toast.makeText(getApplicationContext(),

                       "Status tweeted successfully", Toast.LENGTH_SHORT)

                       .show();

           }

       });

       }


   }


}


}

doLogin();doShare();doLoginOut();分别是相应的操作!网页授权


配置文件 没特别说明。联网是必须得。

注意你得twitter_consumer_key和twitter_secret_key是从官网获取得到,

TwitterApp中的url 需要是最新的mHttpOauthprovider = new DefaultOAuthProvider("https://api.twitter.com/oauth/request_token",

"https://api.twitter.com/oauth/access_token",

"https://api.twitter.com/oauth/authorize");


错误提示 ​​​

这个问题困扰了很长时间。后来查看资料有人说是

这不是程序的问题,也不是twitter4j的问题,这是twitter安全机制的问题,你可以在Web端试一下,在一段时间内你是不可以重复推送相同内容的推文的。  

好吧 经过一分钟之后操作就没有相应的提示了!


以上代码 未整理,个人Demo,烦乱之处请谅解。如有更方便和更好的方法,可以学习!



​成功分享