Twitter模块开发

来源:互联网 发布:java培训出来找工作 编辑:程序博客网 时间:2024/04/30 11:26

 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);
}
}