android模仿腾讯微博客户端

最近做了一个简单的腾讯微博,在这里分享给大家。

首先你需要去腾讯微博开放平台申请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账号密码即可登录,简化用户注册流程,同时可借助微博的关系链基础,增进用户与好友间的交互,提升使用体验

为了更好的帮助第三方接入移动应用,微博移动应用开放平台提供了支持iOSAndroidWindows Phone7SDK,封装了微博登录及部分微博开放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

第五步:开发应用

当您成功申请到AppKeyAppSecret后,您就可以调用腾讯微博开放平台上的一系列接口了或者下载相应的SDK开发您的应用了。

详细接口文档请参考:API文档SDK下载地体: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用户学习。

贴上项目效果图:

Demo源码下载地址:http://download.csdn.net/detail/jaynm/8152305

发布了37 篇原创文章 · 获赞 35 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/jaynm/article/details/41074691