zoukankan      html  css  js  c++  java
  • 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,烦乱之处请谅解。如有更方便和更好的方法,可以学习!

    成功分享

  • 相关阅读:
    Python网络爬虫规则之实例
    Syncthing:同步window和linux文件
    阿里云AIoT云端一体:迎接云原生+低代码时代的到来
    低代码时代的物联网快速构建工具-YFIOs
    阿里云、华为云和腾讯云等多家物联网平台的异同
    全志 Fex文件
    le16_to_cpu
    无线充电技术简介
    AK47所向披靡,内存泄漏一网打尽
    zRAM内存压缩技术原理与应用
  • 原文地址:https://www.cnblogs.com/android-blogs/p/5968735.html
Copyright © 2011-2022 走看看