Twitter模块开发

简介:  Twitter模块开发 关于Twitter这一块,自发这篇博文之后有很多人问我,有的验证成功了不跳转,或者其它原因什么的 =======我看了一下,这篇博文里面有写呀,下面以红色粗体文字注明一下  Twitter和Facebook,就类似于国内的微博,或者分享功...

 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;

public class  CONST {
public static final  String CONSUMER_KEY  = " IFkj4coaZ9F9Ngfoe1LFuQ " ;
public static final  String CONSUMER_SECRET  = " HN2NfE4mtL7OqJaUirWfRnK9XKhyWG2vZmAj6AFwfJ8 " ;
public static final  String REQUEST_TOKEN_URL  = " https://api.twitter.com/oauth/request_token " ;
public static final  String ACCESS_TOKEN_URL  = " https://api.twitter.com/oauth/access_token " ;
public static final  String CALLBACK_URL  = " https://api.twitter.com/oauth/authorize " ;
public static final  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;

public class  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
public void  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;
private int  selectionStart;
private int  selectionEnd;

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

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

@Override
public void  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
public void  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
protected void  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();
}
}

}

public void  sendMessage() {
new  Send().start();
}

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

@Override
protected void  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;

public class  TwitterConnect {
Context context;
public static  Twitter twitter;
public static  RequestToken requestToken;
public static  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
*/
public boolean  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;

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

ConnectTask task;

String oauthToken;
String oauthVerifier;

Bitmap userImage;
//  用户头像

@Override
protected void  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
public boolean  shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true ;
}

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

}

//  页面载入完成
@Override
public void  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 ];
else if  (param[ 1 ].startsWith( " oauth_token " )) {
oauthToken 
=  param[ 1 ].split( " = " )[ 1 ];
}
if  (param[ 0 ].startsWith( " oauth_verifier " )) {
oauthVerifier 
=  param[ 0 ].split( " = " )[ 1 ];
else if  (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
public void  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
protected void  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
protected void  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
public boolean  onKeyDown( int  keyCode, KeyEvent event) {
if  (keyCode  ==  KeyEvent.KEYCODE_BACK  &&  webview.canGoBack()) {
webview.goBack();
return true ;
}
return super .onKeyDown(keyCode, event);
}
}
相关文章
|
JavaScript PHP 开发工具
web如何将动态内容分享到Facebook,Twitter等社交平台
web如何将动态内容分享到Facebook,Twitter等社交平台
1092 0
|
4月前
|
前端开发 JavaScript 数据库
Flask狼书笔记 | 09_图片社交网站 - 大型项目的架构与需求(2)
9.8 收藏图片 前面已经学习过如何使用关联表来表示多对多关系,缺点是只能表示关系,不能存储数据(如我还想记录下收藏图片的时间戳)。这种情况下,我们可以使用关联模型来表示多对多关系。 在关联模型中,我们将Photo模型与User模型的多对多关系,分离成了User模型和Collect模型的一对多关系,和Photo模型与Collect模型的一对多关系。
66 0
|
4月前
|
存储 前端开发 JavaScript
Flask狼书笔记 | 09_图片社交网站 - 大型项目的架构与需求(1)
9 图片社交网站 本章新涉及的Python包:Flask-Dropzone, Pillow, Flask-Avatars, Whoosh, Flask-Whooshee。 9.1 项目组织架构 1、功能式架构
52 0
|
9月前
|
Web App开发 前端开发 JavaScript
全网最详细的谷歌插件开发小册📚(1)
Chrome插件 Chrome插件,或称为扩展,是一种专为Google Chrome浏览器设计的软件应用程序。插件可以让开发者向浏览器中添加新的特性或功能,或者对现有的功能进行增强或改变。从改变浏览器的视觉主题,到阻止广告,从管理密码到加强网络安全,Chrome插件的使用场景几乎无所不包,给用户带来高度定制化的浏览体验。 插件运行在Chrome浏览器的沙盒环境中,这意味着它们在浏览器中执行,但不会影响到计算机的其他部分。这种设计保证了浏览器的稳定性和用户的安全。 插件的开发主要依赖于Web技术,包括HTML、CSS和JavaScript,因此,任何有Web开发经验的人都能够相对容易地开始Chr
610 0
|
10月前
|
敏捷开发 存储 JavaScript
基于Vue框架的思源新闻发布平台设计与实现(论文+源码)_kaic
经过针对全校随机抽取的100名学生进行的研究发现,有约69%的学生,并不关心思源新闻,一些学生表示思源每天发生的大小事与他们无关。这项调查突显了需要提供一个能激发学生对思源校园新闻感兴趣的平台。因此本文为思源学院全院师生设计一个基于Vue框架的思源新闻发布平台,以解决校园新闻发布的不便利和信息化程度不高的问题。 本课题主要对基于Vue框架的思源新闻发布平台网站的设计与开发进行研究。论文首先描述了课题的研究背景、目的和意义,然后通过可行性分析和需求分析确定了系统开发方向。思源新闻发布平台主要采用了敏捷开发方法,通过不断迭代和反馈,不断完善系统功能和界面设计。在技术选型上,本系统采用了MySQL数
|
存储 缓存 搜索推荐
从 0 开始设计 Twitter 系统架构
从 0 开始设计 Twitter 系统架构
790 0
从 0 开始设计 Twitter 系统架构
DHL
|
算法 Java Android开发
Twitter 上有趣的代码
这是海外一位 Kotlin GDE 大佬,在 Twitter 上分享的一段代码,你能快速的说出正确的结果吗
DHL
137 0
Twitter 上有趣的代码
|
Web App开发 数据采集 移动开发
我对 Twitter 前 10 行源代码的理解
本文最初发布于 CSS-Tricks 博客,由 InfoQ 中文站翻译并分享。
292 0
我对 Twitter 前 10 行源代码的理解
|
Apache 关系型数据库 MySQL
twitter系统架构分析
58沈剑:原文作者不容易,收集了好些资料,此文以作阅读笔记。
1201 0