Twitter 登录和分享

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

成功分享

原文地址:https://www.cnblogs.com/android-blogs/p/5968735.html