最近做了一个简单的腾讯微博,在这里分享给大家。
首先你需要去腾讯微博开放平台申请App Key 和 App Secret
1.搜索腾讯微博开放平台:
2.打开腾讯微博开放平台(http://dev.t.qq.com/)
3.打开无线应用接入(http://dev.t.qq.com/wireless/)
4.打开android无线应用接入界面(http://dev.t.qq.com/wireless/android/);
5.点击红线连接,查看详细流程操作(http://dev.t.qq.com/wireless/intro/);
无线应用接入介绍
无线应用接入开放平台为第三方开发者提供了更为简便的合作模式,接入平台的手机端及平板电脑端应用,可以让用户只需要使用微博账号密码或QQ账号密码即可登录,简化用户注册流程,同时可借助微博的关系链基础,增进用户与好友间的交互,提升使用体验
为了更好的帮助第三方接入移动应用,微博移动应用开放平台提供了支持iOS、Android及Windows Phone7的SDK,封装了微博登录及部分微博开放API接口,应用只需要修改相应参数,不需要理解验证授权流程,即可实现微博登录功能。
第一步:成为开发者
首先需要注册开发,如果您已经是开发者,请跳过此步骤。
注册开发者:http://dev.t.qq.com/developer/bedever
首次使用需要登录:
点击登录使用自己的qq账号就可登录。
点击自己的qq头像就可快速登录;
登录成功之后,点击“马上成为开发者”的按钮,来填写自己的个人信息。
填写完个人资料后,你的资料邮箱中就是受到一份激活邮件,内容如下:
点击红线部分的激活连接,便可成为开发者。
第二步:创建应用
首先开发者需要在http://dev.t.qq.com/apps/add/6创建->无线应用
点击上图中红色部分的连接地址后,便可以创建应用:
第三步:填写应用信息
完善应用信息,红色部分为必填项
第四步:获取appkey 和 App Secret
填写完上述信息后,提交,得到App Key和App Secret
第五步:开发应用
当您成功申请到AppKey和AppSecret后,您就可以调用腾讯微博开放平台上的一系列接口了或者下载相应的SDK开发您的应用了。
下面是腾讯微博OAuthV授权操作类
package com.click369.cb.weibo.activity;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.StrictMode;
import android.view.Window;
import android.view.WindowManager;
import com.click369.cb.weibo.utils.ExitApplication;
import com.click369.cb.weibo.utils.OAuthv2Data;
import com.tencent.weibo.oauthv2.OAuthV2;
import com.tencent.weibo.oauthv2.OAuthV2Client;
import com.tencent.weibo.webview.OAuthV2AuthorizeWebView;
public class LoginActivity extends Activity {
// OAuth2.0的授权对象
private OAuthV2 oAuth = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ExitApplication.getInstance().addActivity(this);
// 设置无标题
requestWindowFeature(Window.FEATURE_NO_TITLE);
// 设置全屏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
// 自己的应用网址
oAuth = new OAuthV2("http://www.baidu.com");
// 自己的App key
oAuth.setClientId("801547865");
// 自己App Secret
oAuth.setClientSecret("4988aad68e1f9fbde2fa3648132cbde4");
// 关闭OAuthV2Client中的默认开启的QHttpClient。
OAuthV2Client.getQHttpClient().shutdownConnection();
// 我用的是sdk4.1,sdk4.1不让在主线程进行http请求,加入下面两行代码,就可以了!
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads().detectDiskWrites().detectNetwork()
.penaltyLog().build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects().detectLeakedClosableObjects()
.penaltyLog().penaltyDeath().build());
// 向腾讯SDK开发包种的OAuthV2AuthorizeWebView类发送意图
Intent intent = new Intent(LoginActivity.this,
OAuthV2AuthorizeWebView.class);
intent.putExtra("oauth", oAuth);
LoginActivity.this.startActivityForResult(intent, 1);
}
/**
* 根据请求吗来判断授权是否成功,如果结果码: resultCode == OAuthV2AuthorizeWebView.RESULT_CODE
* 则表示授权成功得到OAthV2对象
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1) {
if (resultCode == OAuthV2AuthorizeWebView.RESULT_CODE) {
oAuth = (OAuthV2) data.getExtras().getSerializable("oauth");
Intent intent = new Intent(LoginActivity.this,
MainActivity.class);
// intent.putExtra("oauthtomain", oAuth);
// 将得到的OAuthV2对象赋值给外围的OAuthV2Data对象的变量
OAuthv2Data.oAuthV2 = oAuth;
LoginActivity.this.startActivity(intent);
LoginActivity.this.finish();
}
}
super.onActivityResult(requestCode, resultCode, data);
}
}
下面是微博的主入口,程序是用fragmeny来显示选项卡的:
package com.click369.cb.weibo.activity;
import java.util.List;
import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.ImageView;
import android.widget.TextView;
import com.click369.cb.weibo.db.SearchDBManger;
import com.click369.cb.weibo.fragment.Upper_Home_Fragment;
import com.click369.cb.weibo.fragment.Upper_MyInfo_Fragment;
import com.click369.cb.weibo.fragment.Upper_Private_Fragment;
import com.click369.cb.weibo.fragment.Upper_Search_Fragment;
import com.click369.cb.weibo.javabean.HomeInfo;
import com.click369.cb.weibo.javabean.PrivateSendMsg;
import com.click369.cb.weibo.utils.ExitApplication;
import com.click369.cb.weibo.utils.OAuthv2Data;
import com.click369.cb.weibo.utils.ParseHomeInfoJson;
import com.click369.cb.weibo.utils.ParsePrivateSendSXJson;
import com.click369.cb.weibo.utils.PrivateAllData;
import com.click369.cb.weibo.utils.SendPrivateData;
import com.example.android_teng_weibo.R;
import com.tencent.weibo.api.PrivateAPI;
import com.tencent.weibo.api.StatusesAPI;
import com.tencent.weibo.constants.OAuthConstants;
/**
* MainActivity,加载Fragment的主Activity
*
* @author 曹先生
*
*/
public class MainActivity extends Activity implements OnClickListener {
/**
* 数据库对象,用来退出程序时,删除用户的搜索记录
*/
private SearchDBManger dbManger;
/**
* 主页Fragment
*/
private Upper_Home_Fragment home_Fragment;
/**
* 搜索Fragment
*/
private Upper_Search_Fragment search_Fragment;
/**
* 私信Fragment
*/
private Upper_Private_Fragment private_Fragment;
/**
* 资料Fragment
*/
private Upper_MyInfo_Fragment myInfo_Fragment;
/**
* 消息界面布局
*/
private View homeLayout;
/**
* 联系人界面布局
*/
private View searchLayout;
/**
* 动态界面布局
*/
private View privateLayout;
/**
* 设置界面布局
*/
private View myinfoLayout;
/**
* 在Tab布局上显示消息图标的控件
*/
private ImageView homeImage;
/**
* 在Tab布局上显示联系人图标的控件
*/
private ImageView searchImage;
/**
* 在Tab布局上显示动态图标的控件
*/
private ImageView privateImage;
/**
* 在Tab布局上显示设置图标的控件
*/
private ImageView myinfoImage;
/**
* 在Tab布局上显示消息标题的控件
*/
private TextView homeText;
/**
* 在Tab布局上显示联系人标题的控件
*/
private TextView searchText;
/**
* 在Tab布局上显示动态标题的控件
*/
private TextView privateText;
/**
* 在Tab布局上显示设置标题的控件
*/
private TextView myinfoText;
/**
* 用于对Fragment进行管理
*/
private FragmentManager fragmentManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ExitApplication.getInstance().addActivity(this);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_wbmain);
fragmentManager = getFragmentManager();
dbManger = new SearchDBManger(this);
// 初始化布局元素
initViews();
// 第一次启动时选中第0个tab
setTabSelection(0);
}
/**
* 在这里获取到每个需要用到的控件的实例,并给它们设置好必要的点击事件。
*/
private void initViews() {
// 四个tab布局
homeLayout = findViewById(R.id.home_layout);
searchLayout = findViewById(R.id.search_layout);
privateLayout = findViewById(R.id.private_layout);
myinfoLayout = findViewById(R.id.myinfo_layout);
// 四个tab图片
homeImage = (ImageView) findViewById(R.id.home_image);
searchImage = (ImageView) findViewById(R.id.search_image);
privateImage = (ImageView) findViewById(R.id.private_image);
myinfoImage = (ImageView) findViewById(R.id.myinfo_image);
// 四个tab文本
homeText = (TextView) findViewById(R.id.home_text);
searchText = (TextView) findViewById(R.id.search_text);
privateText = (TextView) findViewById(R.id.private_text);
myinfoText = (TextView) findViewById(R.id.myinfo_text);
// 四个tab监听事件
homeLayout.setOnClickListener(this);
searchLayout.setOnClickListener(this);
privateLayout.setOnClickListener(this);
myinfoLayout.setOnClickListener(this);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.home_layout:
// 当点击了消息tab时,选中第1个tab
setTabSelection(0);
break;
case R.id.search_layout:
// 当点击了联系人tab时,选中第2个tab
setTabSelection(1);
break;
case R.id.private_layout:
try {
// 创建腾讯提供的私信对象
PrivateAPI privateAPI = new PrivateAPI(
OAuthConstants.OAUTH_VERSION_2_A);
// 得到服务器返回的发送私信JSON字符串数据
String privateSendJson = privateAPI.send(OAuthv2Data.oAuthV2,
"json", "0", "0", "10", "0", "0");
/**
* 使用完毕后,请调用 shutdownConnection() 关闭自动生成的连接管理器
**/
privateAPI.shutdownConnection();
// 解析JSON字符串,返回PrivateInfo对象集合
final List<PrivateSendMsg> list = ParsePrivateSendSXJson
.getPrivate(privateSendJson);
SendPrivateData.sendpriList = list;
/****** 获取好友评论我的微博对象集合保存起来 ******/
StatusesAPI statusesAPI = new StatusesAPI(
OAuthConstants.OAUTH_VERSION_2_A);
String tijiJson = statusesAPI.mentionsTimeline(
OAuthv2Data.oAuthV2, "json", "0", "0", "5", "0", "0",
"0");
List<HomeInfo> priAllList = ParseHomeInfoJson
.homeinfo_JieXi(tijiJson);
// 将私信评论我的消息集合保存起来
PrivateAllData.priAllList = priAllList;
} catch (Exception e) {
e.printStackTrace();
}
// 当点击了动态tab时,选中第3个tab
setTabSelection(2);
break;
case R.id.myinfo_layout:
// 当点击了设置tab时,选中第4个tab
setTabSelection(3);
break;
default:
break;
}
}
/**
* 根据传入的index参数来设置选中的tab页。
*
* @param index
* 每个tab页对应的下标。0表示消息,1表示联系人,2表示动态,3表示设置。
*/
private void setTabSelection(int index) {
// 每次选中之前先清楚掉上次的选中状态
clearSelection();
// 开启一个Fragment事务
FragmentTransaction transaction = fragmentManager.beginTransaction();
// 先隐藏掉所有的Fragment,以防止有多个Fragment显示在界面上的情况
hideFragments(transaction);
switch (index) {
case 0:
// 当点击了消息tab时,改变控件的图片和文字颜色
homeImage.setImageResource(R.drawable.tabbar_home_highlighted);
homeText.setTextColor(Color.WHITE);
if (home_Fragment == null) {
// 如果MessageFragment为空,则创建一个并添加到界面上
home_Fragment = new Upper_Home_Fragment();
transaction.add(R.id.tab_up, home_Fragment);
} else {
// 如果MessageFragment不为空,则直接将它显示出来
transaction.show(home_Fragment);
}
break;
case 1:
// 当点击了联系人tab时,改变控件的图片和文字颜色
searchImage
.setImageResource(R.drawable.tabbar_discover_highlighted);
searchText.setTextColor(Color.WHITE);
if (search_Fragment == null) {
// 如果ContactsFragment为空,则创建一个并添加到界面上
search_Fragment = new Upper_Search_Fragment();
transaction.add(R.id.tab_up, search_Fragment);
} else {
// 如果ContactsFragment不为空,则直接将它显示出来
transaction.show(search_Fragment);
}
break;
case 2:
// 当点击了动态tab时,改变控件的图片和文字颜色
privateImage
.setImageResource(R.drawable.tabbar_message_center_highlighted);
privateText.setTextColor(Color.WHITE);
if (private_Fragment == null) {
// 如果NewsFragment为空,则创建一个并添加到界面上
private_Fragment = new Upper_Private_Fragment();
transaction.add(R.id.tab_up, private_Fragment);
} else {
// 如果NewsFragment不为空,则直接将它显示出来
transaction.show(private_Fragment);
}
break;
case 3:
default:
// 当点击了设置tab时,改变控件的图片和文字颜色
myinfoImage.setImageResource(R.drawable.tabbar_music_highlighted);
myinfoText.setTextColor(Color.WHITE);
if (myInfo_Fragment == null) {
// 如果SettingFragment为空,则创建一个并添加到界面上
myInfo_Fragment = new Upper_MyInfo_Fragment();
transaction.add(R.id.tab_up, myInfo_Fragment);
} else {
// 如果SettingFragment不为空,则直接将它显示出来
transaction.show(myInfo_Fragment);
}
break;
}
transaction.commit();
}
/**
* 清除掉所有的选中状态。
*/
private void clearSelection() {
homeImage.setImageResource(R.drawable.tabbar_home);
homeText.setTextColor(Color.parseColor("#82858b"));
searchImage.setImageResource(R.drawable.tabbar_discover);
searchText.setTextColor(Color.parseColor("#82858b"));
privateImage.setImageResource(R.drawable.tabbar_message_center);
privateText.setTextColor(Color.parseColor("#82858b"));
myinfoImage.setImageResource(R.drawable.tabbar_music);
myinfoText.setTextColor(Color.parseColor("#82858b"));
}
/**
* 将所有的Fragment都置为隐藏状态。
*
* @param transaction
* 用于对Fragment执行操作的事务
*/
private void hideFragments(FragmentTransaction transaction) {
if (home_Fragment != null) {
transaction.hide(home_Fragment);
}
if (search_Fragment != null) {
transaction.hide(search_Fragment);
}
if (private_Fragment != null) {
transaction.hide(private_Fragment);
}
if (myInfo_Fragment != null) {
transaction.hide(myInfo_Fragment);
}
}
/**
* 程序关闭后自定删除数据库中保存的搜索记录
*/
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
dbManger.delete();
dbManger.closeDatabase();
}
}
好了,代码太多了。分享源代码,供各位新学android用户学习。
贴上项目效果图: