zoukankan      html  css  js  c++  java
  • Twitter模块开发

     Twitter模块开发

    关于Twitter这一块,自发这篇博文之后有很多人问我,有的验证成功了不跳转,或者其它原因什么的

    =======我看了一下,这篇博文里面有写呀,下面以红色粗体文字注明一下

     Twitter和Facebook,就类似于国内的微博,或者分享功能,点击某个按钮,出来一个提示框,可以分享到某些地方,这里实现的就是分享到Twitter,当然得要使用代理,因为这是给老外做的,所以得符合他们的习惯

    先说一下实现的功能吧,首先运行的时候,会检查是否登陆twitter(通过SharedPreference文件保存登陆状态),如果没有登陆的话会跳转到twitter的登陆认证页面,提示用户输入用户名和密码,这些就是OAuth认证的步骤,不懂的看这儿

    http://blog.csdn.net/djy1992/article/details/9378035

    做过新浪微博的都应该知道,首先要申请成为开发者,创建自己的应用,然后会给你一些比如Consumer key和Consumer secret之类的东西,这些东西要先记下来,代码里面要用到的,其余的不啰嗦了,只是要注意一点,创建Twitter应用的时候千万不能忘了填那个Callback URL,我当初就没填,结果整了几天都整不出来结果,也算是我的一点经验吧,下面贴代码,以便于以后查阅

    首先我们要用到Twitter封闭好的一些包,这里用到两个twitter4j-core-android和twitter4j-media-support-android,百度一下就出来了

    以下是工程目录结构

    复制代码
    package com.twitter;

    publicclass CONST {
    publicstaticfinal String CONSUMER_KEY ="IFkj4coaZ9F9Ngfoe1LFuQ";
    publicstaticfinal String CONSUMER_SECRET ="HN2NfE4mtL7OqJaUirWfRnK9XKhyWG2vZmAj6AFwfJ8";
    publicstaticfinal String REQUEST_TOKEN_URL ="https://api.twitter.com/oauth/request_token";
    publicstaticfinal String ACCESS_TOKEN_URL ="https://api.twitter.com/oauth/access_token";
    publicstaticfinal String CALLBACK_URL ="https://api.twitter.com/oauth/authorize";
    publicstaticfinal String TWITPIC_API_KEY ="a77709ebb6c51de0e77f723751a5f9a4";
    }
    复制代码

    下面是Twitter类(主类)

    复制代码
    package com.twitter;

    import java.io.IOException;
    import java.io.InputStream;

    import twitter4j.TwitterFactory;
    import twitter4j.conf.ConfigurationBuilder;
    import android.app.Activity;
    import android.app.ProgressDialog;
    import android.content.Context;
    import android.content.Intent;
    import android.content.SharedPreferences;
    import android.content.res.AssetManager;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.text.Editable;
    import android.text.TextWatcher;
    import android.util.Log;
    import android.view.View;
    import android.view.Window;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;
    import android.widget.Toast;

    publicclass Twitter extends Activity {
    EditText et_content;
    // 评论内容
    EditText et_des;// 图片描述
    TextView tv_num;// 剩余字数
    Button btn_send;// 发送按钮

    int num =140;// 定义总字数

    ProgressDialog progressDialog;
    // 当点击发送的时候显示此进度条

    SharedPreferences spf;
    TwitterConnect tc;
    // 定义一个twitter连接对象
    boolean connectionStatus =false;// 定义当前的连接状态为false

    String content;
    String describle;

    @Override
    publicvoid onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.twitter);
    tc 
    =new TwitterConnect(this);
    spf 
    = getSharedPreferences("bravesoft", Context.MODE_PRIVATE);
    et_content 
    = (EditText) findViewById(R.id.et_content);
    et_des 
    = (EditText) findViewById(R.id.et_des);
    tv_num 
    = (TextView) findViewById(R.id.tv_num);
    tv_num.setText(
    "140");

    progressDialog 
    =new ProgressDialog(this);
    progressDialog.setTitle(
    "正在发送...");
    progressDialog.setMessage(
    "正在发送,请稍候...");

    et_content.addTextChangedListener(
    new TextWatcher() {
    private CharSequence temp;
    privateint selectionStart;
    privateint selectionEnd;

    @Override
    publicvoid onTextChanged(CharSequence s, int start, int before,
    int count) {
    temp 
    = s;// 显示当前输入框中的所有内容
    }

    @Override
    publicvoid beforeTextChanged(CharSequence s, int start, int count,
    int after) {
    }

    @Override
    publicvoid afterTextChanged(Editable s) {
    int number = num - s.length();
    tv_num.setText(
    ""+ number);
    selectionStart 
    = et_content.getSelectionStart();
    selectionEnd 
    = et_content.getSelectionEnd();
    if (temp.length() > num) {
    s.delete(selectionStart 
    -1, selectionEnd);
    int tempSelection = selectionStart;
    et_content.setText(s);
    et_content.setSelection(tempSelection);
    // 设置光标在最后
    }
    }
    });
    btn_send 
    = (Button) findViewById(R.id.btn_send);
    connectionStatus 
    = spf.getBoolean("connection_tatus"false);
    btn_send.setOnClickListener(
    new OnClickListener() {

    @Override
    publicvoid onClick(View v) {
    content 
    = et_content.getText().toString();// 得到评论内容
    describle = et_des.getText().toString();// 得到图片描述内容
    if (connectionStatus) {// 如果用户处于登陆状态,获取用户头像跟name
    progressDialog.show();
    GetUserInfoTask getUserInfoTask 
    =new GetUserInfoTask();
    getUserInfoTask.execute(
    "");
    }
    }
    });

    if (!connectionStatus) {
    btn_send.setEnabled(
    false);
    sendMessage();
    }

    }

    /**
    * 如果用户处于登陆状态,获取用户头像跟name

    @author Administrator

    */
    class GetUserInfoTask extends AsyncTask<String, Integer, String> {

    @Override
    protected String doInBackground(String... params) {
    String result 
    ="";
    ConfigurationBuilder confBuild 
    =new ConfigurationBuilder();
    confBuild.setOAuthConsumerKey(CONST.CONSUMER_KEY);
    confBuild.setOAuthConsumerSecret(CONST.CONSUMER_SECRET);
    confBuild.setOAuthAccessToken(spf.getString(
    "oauth_token"""));
    confBuild.setOAuthAccessTokenSecret(spf.getString(
    "oauth_token_secret"""));
    twitter4j.conf.Configuration config 
    = confBuild.build();
    if (TwitterConnect.twitter !=null)
    TwitterConnect.twitter.shutdown();
    TwitterConnect.twitter 
    =new TwitterFactory(config).getInstance();
    InputStream input 
    =null;
    try {
    TwitterConnect.accessToken 
    = TwitterConnect.twitter
    .getOAuthAccessToken();
    boolean bTest =false;
    AssetManager am 
    = getAssets();
    try {
    input 
    = am.open("btn_dokusya_toukou.png");
    catch (IOException e) {
    e.printStackTrace();
    }

    if (tc ==null) {
    tc 
    =new TwitterConnect(Twitter.this);
    }
    bTest 
    = tc.TwitterContribute(content, input, describle);

    if (bTest) {
    result 
    ="ok";
    else {
    result 
    ="failure";
    }
    catch (Exception e) {

    }
    return result;
    }

    @Override
    protectedvoid onPostExecute(String result) {
    super.onPostExecute(result);
    if (progressDialog.isShowing()) {
    progressDialog.dismiss();
    }
    if (result.equals("ok")) {
    Toast.makeText(Twitter.
    this"发送成功", Toast.LENGTH_LONG).show();
    else {
    Toast.makeText(Twitter.
    this"发送失败", Toast.LENGTH_LONG).show();
    }
    }

    }

    publicvoid sendMessage() {
    new Send().start();
    }

    class Send extends Thread {
    @Override
    publicvoid run() {
    super.run();
    try {
    Thread.sleep(
    3000);
    catch (InterruptedException e) {
    e.printStackTrace();
    }
    Intent intent 
    =new Intent(Twitter.this, TwitterLoginBrowser.class);
    startActivityForResult(intent, 
    1);
    }
    }

    @Override
    protectedvoid onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode ==1) {
    if (resultCode ==1) {// 表示从TwitterLoginBrowser返回
    connectionStatus = spf.getBoolean("connection_tatus"false);
    if (connectionStatus) {
    btn_send.setEnabled(
    true);
    }
    }
    }
    }
    }
    复制代码

    TwitterConnect类

    复制代码
    package com.twitter;

    import java.io.IOException;
    import java.io.InputStream;
    import java.net.URL;

    import twitter4j.Status;
    import twitter4j.Twitter;
    import twitter4j.TwitterException;
    import twitter4j.TwitterFactory;
    import twitter4j.auth.AccessToken;
    import twitter4j.auth.RequestToken;
    import twitter4j.conf.Configuration;
    import twitter4j.conf.ConfigurationBuilder;
    import twitter4j.media.ImageUpload;
    import twitter4j.media.ImageUploadFactory;
    import twitter4j.media.MediaProvider;
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;

    publicclass TwitterConnect {
    Context context;
    publicstatic Twitter twitter;
    publicstatic RequestToken requestToken;
    publicstatic AccessToken accessToken;

    public TwitterConnect(Context context) {
    this.context = context;
    twitter 
    =new TwitterFactory().getInstance();
    }

    public String twitterLoginOAuth() {
    twitter.setOAuthConsumer(CONST.CONSUMER_KEY, CONST.CONSUMER_SECRET);
    try {
    requestToken 
    = twitter.getOAuthRequestToken();
    return requestToken.getAuthenticationURL() +"&force_login=true";
    catch (TwitterException e) {
    e.printStackTrace();
    return"http://www.baidu.com";
    }
    // 已经得到临时访问令牌
    // Request token=7HMpOfNr5ev1kjcW036mDI1hpvycbb1sRkKK3r6Ax30
    // Request token secret=FAhiBFX04lbQhme392htH1LgL8hQxm2p0IJ5Kzlofk
    // url=http://api.twitter.com/oauth/authenticate?oauth_token=svrKsiu1ArJ7h24RvHPHeNnzfXqLIebRY7uefydmB9k
    }

    // 得到用户名
    public String getUserName() {
    try {
    return twitter.showUser(accessToken.getUserId()).getName();
    catch (Exception e) {
    return"";
    }
    }

    // 得到用户头像
    public Bitmap getUserImage(String userImageUrl) {
    Bitmap image 
    =null;
    try {
    URL url 
    =new URL(userImageUrl);
    image 
    = BitmapFactory.decodeStream(url.openStream());
    catch (Exception e) {
    e.printStackTrace();
    }
    return image;
    }

    /**

    @param text
    * 评论内容
    @param input
    * 图片的一个InputStream
    @param description
    * 图片描述
    @return
    */
    publicboolean TwitterContribute(String text, InputStream input,
    String description) {
    boolean isOk =false;
    Configuration config 
    =null;
    ImageUpload uploads 
    =null;
    try {
    Status status 
    =null;
    if (input !=null) {
    if (config ==null) {
    ConfigurationBuilder confBuild 
    =new ConfigurationBuilder();
    confBuild.setOAuthConsumerKey(CONST.CONSUMER_KEY);
    confBuild.setOAuthConsumerSecret(CONST.CONSUMER_SECRET);
    confBuild.setOAuthAccessToken(accessToken.getToken());
    confBuild.setOAuthAccessTokenSecret(accessToken
    .getTokenSecret());
    confBuild.setMediaProviderAPIKey(CONST.TWITPIC_API_KEY);
    // 发送图片和对图片的描述
    config = confBuild.build();
    uploads 
    =new ImageUploadFactory(config)
    .getInstance(MediaProvider.TWITPIC);
    }
    String uploadre 
    ="";
    uploadre 
    = uploads.upload("", input, description);
    System.out.println(
    "uploadre"+ uploadre);
    if (input !=null)
    try {
    input.close();
    catch (IOException e) {
    }
    if (!uploadre.equals("")) {
    status 
    = twitter.updateStatus(text +""+ uploadre);
    System.out.println(
    "uploadre="+ uploadre);
    }
    else {
    status 
    = twitter.updateStatus(text);
    }
    if (status !=null) {
    System.out.println(
    "发表内容:"+ status.getText());
    isOk 
    =true;
    }
    catch (Exception e) {
    isOk 
    =false;
    }
    return isOk;
    }
    }
    复制代码

    TwitterLoginBrowser类

    复制代码
    package com.twitter;

    import twitter4j.TwitterException;
    import android.app.Activity;
    import android.app.ProgressDialog;
    import android.content.Context;
    import android.content.Intent;
    import android.content.SharedPreferences;
    import android.content.SharedPreferences.Editor;
    import android.graphics.Bitmap;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.view.KeyEvent;
    import android.view.Window;
    import android.webkit.WebChromeClient;
    import android.webkit.WebView;
    import android.webkit.WebViewClient;
    import android.widget.Toast;

    publicclass TwitterLoginBrowser extends Activity {
    WebView webview;
    ProgressDialog progressDialog;
    // 定义一个进度条
    TwitterConnect tc;
    String authenticateUrl 
    ="";

    ConnectTask task;

    String oauthToken;
    String oauthVerifier;

    Bitmap userImage;
    // 用户头像

    @Override
    protectedvoid onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.twitter_loginbrowser);
    progressDialog 
    =new ProgressDialog(TwitterLoginBrowser.this);
    progressDialog.setTitle(
    "请等待");
    progressDialog.setMessage(
    "正在加载页面,请稍等...");
    progressDialog.show();
    // 启动的时候就让它显示
    webview = (WebView) findViewById(R.id.webview);
    webview.getSettings().setJavaScriptEnabled(
    true);
    webview.requestFocus();

    tc 
    =new TwitterConnect(this);
    task 
    =new ConnectTask(this);
    task.execute(
    "login");// 执行载入页面任务

    webview.setWebViewClient(
    new WebViewClient() {
    @Override
    publicboolean shouldOverrideUrlLoading(WebView view, String url) {
    view.loadUrl(url);
    returntrue;
    }

    @Override
    publicvoid onPageStarted(WebView view, String url, Bitmap favicon) {
    super.onPageStarted(view, url, favicon);
    System.out.println(
    "开始加载页面:"+ url);

    }

    // 页面载入完成
    @Override
    publicvoid onPageFinished(WebView view, String url) {
    super.onPageFinished(view, url);
    // url=https://api.twitter.com/oauth/authorize?oauth_token=9kpqNY7VhmyWC5NRXF2eQ73zN4VKXjQcgZj62sIZU&oauth_verifier=3B7FBAs9XOYH8I3QEQrFGuqJlgMUfQH5fzmz7j3Ws

    Toast.makeText(TwitterLoginBrowser.
    this"页面加载完成",
    Toast.LENGTH_LONG).show();
    if (url !=null&& url.startsWith(CONST.CALLBACK_URL)) {
    String[] param 
    = url.split("\?")[1].split("&");
    if (param[0].startsWith("oauth_token")) {
    oauthToken 
    = param[0].split("=")[1];
    elseif (param[1].startsWith("oauth_token")) {
    oauthToken 
    = param[1].split("=")[1];
    }
    if (param[0].startsWith("oauth_verifier")) {
    oauthVerifier 
    = param[0].split("=")[1];
    elseif (param[1].startsWith("oauth_verifier")) {
    oauthVerifier 
    = param[1].split("=")[1];
    }
    System.out.println(
    "oauthToken="+ oauthToken);
    System.out.println(
    "oauthVerifier="+ oauthVerifier);
    try {
    TwitterConnect.accessToken 
    = TwitterConnect.twitter
    .getOAuthAccessToken(
    TwitterConnect.requestToken,
    oauthVerifier);
    WebTask wt 
    =new WebTask();
    wt.execute(
    "");
    catch (TwitterException e) {
    e.printStackTrace();
    System.out.println(
    "发生错误了");
    }
    }
    }
    });
    webview.setWebChromeClient(
    new WebChromeClient() {
    // 控制进度条的显示
    @Override
    publicvoid onProgressChanged(WebView view, int newProgress) {
    super.onProgressChanged(view, newProgress);
    if (newProgress !=100) {
    if (!progressDialog.isShowing()) {
    progressDialog.show();
    }
    else {
    if (progressDialog.isShowing()) {
    progressDialog.dismiss();
    }
    }
    }
    });
    }

    // 获取用户名和头像
    class WebTask extends AsyncTask<String, Integer, String> {

    @Override
    protected String doInBackground(String... params) {
    String result 
    ="";
    if (oauthToken !=null&& oauthVerifier !=null) {
    System.out.println(
    "开始获取用户名和头像");
    String userImageUrl 
    ="";// 用户头像url
    try {
    userImageUrl 
    = TwitterConnect.twitter
    .showUser(TwitterConnect.accessToken.getUserId())
    .getProfileImageURL().toString();
    catch (TwitterException e) {
    e.printStackTrace();
    }
    String userName 
    = tc.getUserName();
    if (userImage !=null) {
    userImage.recycle();
    }
    userImage 
    = tc.getUserImage(userImageUrl);
    // 登陆成功 回到来的画面
    Intent intent =new Intent();
    Bundle bundle 
    =new Bundle();
    bundle.putParcelable(
    "userImage", userImage);
    bundle.putString(
    "userName", userName);
    intent.putExtra(
    "userInfo", bundle);
    // 保存登陆状态
    SharedPreferences spf = getSharedPreferences("bravesoft",
    Context.MODE_PRIVATE);
    Editor editor 
    = spf.edit();
    editor.putString(
    "oauth_token",
    TwitterConnect.accessToken.getToken());
    editor.putString(
    "oauth_token_secret",
    TwitterConnect.accessToken.getTokenSecret());
    editor.putBoolean(
    "connection_tatus"true);
    editor.putString(
    "username", userName);
    editor.putString(
    "userimgurl", userImageUrl);
    editor.commit();
    TwitterLoginBrowser.
    this.setResult(1, intent);
    bundle.clear();
    result 
    ="ok";
    }
    return result;
    }

    @Override
    protectedvoid onPostExecute(String result) {
    super.onPostExecute(result);
    if (result.equals("ok")) {
    Toast.makeText(TwitterLoginBrowser.
    this"登陆成功",
    Toast.LENGTH_LONG).show();
    else {
    Toast.makeText(TwitterLoginBrowser.
    this"登陆失败",
    Toast.LENGTH_LONG).show();
    }
    // TwitterLoginBrowser.this.finish();
    }

    }

    class ConnectTask extends AsyncTask<String, Integer, String> {

    public ConnectTask(Context context) {

    }

    @Override
    protected String doInBackground(String... params) {
    authenticateUrl 
    = tc.twitterLoginOAuth();
    return authenticateUrl;
    }

    @Override
    protectedvoid onPostExecute(String result) {
    super.onPostExecute(result);
    if (!result.equals("")) {
    webview.loadUrl(result);
    // 载入网页
    else {
    Toast.makeText(TwitterLoginBrowser.
    this"载入错误,请重试",
    Toast.LENGTH_LONG).show();
    TwitterLoginBrowser.
    this.finish();
    }
    }

    }

    @Override
    publicboolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK && webview.canGoBack()) {
    webview.goBack();
    returntrue;
    }
    returnsuper.onKeyDown(keyCode, event);
    }
    }
  • 相关阅读:
    Struts2SpringHibernate整合示例,一个HelloWorld版的在线书店(项目源码+详尽注释+单元测试)
    Java实现蓝桥杯勇者斗恶龙
    Java实现 LeetCode 226 翻转二叉树
    Java实现 LeetCode 226 翻转二叉树
    Java实现 LeetCode 226 翻转二叉树
    Java实现 LeetCode 225 用队列实现栈
    Java实现 LeetCode 225 用队列实现栈
    Java实现 LeetCode 225 用队列实现栈
    Java实现 LeetCode 224 基本计算器
    Java实现 LeetCode 224 基本计算器
  • 原文地址:https://www.cnblogs.com/new0801/p/6175871.html
Copyright © 2011-2022 走看看