求一个android新浪微博手机客户端客户端源代码

新浪微博Android客户端源码--终结版 - 移动学院 - 商业、科技及创新平台!
新浪微博Android客户端源码--终结版
乐分享,是一款基于Android的 开源新浪微博客户端。目前支持发布文字、图片、拍照等功能。功能简单,源码开放,供各位Android开发爱好者学习、完善。
依赖项目: 1、新浪微博Api; 2、创新工厂友盟统计服务;
支持平台: Android2.1以及以上
微博地址:
Google Code 主页:Android 新浪微博客户端 - 安卓源码下载 - A5源码
关键字:    
当前位置: >
Android 新浪微博客户端
详细介绍 - [ Android 新浪微博客户端 ]
乐分享是一个开源新浪微博Android客户端。 目前支持发布文字、图片、拍照等功能。功能简单,源代码开放,供各位Android开发爱好者学习、完善。
依赖项目:
1、新浪微博Api;
2、创新工厂友盟统计服务。
下载地址 - [ Android 新浪微博客户端 ]
推荐使用、下载,请使用解压文件;
下载本站资源,如服务器暂不能下载请过一段时间再试;
本站资源通过 、 等软件检测;
本站部分资源供学习交流使用,如商业用途,请购正版。
网友对“Android 新浪微博客户端”的评论
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
上一篇: & 下一篇:
您喜欢这个源码么?
本类热门源码
增值电信业务经营许可证:苏B2-CopyRight ©
All Rights reserved.求一份Touch Android论坛的完整android新浪微博的源码_百度知道
求一份Touch Android论坛的完整android新浪微博的源码
时间又不够:因微博刷新那部分总是报错,本人只有视频要一整个项目文件,所以求一份源码略过那部分,key和secret我自己改PS
我有更好的答案
恩,我给你一个整站下载器,你去下载吧,找我
楼主你找到了么。发我一份也。.我也很着急要啊
求一份新浪微博源码,要回学校了,交项目啊
其他类似问题
为您推荐:
新浪微博的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁2941人阅读
1、发送图片+文字
要特别注意,图片的文件名要为 pic 才会被接收。
Map map = new HashMap();
map.put("source", "appkey");//改成自己的key
map.put("status", txt);
postImg("http://api..cn/statuses/upload.json",map,Environment.getExternalStorageDirectory()+ "/temp.jpg"
,"帐号名字","密码");&
* 直接通过HTTP协议提交数据到服务器,实现表单提交功能
* @param actionUrl 上传路径
* @param params 请求参数 key为参数名,value为参数值
* @param filename 上传文件
* @param username 用户名
* @param password 密码
private void postImg(String actionUrl,Map&String, String& params, String
filename,String username,String password) {
String BOUNDARY = "--------------et567z"; //数据分隔线
String MULTIPART_FORM_DATA = "Multipart/form-data";
URL url = new URL(actionUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true);//允许输入
conn.setDoOutput(true);//允许输出
conn.setUseCaches(false);//不使用Cache
conn.setRequestMethod("POST");
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("Charset", "UTF-8");
conn.setRequestProperty("Content-Type", MULTIPART_FORM_DATA + ";boundary=" + BOUNDARY);
String usernamePassword=username+":"+
conn.setRequestProperty("Authorization","Basic "+new String(SecBase64.encode(usernamePassword.getBytes())));
StringBuilder sb = new StringBuilder();
//上传的表单参数部分,格式请参考文章
for (Map.Entry&String, String& entry : params.entrySet()) {//构建表单字段内容
sb.append("--");
sb.append(BOUNDARY);
sb.append("/r/n");
sb.append("Content-Disposition: form- name=/""+ entry.getKey() + "/"/r/n/r/n");
sb.append(entry.getValue());
sb.append("/r/n");
System.out.println(sb.toString());
DataOutputStream outStream = new DataOutputStream(conn.getOutputStream());
outStream.write(sb.toString().getBytes());//发送表单字段数据
byte[] content = readFileImage(filename);
//上传的文件部分,格式请参考文章
//System.out.println("content:"+content.toString());
StringBuilder split = new StringBuilder();
split.append("--");
split.append(BOUNDARY);
split.append("/r/n");
split.append("Content-Disposition: form-name=/"pic/";filename=/"temp.jpg/"/r/n");
split.append("Content-Type: image/jpg/r/n/r/n");
System.out.println(split.toString());
outStream.write(split.toString().getBytes());
outStream.write(content, 0, content.length);
outStream.write("/r/n".getBytes());
byte[] end_data = ("--" + BOUNDARY + "--/r/n").getBytes();//数据结束标志
outStream.write(end_data);
outStream.flush();
int cah = conn.getResponseCode();
if (cah != 200) throw new RuntimeException("请求url失败:"+cah);
if(cah == 200)//如果发布成功则提示成功
/*读返回数据*/
//String strResult = EntityUtils.toString(httpResponse.getEntity());
new AlertDialog.Builder(Main.this)
// Main.this视情况而定,这个一般是指当前显示的Activity对应的XML视窗。
.setTitle("")// 设置对话框的标题
.setPositiveButton("确定",// 设置对话框的确认按钮
new DialogInterface.OnClickListener() {// 设置确认按钮的事件
public void onClick(DialogInterface dialog, int which) {
.setMessage(" 发布成功 ")// 设置对话框的内容
else if(cah == 400)
new AlertDialog.Builder(Main.this)
// Main.this视情况而定,这个一般是指当前显示的Activity对应的XML视窗。
.setTitle("")// 设置对话框的标题
.setPositiveButton("确定",// 设置对话框的确认按钮
new DialogInterface.OnClickListener() {// 设置确认按钮的事件
public void onClick(DialogInterface dialog, int which) {
.setMessage(" 发布失败
/n 不可连续发布相同内容 ")// 设置对话框的内容
throw new RuntimeException("请求url失败:"+cah);
InputStream is = conn.getInputStream();
StringBuilder b = new StringBuilder();
while( (ch = is.read()) != -1 ){
b.append((char)ch);
outStream.close();
conn.disconnect();
catch (IOException e)
e.printStackTrace();
catch (Exception e)
e.printStackTrace();
public static byte[] readFileImage(String filename) throws IOException {
BufferedInputStream bufferedInputStream = new BufferedInputStream(
new FileInputStream(filename));
int len = bufferedInputStream.available();
byte[] bytes = new byte[len];
int r = bufferedInputStream.read(bytes);
if (len != r) {
throw new IOException("读取文件不正确");
bufferedInputStream.close();
2、只发文字
//POST发布文本信息
void sendMsg(String status,String username,String password){
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://api..cn/statuses/update.json");
//NameValuePair实现请求参数的封装
params = new ArrayList ();
params.add(new BasicNameValuePair("source", ""));
params.add(new BasicNameValuePair("status", status));
//添加请求参数到请求对象
httppost.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
httppost.getParams().setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, false);
String data=username+":"+
httppost.addHeader("Authorization","Basic "+new String(SecBase64.encode(data.getBytes())));
httppost.addHeader("Content-Type", "application/x-www-form-urlencoded");
//发送请求并等待响应
HttpResponse httpResponse = new DefaultHttpClient().execute(httppost);
//若状态码为200 ok
if(httpResponse.getStatusLine().getStatusCode() == 200)
//读返回数据
//String strResult = EntityUtils.toString(httpResponse.getEntity());
new AlertDialog.Builder(Main.this)
// Main.this视情况而定,这个一般是指当前显示的Activity对应的XML视窗。
.setTitle("")// 设置对话框的标题
.setPositiveButton("确定",// 设置对话框的确认按钮
new DialogInterface.OnClickListener() {// 设置确认按钮的事件
public void onClick(DialogInterface dialog, int which) {
.setMessage(" 发布成功 ")// 设置对话框的内容
else if(httpResponse.getStatusLine().getStatusCode() == 400)
new AlertDialog.Builder(Main.this)
// Main.this视情况而定,这个一般是指当前显示的Activity对应的XML视窗。
.setTitle("")// 设置对话框的标题
.setPositiveButton("确定",// 设置对话框的确认按钮
new DialogInterface.OnClickListener() {// 设置确认按钮的事件
public void onClick(DialogInterface dialog, int which) {
.setMessage(" 发布失败
/n 不可连续发布相同内容 ")// 设置对话框的内容
catch (ClientProtocolException e)
e.printStackTrace();
et.setText(et.getText()+" Error1:"+e.getMessage());
catch (IOException e)
e.printStackTrace();
et.setText(et.getText()+" Error2:"+e.getMessage());
catch (Exception e)
e.printStackTrace();
et.setText(et.getText()+" Error3:"+e.getMessage());
3、加密类 SecBase64.java
public class SecBase64 {
private static final byte[] encodingTable = { (byte) 'A', (byte) 'B',
(byte) 'C', (byte) 'D', (byte) 'E', (byte) 'F', (byte) 'G',
(byte) 'H', (byte) 'I', (byte) 'J', (byte) 'K', (byte) 'L',
(byte) 'M', (byte) 'N', (byte) 'O', (byte) 'P', (byte) 'Q',
(byte) 'R', (byte) 'S', (byte) 'T', (byte) 'U', (byte) 'V',
(byte) 'W', (byte) 'X', (byte) 'Y', (byte) 'Z', (byte) 'a',
(byte) 'b', (byte) 'c', (byte) 'd', (byte) 'e', (byte) 'f',
(byte) 'g', (byte) 'h', (byte) 'i', (byte) 'j', (byte) 'k',
(byte) 'l', (byte) 'm', (byte) 'n', (byte) 'o', (byte) 'p',
(byte) 'q', (byte) 'r', (byte) 's', (byte) 't', (byte) 'u',
(byte) 'v', (byte) 'w', (byte) 'x', (byte) 'y', (byte) 'z',
(byte) '0', (byte) '1', (byte) '2', (byte) '3', (byte) '4',
(byte) '5', (byte) '6', (byte) '7', (byte) '8', (byte) '9',
(byte) '+', (byte) '/' };
private static final byte[] decodingT
decodingTable = new byte[128];
for (int i = 0; i & 128; i++) {
decodingTable[i] = (byte) -1;
for (int i = 'A'; i &= 'Z'; i++) {
decodingTable[i] = (byte) (i - 'A');
for (int i = 'a'; i &= 'z'; i++) {
decodingTable[i] = (byte) (i - 'a' + 26);
for (int i = '0'; i &= '9'; i++) {
decodingTable[i] = (byte) (i - '0' + 52);
decodingTable['+'] = 62;
decodingTable['/'] = 63;
public static byte[] encode(byte[] data) {
int modulus = data.length % 3;
if (modulus == 0) {
bytes = new byte[(4 * data.length) / 3];
bytes = new byte[4 * ((data.length / 3) + 1)];
int dataLength = (data.length - modulus);
for (int i = 0, j = 0; i & dataL i += 3, j += 4) {
a1 = data[i] & 0
a2 = data[i + 1] & 0
a3 = data[i + 2] & 0
bytes[j] = encodingTable[(a1 &&& 2) & 0x3f];
bytes[j + 1] = encodingTable[((a1 && 4) | (a2 &&& 4)) & 0x3f];
bytes[j + 2] = encodingTable[((a2 && 2) | (a3 &&& 6)) & 0x3f];
bytes[j + 3] = encodingTable[a3 & 0x3f];
switch (modulus) {
d1 = data[data.length - 1] & 0
b1 = (d1 &&& 2) & 0x3f;
b2 = (d1 && 4) & 0x3f;
bytes[bytes.length - 4] = encodingTable[b1];
bytes[bytes.length - 3] = encodingTable[b2];
bytes[bytes.length - 2] = (byte) '=';
bytes[bytes.length - 1] = (byte) '=';
d1 = data[data.length - 2] & 0
d2 = data[data.length - 1] & 0
b1 = (d1 &&& 2) & 0x3f;
b2 = ((d1 && 4) | (d2 &&& 4)) & 0x3f;
b3 = (d2 && 2) & 0x3f;
bytes[bytes.length - 4] = encodingTable[b1];
bytes[bytes.length - 3] = encodingTable[b2];
bytes[bytes.length - 2] = encodingTable[b3];
bytes[bytes.length - 1] = (byte) '=';
public static byte[] decode(byte[] data) {
data = discardNonBase64Bytes(data);
if (data[data.length - 2] == '=') {
bytes = new byte[(((data.length / 4) - 1) * 3) + 1];
} else if (data[data.length - 1] == '=') {
bytes = new byte[(((data.length / 4) - 1) * 3) + 2];
bytes = new byte[((data.length / 4) * 3)];
for (int i = 0, j = 0; i & (data.length - 4); i += 4, j += 3) {
b1 = decodingTable[data[i]];
b2 = decodingTable[data[i + 1]];
b3 = decodingTable[data[i + 2]];
b4 = decodingTable[data[i + 3]];
bytes[j] = (byte) ((b1 && 2) | (b2 && 4));
bytes[j + 1] = (byte) ((b2 && 4) | (b3 && 2));
bytes[j + 2] = (byte) ((b3 && 6) | b4);
if (data[data.length - 2] == '=') {
b1 = decodingTable[data[data.length - 4]];
b2 = decodingTable[data[data.length - 3]];
bytes[bytes.length - 1] = (byte) ((b1 && 2) | (b2 && 4));
} else if (data[data.length - 1] == '=') {
b1 = decodingTable[data[data.length - 4]];
b2 = decodingTable[data[data.length - 3]];
b3 = decodingTable[data[data.length - 2]];
bytes[bytes.length - 2] = (byte) ((b1 && 2) | (b2 && 4));
bytes[bytes.length - 1] = (byte) ((b2 && 4) | (b3 && 2));
b1 = decodingTable[data[data.length - 4]];
b2 = decodingTable[data[data.length - 3]];
b3 = decodingTable[data[data.length - 2]];
b4 = decodingTable[data[data.length - 1]];
bytes[bytes.length - 3] = (byte) ((b1 && 2) | (b2 && 4));
bytes[bytes.length - 2] = (byte) ((b2 && 4) | (b3 && 2));
bytes[bytes.length - 1] = (byte) ((b3 && 6) | b4);
public static byte[] decode(String data) {
data = discardNonBase64Chars(data);
if (data.charAt(data.length() - 2) == '=') {
bytes = new byte[(((data.length() / 4) - 1) * 3) + 1];
} else if (data.charAt(data.length() - 1) == '=') {
bytes = new byte[(((data.length() / 4) - 1) * 3) + 2];
bytes = new byte[((data.length() / 4) * 3)];
for (int i = 0, j = 0; i & (data.length() - 4); i += 4, j += 3) {
b1 = decodingTable[data.charAt(i)];
b2 = decodingTable[data.charAt(i + 1)];
b3 = decodingTable[data.charAt(i + 2)];
b4 = decodingTable[data.charAt(i + 3)];
bytes[j] = (byte) ((b1 && 2) | (b2 && 4));
bytes[j + 1] = (byte) ((b2 && 4) | (b3 && 2));
bytes[j + 2] = (byte) ((b3 && 6) | b4);
if (data.charAt(data.length() - 2) == '=') {
b1 = decodingTable[data.charAt(data.length() - 4)];
b2 = decodingTable[data.charAt(data.length() - 3)];
bytes[bytes.length - 1] = (byte) ((b1 && 2) | (b2 && 4));
} else if (data.charAt(data.length() - 1) == '=') {
b1 = decodingTable[data.charAt(data.length() - 4)];
b2 = decodingTable[data.charAt(data.length() - 3)];
b3 = decodingTable[data.charAt(data.length() - 2)];
bytes[bytes.length - 2] = (byte) ((b1 && 2) | (b2 && 4));
bytes[bytes.length - 1] = (byte) ((b2 && 4) | (b3 && 2));
b1 = decodingTable[data.charAt(data.length() - 4)];
b2 = decodingTable[data.charAt(data.length() - 3)];
b3 = decodingTable[data.charAt(data.length() - 2)];
b4 = decodingTable[data.charAt(data.length() - 1)];
bytes[bytes.length - 3] = (byte) ((b1 && 2) | (b2 && 4));
bytes[bytes.length - 2] = (byte) ((b2 && 4) | (b3 && 2));
bytes[bytes.length - 1] = (byte) ((b3 && 6) | b4);
private static byte[] discardNonBase64Bytes(byte[] data) {
byte[] temp = new byte[data.length];
int bytesCopied = 0;
for (int i = 0; i & data. i++) {
if (isValidBase64Byte(data[i])) {
temp[bytesCopied++] = data[i];
byte[] newData = new byte[bytesCopied];
System.arraycopy(temp, 0, newData, 0, bytesCopied);
return newD
private static String discardNonBase64Chars(String data) {
StringBuffer sb = new StringBuffer();
int length = data.length();
for (int i = 0; i & i++) {
if (isValidBase64Byte((byte) (data.charAt(i)))) {
sb.append(data.charAt(i));
return sb.toString();
private static boolean isValidBase64Byte(byte b) {
if (b == '=') {
} else if ((b & 0) || (b &= 128)) {
} else if (decodingTable[b] == -1) {
public static void main(String[] args) {
String data = ":etpass";
byte[] result = SecBase64.encode(data.getBytes());// 加密
System.out.println("Basic "+data);
System.out.println("Basic "+new String(result));
System.out.println(new String(SecBase64.decode(new String(result))));// 解密
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:163965次
积分:2670
积分:2670
排名:第6631名
原创:103篇
转载:41篇
评论:61条
(2)(2)(4)(1)(1)(4)(1)(1)(1)(9)(1)(2)(2)(3)(10)(10)(1)(2)(2)(3)(6)(6)(2)(2)(7)(5)(7)(8)(4)(5)(13)(6)(2)(4)(1)(1)(3)新浪微博客户端源码 android - CSDN博客
最近做作业选了这个题目。。其实难度还是挺大的。。最近要考试,本来有很多心得要写,来不及,先附上部分亮点以及源码:
1.OAuth1.0认证
2.支持下拉刷新,自动加载更多的ListView--AutoGetMoreListView.java
3.图片异步下载,同时可设置在加载图片时候显示的图片或多张图片顺序播放--AsyncImageView.java
4.支持GIF动态图查看,多点触控浏览图片。--MyImageView.java && MyView.java && GIFDecode.java && GIFView.java
5.文字超链接,微博人名,@ ,网址高亮且添加超链接,其中点击人名自动跳转到查看用户信息,话题高亮。全部都是用正则匹配。解决了ListView上TextView使用Linkify导致点击不响应OnItemClickListener的情况--HighLightTextView.java
6.纸微博,把文字写在图片上。其中为了对齐,全部符号装成全角形式。--ImageRel.java
7.抽屉式显示评论(类似口袋微博,不过界面不可同日而语)。--ViewActivity.java
8.桌面挂件App widget显示动画(滚动显示微博)。--AppWidgetAnimationService.java && WeiboAppWidget.java
9.TextView跟EditText显示表情,其中EditText还实时显示表情,一匹配即显示,同时还有九宫格显示表情列表。 --HighLightTextView.java && ShareActivity.java
10.当点击TabHost中的TabWidget,假如当前显示的跟点击的一样,显示listView第一个item,否则切换TabWidget.
11.全部下载通过新开线程实现。
12.具有分享功能。
ps1:代码风格不是很良好。
ps2:寒假会更新。
源码地址:

我要回帖

更多关于 新浪微博客户端 的文章

 

随机推荐