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,百度一下就出来了
以下是工程目录结构
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类(主类)
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类
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类
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);
}
}
Twitter模块开发的更多相关文章
- AngularJS多模块开发
angularJS中的多模块开发是指多个module模块开发,步骤为: 1. 确定主模块 var app=angular.module('myApp',[]); 2. 其他的子模块添加到主模块后 ...
- js模块开发(一)
现在嵌入页面里面的javascript代码越来越复杂,于是可能依赖也越来越严重,使用别人开发的js也越来越多,于是在理想情况下,我们只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块. 于是j ...
- seajs实现JavaScript 的 模块开发及按模块加载
seajs实现了JavaScript 的 模块开发及按模块加载.用来解决繁琐的js命名冲突,文件依赖等问题,其主要目的是令JavaScript开发模块化并可以轻松愉悦进行加载. 官方文档:http:/ ...
- 推荐15款最好的 Twitter Bootstrap 开发工具
Twitter Bootstrap 自从2011年最初发布到网上后,迅速成为 Web 领域最流行的响应式前端开发框架之一,是网页设计的优秀实践.Twitter Bootstrap 框架包含了众多的预定 ...
- Asp.net Mvc模块化开发之“开启模块开发、调试的简单愉快之旅”
整个世界林林种种,把所有的事情都划分为对立的两个面. 每个人都渴望的财富划分为富有和贫穷,身高被划分为高和矮,身材被划分为胖和瘦,等等. 我们总是感叹,有钱人的生活我不懂;有钱人又何尝能懂我们每天起早 ...
- 基于ASP.NET MVC的热插拔模块式开发框架(OrchardNoCMS)--模块开发
之前文章中给大家说明了下我这个小小的想法,发现还是有不少人的支持和关注.你们的鼓励是对我最大的支持. 我总结了了大家的评论,有以下几个问题: 1.希望有更多的文档说明. 2.希望介绍下Orchard的 ...
- js 模块开发之一(模块开发价值)
首先引用我们的今天的主角 ----<前端模块化开发的价值> 1,前端开发最常见的两个问题 ---命名冲突和文件依赖 2,对于命名冲突的基本解决办法就是学习其他语言的习惯,添加命名空间 va ...
- nginx模块开发篇 (阿里著作)
背景介绍 nginx历史 使用简介 nginx特点介绍 nginx平台初探(100%) 初探nginx架构(100%) nginx基础概念(100%) connection request 基本数据结 ...
- Drupal8开发教程:模块开发——创建新页面
之前我们已经通过<Drupal8开发教程:认识.info.yml文件>对模块的YAML文件有了了解,今天我们来看如何通过模块开发的方式添加一个新的页面. 在 Drupal 7 中,通过模块 ...
随机推荐
- Flink Program Guide (4) -- 时间戳和Watermark生成(DataStream API编程指导 -- For Java)
时间戳和Watermark生成 本文翻译自Generating Timestamp / Watermarks --------------------------------------------- ...
- python中实现多线程的几种方式
python实现多线程的方式大概有 1.threading 2._thread #!/usr/bin/python #!coding:utf-8 import threading def action ...
- struts2之动态方法调用(转)
转自:http://blog.csdn.net/longwentao/article/details/6940289 当我们访问一个Action时,默认是访问execute()方法,但当在一个Acti ...
- Today See>
http://wenku.baidu.com/view/b08f3575f46527d3240ce061.html http://wenku.baidu.com/view/a3419558be2348 ...
- sed(转)
第一部分:sed基础 1)简介 sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内 ...
- W5300E01-ARM 交叉编译器(Cross Compiler)用户手册
W5300E01-ARM是基于W5300的ARM功能测试评估板: 1 简介 当用户的开发环境与目标系统不同时就会用到交叉编译器. 例如,当开发基于ARM的嵌入式系统时,用户就需要在电脑上写出 ...
- POJ——字符串插入
2:字符串插入 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 有两个字符串str和substr,str的字符个数不超过10,substr的字符个数为3.( ...
- Struts2 一、 视图转发跳转
<struts> <constant name="struts.118n.encoding" value="UTF-8"></co ...
- Minimum Transport Cost(floyd+二维数组记录路径)
Minimum Transport Cost Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/O ...
- T-SQL流程控制
常用的T-SQL流程控制有三种,case ... when ... then...(else)...end (as) ... 判断句式,if判断句式和while循环句式. case...when .. ...