继上面一片介绍了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,烦乱之处请谅解。如有更方便和更好的方法,可以学习!

成功分享

Twitter 登录和分享的更多相关文章

  1. Android Facebook和Twitter登录和分享完整版

    最近公司的软件需要改国际版,需要Facebook和Twitter的登录和分享. 本人先用Umeng的第三方社会化分享实现了该功能,但是后来一想问题来了,经过查证.Umeng只在中国和美国有服务器,那也 ...

  2. 【转】【Android应用开发详解】第01期:第三方授权认证(一)实现第三方授权登录、分享以及获取用户资料

    转载请注明出处:http://blog.csdn.net/yangyu20121224/article/details/9057257 由于公司项目的需要,要实现在项目中使用第三方授权登录以及分享文字 ...

  3. 【Android应用开发详解】实现第三方授权登录、分享以及获取用户资料

      由于公司项目的需要,要实现在项目中使用第三方授权登录以及分享文字和图片等这样的效果,几经波折,查阅了一番资料,做了一个Demo.实现起来的效果还是不错的,不敢独享,决定写一个总结的教程,供大家互相 ...

  4. 使用ShareSDK实现第三方授权登录、分享以及获取用户资料效果,项目中包含:源码+效果图+项目结构图

    [Android应用开发详解]第01期:第三方授权认证(一)实现第三方授权登录.分享以及获取用户资料   由于公司项目的需要,要实现在项目中使用第三方授权登录以及分享文字和图片等这样的效果,几经波折, ...

  5. Android记录16-友盟第三方登录、分享实现

    Android开发记录16-友盟第三方登录.分享实现 2014年博客之星,投票地址username=wwj_748#content" style="font-family: Kai ...

  6. Android-友盟第三方登录与分享

    ### 前言 最近项目中又一次需要集成友盟的三方登录与分享,之前没有记录过,所以这次来写一下... ### 准备工作 1.注册友盟账号创建应用,获取key:申请地址http://www.umeng.c ...

  7. iOS开发笔记14:微博/微信登录与分享、微信/支付宝支付

    产品中接入了微博/微信的第三方登录分享功能.微信和支付宝的第三方支付功能,之前在开发过程中涉及到这些部分,于是抽空将接入过程梳理了一遍. 1.微博.微信.支付宝SDK相关接入设置 (1)微博SDK S ...

  8. iOS YSAuth 第三方登录及分享

    概述 在很多时候,我们使用的都是第三方插件来处理登录与分享,比如使用友盟.但要是我们需要自己写一套自己的登录.分享.支付的时候,就可以使用YSAuth这个类库. github:https://gith ...

  9. iOS--通过MOB平台实现第三方登录与分享

     适合刚开始接触第三方登录与分享的IOS小白!! 这两天看了一下有关IOS第三方登录与分享的一些知识,发现在QQ开放平台与微信开放平台实现这些功能很繁琐,不容易实现,在导师的推荐下,找到了这样一个平台 ...

随机推荐

  1. poj2429 大数分解+dfs

    //Accepted 172 KB 172 ms //该程序为随机性算法,运行时间不定 #include <cstdio> #include <cstring> #includ ...

  2. 安全增强 Linux (SELinux) 剖析

    架构和实现 Linux® 一直被认为是最安全的操作系统之一,但是通过引入安全增强 Linux(Security-Enhanced Linux,SELinux),National Security Ag ...

  3. (转)经典收藏 50个jQuery Mobile开发技巧集萃

    (原)http://www.cnblogs.com/chu888chu888/archive/2011/11/10/2244181.html 经典收藏 50个jQuery Mobile开发技巧集萃   ...

  4. return, exit, _exit的区别

    return是返回的最常用的方式 _exit属于POSIX定义的系统调用 exit是GLIBC封装之后的函数 1 _exit和exit都会导致整个进程退出,清理进程所占用的资源,但是glibc封装ex ...

  5. iOS计算缓存文件的大小

    //获取缓存文件路径 -(NSString *)getCachesPath{ // 获取Caches目录路径 NSArray *paths = NSSearchPathForDirectoriesIn ...

  6. 禁止VMware用户在系统里删除网卡的操作的方法

    点击选项-常规-配置参数,如下图所示:   8)点击“添加行”,在新的栏目中,左栏输入:devices.hotplug,右边栏输入:false

  7. Median Weight Bead_floyd

    Description There are N beads which of the same shape and size, but with different weights. N is an ...

  8. bat批处理文件命令详解

    bat批处理文件命令详解 echo.@.call.pause.rem(小技巧:用::代替rem)是批处理文件最常用的几个命令 echo 表示显示此命令后的字符  echo off 表示在此语句后所有运 ...

  9. magento问题集2

    SQLSTATE[42S02]: Base table or view not found: 1146 Table XXXXXX 安装Galathemes.com theme插件. 首页无法打开,提示 ...

  10. nginx php-cgi php

    /*************************************************************************** * nginx php-cgi php * 说 ...