android项目-微博

合集下载

基于Android系统微博客户端的设计与实现_徐奔

基于Android系统微博客户端的设计与实现_徐奔

本栏目责任编辑:谢媛媛软件设计开发基于Android 系统微博客户端的设计与实现徐奔(浙江行政学院,浙江杭州311121)摘要:该文系统地研究了Android 平台架构和新浪微博开放平台API,根据开放平台为第三方提供的SDK 开发包,运用MVC 的设计思想,设计开发了基于Android 系统的微博客户端。

通过对该客户端各个功能模块及数据库的详细设计,实现了客户端启动界面、主界面、功能界面的开发,运行效果良好,使新浪微博在手机端、PC 端等平台上完成了无缝对接,扩大了微博的覆盖面,吸引了更多的用户,提升了企业的经济和社会效益。

关键词:Android;SDK 开发平台;微博;Oauth 2.0;MVC 中图分类号:TP311文献标识码:A 文章编号:1009-3044(2015)16-0090-03随着移动通信技术的日趋成熟,手机等移动终端设备凭借其便携性、智能性,迅速得到普及,面对如此庞大的用户群,面向移动端的程序开发也越来越成为主流,形成了一个新兴的盈利点。

而微博作为一个交流互动的平台,受到很多人的青睐,同时,随着网速的提升,微博用户不断呈爆炸式增长,其影响力与日俱增。

Android 是目前主流的基于Linux 内核的开源智能手机操作系统,新浪提供了针对自身微博数据接口开放的平台SDK ,使得第三方可以开发基于Android 平台的新浪微博手机客户端,不仅能给开发者带来收入,对于开放平台本身,也能为客户带来更加丰富而有创新的应用,吸引更多的用户,从而提升企业的经济和社会效益。

1相关开发技术1.1微博SDK 与接口新浪微博Android 平台SDK 为第三方提供了简单易用的微博API 调用服务,使第三方客户端无需了解复杂的验证机制即可进行授权登陆,并提供微博分享功能,可直接通过微博官方客户端分享微博。

微博对外提供了相当多的接口。

其中最重要的是StatusesAPI 类,该类封装了关于微博信息的数据,其构造函数接受Oauth2AccessToken 参数。

基于Android的微博客户端系统设计

基于Android的微博客户端系统设计

基于Android的微博客户端系统设计作者:刘强吴文高熊星星来源:《计算机时代》2015年第05期摘要:微博是伴随着移动互联网和智能手机的广泛普及所产生的一个新颖的社交媒体,成为大众日常生活的一部分。

文章提出一个基于Android移动终端的微博客户端系统设计方案,采用OAuth认证,与微博服务端连接,实现以微博为中心的多应用机制,包含微博发布、浏览、转发、评论、收藏等全面的个性化功能。

关键词:微博客户端; Android; OAuth认证;微博服务端中图分类号:TP316.8 文献标志码:A 文章编号:1006-8228(2015)05-50-02Abstract: Micro-blog is a new social media with a wide popularization of mobile Internet and intelligent mobile phone products has become a part of people's daily life. This paper presents a scheme of mobile micro-blog client terminal system based on Android, using OAuth authentication, connected with the micro-blog server, realizes the multi application mechanism to micro-blog as the center, contains micro-blog release, browse, comment, forwarding,collections and other personalized comprehensive functions, and has the realistic meaning.Key words: MicroBlog clien; Android; OAuth authentication; microblog server0 引言随着移动互联网和Android智能手机的普及,越来越多的人喜欢使用移动终端来查看自己的微博,朋友圈等,使其成为日常生活的一部分。

微博界面设计

微博界面设计

AndroidManifest<manifest xmlns:android="/apk/res/android"package="com.weibo.sdk.android.demo"android:versionCode="1"android:versionName="1.0"><uses-sdkandroid:minSdkVersion="3"android:targetSdkVersion="15"/><uses-permissionandroid:name="android.permission.READ_PHONE_STATE"/><uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permiss ion><uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-perm ission><uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_CONTACTS"/> <uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><uses-permissionandroid:name="android.permission.WRITE_APN_SETTINGS"/><uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/><uses-permissionandroid:name="android.permission.ACCESS_COARSE_LOCATION"/><uses-permissionandroid:name="android.permission.CAMERA"></uses-permission> <uses-feature android:name="android.hardware.camera"/><uses-feature android:name="android.hardware.camera.autofocus"/> <applicationandroid:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme"><activity android:name="Logoin"android:label="@string/app_name"><intent-filter><action android:name="android.intent.action.MAIN"/><category android:name="UNCHER" /></intent-filter></activity><activityandroid:name="com.weibo.sdk.android.demo.LogoActivity"android:label="@string/app_name"></activity><activityandroid:name="com.weibo.sdk.android.demo.MainActivity"android:label="@string/app_name"></activity><activityandroid:name="com.weibo.sdk.android.demo.HomeActivity"android:label="@string/app_name"></activity><activity android:name="com.weibo.sdk.android.demo.SendActivity"android:label="@string/app_name"android:configChanges="keyboardHidden|orientation"android:screenOrientation="portrait"android:launchMode="singleTask"></activity><activityandroid:name="com.weibo.sdk.android.demo.DatabaseActivity"android:label="@string/app_name"></activity><activityandroid:name="com.weibo.sdk.android.demo.SynActivity"android:label="@string/app_name"></activity><activityandroid:name="com.weibo.sdk.android.demo.detaildataActivity"android:label="@string/app_name"></activity><activityandroid:name="com.weibo.sdk.android.demo.AutoTestActivity"android:label="@string/app_name"></activity><activity android:name=".APITypeListActivity"></activity><activityandroid:name="com.weibo.sdk.android.demo.ShareActivity"></activity> <activityandroid:name="com.weibo.sdk.android.demo.BlogFunActivity"></activity><activity android:name="cn.android.browser.Main"android:label="网页客户端"></activity><activity android:name="cn.android.browser.HelpTabAct" android:launchMode="singleTask"/><activity android:name="cn.android.browser.WebPreference"/><activity android:name="cn.android.browser.HttpData"/>></application></manifest>Mainactivitypackage com.weibo.sdk.android.demo;import java.io.File;import java.text.SimpleDateFormat;import java.util.Date;import java.util.List;import logic.FileUtils;import android.app.Activity;import android.app.TabActivity;import android.content.Context;import android.content.Intent;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.os.Bundle;import android.os.Environment;import android.util.Log;import android.view.KeyEvent;import android.view.View;import android.view.ViewGroup;import android.view.View.OnClickListener;import android.widget.BaseAdapter;import android.widget.Button;import android.widget.ListView;import android.widget.RadioGroup;import android.widget.TabHost;import android.widget.TextView;import android.widget.RadioGroup.OnCheckedChangeListener;//分页activity,主activity,这个退出,程序就退出了public class MainActivity extends TabActivity{public View msgTitle;//信息头部按钮public static SQLiteDatabase db = null;@Overrideprotected void onStart() {// TODO Auto-generated method stubsuper.onStart();}public void init() {// TODO Auto-generated method stub}public void refresh(Object... param) {// TODO Auto-generated method stub}protected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);//各子页的加载this.setContentView(yout.maintabs);msgTitle=this.findViewById(R.id.msg_title);//对微博下载的临时文件删除String dirpath = Environment.getExternalStorageDirectory().getPath()+ File.separator + "mLAB" + File.separator ;File dirfile = new File(dirpath);if(dirfile.exists()){FileUtils.deleteDir(dirpath);}//完成各子页集成final TabHost th=this.getTabHost();th.addTab(th.newTabSpec("TAB_HOME").setIndicator("TAB_HOME").setContent(new Intent(this,HomeActivity.class)));th.addTab(th.newTabSpec("TAB_MSG").setIndicator("TAB_MSG").setContent(new Intent(this,DatabaseActivity.class)));th.addTab(th.newTabSpec("TAB_USER_INFO").setIndicator("TAB_USER_INFO").setContent(new Intent(this,SynActivity.class)));th.addTab(th.newTabSpec("TAB_SEARCH").setIndicator("TAB_SEARCH").setContent(new Intent(this,AutoTestActivity.class)));RadioGroupmainGroup=(RadioGroup)this.findViewById(R.id.main_radio);mainGroup.setOnCheckedChangeListener(new OnCheckedChangeListener(){public void onCheckedChanged(RadioGroup arg0, int rid) { // TODO Auto-generated method stubLog.d("radiou group", "you selected="+rid);switch(rid){case R.id.radio_button0://首页th.setCurrentTabByTag("TAB_HOME");msgTitle.setVisibility(View.GONE);break;case R.id.radio_button1://信息th.setCurrentTabByTag("TAB_MSG");msgTitle.setVisibility(View.GONE);break;case R.id.radio_button2://资料th.setCurrentTabByTag("TAB_USER_INFO");msgTitle.setVisibility(View.GONE);break;case R.id.radio_button3://搜索th.setCurrentTabByTag("TAB_SEARCH");msgTitle.setVisibility(View.GONE);break;case R.id.radio_button4://更多msgTitle.setVisibility(View.GONE);th.setCurrentTabByTag("TAB_MORE");}}});//将数据库保存在存储卡中String path = Environment.getExternalStorageDirectory().getPath() + File.separator+"weiboinf.db";db = this.openOrCreateDatabase(path, Context.MODE_PRIVATE, null);SimpleDateFormat form = new SimpleDateFormat("yyyyMMdd");Date curDate = new Date(System.currentTimeMillis());String date = form.format(curDate);db.execSQL("CREATE TABLE if not exists " + "date" + date +"(_id INTEGER PRIMARY KEY AUTOINCREMENT, " +"sendtime DATETIME, " +"action VARCHAR(20), " +"delaytime time, " +"pictureresolution VARCHAR(10), " +"picturebytes int, " +"webdownloadbytes int, " +"webuploadbytes int, " +"webtotalbytes int, " +"word int, " +"allweiboword int, " +"allweibopicture int, " +"phone_type VARCHAR(20), " +"cellid VARCHAR(20), " +"ssid VARCHAR(20), " +"plmn VARCHAR(20), " +"imsi VARCHAR(20))");}}maintabs<?xml version="1.0"encoding="UTF-8"?><TabHost android:id="@android:id/tabhost" android:layout_width="fill_parent"android:layout_height="fill_parent" xmlns:android="/apk/res/android"><LinearLayout android:orientation="vertical" android:layout_width="fill_parent"android:layout_height="fill_parent"> <FrameLayout android:id="@+id/msg_title"android:visibility="gone"android:layout_width="fill_parent"android:layout_height="wrap_content"><TextView android:id="@+id/tv_wb" android:layout_height="wrap_content"android:layout_width="fill_parent"android:background="@drawable/titlebar_lightgray_bg"></TextView> <!--<LinearLayout android:gravity="center_horizontal"android:paddingTop="5dip" android:orientation="horizontal"android:layout_width="fill_parent"android:layout_height="fill_parent"><Button android:text="我" android:id="@+id/bt_group_left"android:background="@drawable/title_button_group_left"android:textColor="#ffffffff"android:layout_width="wrap_content"android:layout_height="wrap_content"></Button><Button android:text="评论" android:id="@+id/bt_group_middle"android:background="@drawable/title_button_group_middle"android:textColor="#ffffffff"android:layout_width="wrap_content"android:layout_height="wrap_content"></Button><Button android:text="私信" android:id="@+id/bt_group_right"android:background="@drawable/title_button_group_right"android:textColor="#ffffffff"android:layout_width="wrap_content"android:layout_height="wrap_content"></Button></LinearLayout>--></FrameLayout><FrameLayout android:id="@android:id/tabcontent" android:layout_width="fill_parent"android:layout_height="0.0dip" android:layout_weight="1.0"/><TabWidget android:id="@android:id/tabs" android:visibility="gone"android:layout_width="fill_parent" android:layout_height="wrap_content"android:layout_weight="0.0"/> <RadioGroup android:gravity="center_vertical" android:layout_gravity="bottom"android:orientation="horizontal" android:id="@id/main_radio"android:background="@drawable/maintab_toolbar_bg"android:layout_width="fill_parent"android:layout_height="wrap_content"> <RadioButton android:id="@+id/radio_button0" android:tag="radio_button0"android:layout_marginTop="2.0dip" android:text="主页"android:drawableTop="@drawable/icon_1_n"style="@style/main_tab_bottom"/><RadioButton android:id="@+id/radio_button1" android:tag="radio_button1"android:layout_marginTop="2.0dip" android:text="历史信息"android:drawableTop="@drawable/icon_2_n" style="@style/main_tab_bottom"/><RadioButton android:id="@+id/radio_button2" android:tag="radio_button2"android:layout_marginTop="2.0dip" android:text="同步"android:drawableTop="@drawable/icon_3_n" style="@style/main_tab_bottom"/><RadioButton android:id="@+id/radio_button3" android:tag="radio_button3"android:layout_marginTop="2.0dip" android:text="测试"android:drawableTop="@drawable/icon_4_n" style="@style/main_tab_bottom"/><RadioButton android:id="@+id/radio_button4" android:tag="radio_button4"android:layout_marginTop="2.0dip" android:text="更多"android:drawableTop="@drawable/icon_5_n" style="@style/main_tab_bottom"/></RadioGroup></LinearLayout></TabHost>styles.xml<?xml version="1.0"encoding="utf-8"?><resources><style name="AppTheme"parent="android:Theme.Light"/><style name="notitle"><item name="android:windowNoTitle">true</item></style><style name="Theme.CustomDialog"parent="@android:style/Theme.Dialog"> <item name="android:windowBackground">@drawable/newbox</item> </style><style name="tab_style"><item name="android:textSize">@dimen/bottom_tab_font_size</item><item name="android:ellipsize">marquee</item><item name="android:gravity">center</item><item name="android:background">@drawable/radio_bg</item><item name="android:layout_width">fill_parent</item><item name="android:layout_height">wrap_content</item><item name="android:layout_margin">2.0dip</item><item name="android:button">@null</item><item name="android:singleLine">true</item><item name="android:layout_weight">1.0</item></style><style name="main_tab_bottom"><item name="android:textSize">@dimen/bottom_tab_font_size</item><item name="android:textColor">#ffffffff</item><item name="android:ellipsize">marquee</item><item name="android:gravity">center_horizontal</item><item name="android:background">@drawable/home_btn_bg</item><itemname="android:paddingTop">@dimen/bottom_tab_padding_up</item> <item name="android:layout_width">fill_parent</item><item name="android:layout_height">wrap_content</item><item name="android:button">@null</item><item name="android:singleLine">true</item><itemname="android:drawablePadding">@dimen/bottom_tab_padding_drawable</item ><item name="android:layout_weight">1.0</item></style><style name="TransparentDialog"><itemname="android:windowBackground">@android:color/transparent</item> <item name="android:windowFrame">@null</item><item name="android:windowNoTitle">true</item><item name="android:windowIsFloating">true</item><item name="android:windowIsTranslucent">true</item><item name="android:windowContentOverlay">@null</item><itemname="android:windowAnimationStyle">@android:style/Animation.Dialog</it em><item name="android:backgroundDimEnabled">false</item> </style><style name="detail_btn"><item name="android:textSize">@dimen/bottom_tab_font_size</item><item name="android:textColor">@android:color/black</item><item name="android:ellipsize">marquee</item><item name="android:gravity">center_horizontal</item><item name="android:background">@drawable/detail_btn_bg</item><item name="android:paddingTop">8.0dip</item><item name="android:paddingBottom">5.0dip</item><item name="android:focusable">true</item><item name="android:clickable">true</item><item name="android:layout_width">fill_parent</item><item name="android:layout_height">wrap_content</item><item name="android:singleLine">true</item><item name="android:layout_weight">1.0</item></style><style name="dialogstyle"parent="@android:style/Theme.Dialog"> <item name="android:windowFrame">@null</item><item name="android:windowNoTitle">true</item><item name="android:windowIsFloating">true</item><item name="android:windowIsTranslucent">false</item><item name="android:backgroundDimEnabled">false</item> </style><style name="search_radiobutton_weibo"><item name="android:textSize">@dimen/bottom_tab_font_size</item><item name="android:textColor">#ff000000</item><item name="android:ellipsize">marquee</item><itemname="android:background">@drawable/search_radio_weibo</item> <item name="android:paddingLeft">40.0dip</item><itemname="android:paddingTop">@dimen/bottom_tab_padding_up</item> <item name="android:layout_width">fill_parent</item><item name="android:layout_height">fill_parent</item><item name="android:button">@null</item><item name="android:singleLine">true</item><itemname="android:drawablePadding">@dimen/bottom_tab_padding_drawable</item ><item name="android:layout_weight">1.0</item></style><style name="search_radiobutton_user"><item name="android:textSize">@dimen/bottom_tab_font_size</item><item name="android:textColor">#ff000000</item><item name="android:ellipsize">marquee</item><itemname="android:background">@drawable/search_radio_user</item><item name="android:paddingLeft">40.0dip</item><itemname="android:paddingTop">@dimen/bottom_tab_padding_up</item> <item name="android:layout_width">fill_parent</item><item name="android:layout_height">fill_parent</item><item name="android:button">@null</item><item name="android:singleLine">true</item><itemname="android:drawablePadding">@dimen/bottom_tab_padding_drawable</item ><item name="android:layout_weight">1.0</item></style><style name="Transparent"><item name="android:windowNoTitle">true</item><item name="android:windowIsTranslucent">true</item><item name="android:windowContentOverlay">@null</item><itemname="android:windowAnimationStyle">@android:style/Animation.Translucen t</item></style><style name="ContentOverlay"parent="@android:style/Theme"> <item name="android:windowNoTitle">true</item><item name="android:windowIsTranslucent">true</item><item name="android:windowContentOverlay">@null</item><itemname="android:windowAnimationStyle">@android:style/Animation.Translucen t</item></style></resources>strings.xml<resources><string name="app_name">mLAB微博客户端</string><string name="menu_settings">Settings</string><string name="title_activity_main">MainActivity</string><string name="weibosdk_attention">注意</string><string name="weibosdk_delete_all">是否要删除这条微博?</string><string name="weibosdk_ok">是</string><string name="weibosdk_cancel">否</string><string name="weibosdk_app_name">com_weibo_android</string><string name="weibosdk_send">发送</string><string name="weibosdk_photo">拍照</string><string name="weibosdk_close">关闭</string><string name="weibosdk_share_dialog_title">新浪微博</string><string name="weibosdk_please_login">请登录!</string><string name="weibosdk_send_sucess">分享成功!</string><string name="weibosdk_send_failed">分享失败!</string><string name="weibosdk_del_pic">是否删除图片?</string><string name="weibosdk_comment">评论</string><string name="weibosdk_forward">转发</string><string name="weibosdk_fav">收藏</string><string name="testcontent"></string><string name="dia_about">测试浏览器</string><string name="close_btn">关闭</string><string name="open_btn">打开</string><string name="del_btn">删除</string><string name="ok_btn">是</string><string name="no_btn">否</string><string name="fav_name">收藏夹</string><string name="shortcut">快捷方式</string><string name="addFavorite">收藏网页</string><string name="favorite">管理收藏夹</string><string name="preference">设置</string><string name="http_name">网页属性</string><string name="long_press">长按操作</string><string name="exit_title">提示</string><string name="exit_message">是否要退出浏览器?</string><string name="history">历史</string></resources>drawables.xml<?xml version="1.0"encoding="UTF-8"?><resources><item type="drawable"name="ltgray">#fff4f4f4</item><item type="drawable"name="ltyellow">#fffff4db</item><item type="drawable"name="black">#ff000000</item><item type="drawable"name="transparent">#00000000</item><item type="drawable" name="widget_edit_block_bg_normal">@android:color/transparent</item> <item type="drawable"name="transparent_background">#99000000</item> <item type="drawable"name="list_background">#fff4f4f4</item></resources>dimens.xml<?xml version="1.0"encoding="UTF-8"?><resources><dimen name="button_height">45.0dip</dimen><dimen name="bottom_tab_font_size">10.0dip</dimen><dimen name="bottom_tab_padding_up">5.0dip</dimen><dimen name="bottom_tab_padding_drawable">2.0dip</dimen><dimen name="switch_logo_bottom_padding">30.0sp</dimen><dimen name="widget_height">100.0dip</dimen><dimen name="sta_height">48.0dip</dimen><dimen name="widget_write_margin_top">19.0dip</dimen><dimen name="widget_write_margin_left">10.0dip</dimen><dimen name="widget_content_margin_top">20.0dip</dimen><dimen name="widget_content_margin_left">10.0dip</dimen><dimen name="widget_logo_size">35.0dip</dimen><dimen name="title_height">74.0dip</dimen><dimen name="new_blog_size">70.0dip</dimen></resources>colors.xml<?xml version="1.0"encoding="utf-8"?><!--/** Copyright 2011 Sina.** Licensed under the Apache License and Weibo License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at** * /licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and* limitations under the License.*/--><resources><color name="weibosdk_transparent">#00000000</color><color name="weibosdk_text_num_gray">#333</color><color name="weibosdk_dialog_title_blue">#9CCCF7</color></resources>arrays.xml<?xml version="1.0"encoding="utf-8"?><resources><string-array name="api_types"><item>微博接口:StatusesAPI</item><item>评论接口:CommentsAPI</item><item>用户接口:UsersAPI</item><item>关系接口:FriendshipsAPI</item><item>账号接口:AccoutAPI</item><item>收藏接口:FavoritesAPI</item><item>话题接口:TrendsAPI</item><item>标签接口:TagsAPI</item><item>注册接口:RegisterAPI</item><item>搜索接口:SearchAPI</item><item>推荐接口:SuggestionsAPI</item><item>提醒接口:RemindAPI</item><item>短链接口:ShortUrlAPI</item><item>通知接口:NotificationAPI</item><item>公共服务接口:CommonAPI</item><item>位置服务接口:PlaceAPI</item><item>地理信息接口:LocationAPI</item><item>社交电视接口:KandianAPI</item> </string-array><string-array name="examples"><item>发送微博</item><item>获取关注好友微博</item><item>打开启动微博客户端</item><item>打开用户信息页面 uid</item><item>打开用户信息页面 nickname</item><item>打开微博发送页面 content</item><item>打开微博发送页面多参数</item><item>打开查看附近人页面</item><item>打开查看附近微博界面</item><item>打开打开摇一摇界面</item><item>打开通讯录界面</item><item>打开内置浏览器界面</item><item>打开私信对话界面</item><item>打开私信对话界面 nick</item><item>打开用户话题列表页面</item><item id="123">打开某条微博正文</item></string-array><string-array name="http_array"><item>查看网页源码</item><item>查看网页所有图片</item></string-array><string-array name="longpress_array"> <item>多页浏览器</item>。

基于Android系统的新浪微博客户端的设计与实现

基于Android系统的新浪微博客户端的设计与实现

基于Android系统的新浪微博客户端的设计与实现作者:王明超来源:《电脑知识与技术》2012年第33期摘要:该系统基于Android移动开发平台,使用Java语言开发,使系统具有良好的平台移植性和可扩展性。

新浪微博Android SDK为第三方微博应用提供了文档易用的微博API调用服务,使第三方微博客户端无需了解复杂的验证和API调用过程,就可以实现分享文字或者多媒体信息到新浪微博。

本系统包括四个模块:应用程序登录模块,主界面显示模块,微博浏览模块,用户模块。

在登录模块,用户可以使用授权配置和用户注册并且登录系统。

关键词:新浪微博开放平台;授权配置;微博API调用服务中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2012)33-7933-03每一个时代都会催生新的理念,每一个理念又会引领新的潮流,每一个潮流又注定会冲破原有的桎梏,创新是时代的特征,更是IT业的标志。

摩尔定律的持续实现使整个IT业的发展和更新令人手忙脚乱,而作为终端设备中数量级最大的手机,近年更是近乎脱胎换骨,在颠覆传统手机概念的同时,不断挖掘着自身的市场价值,也成为众多厂商利益角逐的角斗场[1]。

IOS在乔布斯的精心策划下一路高歌猛进,Android则凭着开源的方式开山劈路,Symbian和Black berry的旧有模式被不断蚕食,Windows Phone则在滞后的泥潭中继续挣扎。

手机终端多样化应用的不断出现,使其在近乎实现PC端功能的同时,也影响着PC的发展。

互联网领域,以Facebook为代表的SNS的突起更是激起新一轮的网络风波,而在国内,冲破众堵的新浪在其准确的定位和成功的推广策略下推出的新浪微博更是占据了先导地位,并逐渐进入大众生活,成为许多人的生活必需品。

近年来,新浪微博的邀请重点由明星、名人转向媒体工作者甚至政府工作者,为时事的发布和民政工作提供了更为多样、便捷的方式[2]。

于是,新浪微博手机客户端便应运而生,而作为市场占有率第一的Android平台下的新浪微博客户端更是拥有广泛的需求。

android微博课程设计

android微博课程设计

android微博课程设计一、课程目标知识目标:1. 理解Android平台微博应用的基本功能与界面设计原理;2. 掌握微博应用中数据传递、处理和展示的技术要点;3. 学习运用Android开发工具进行微博应用的基本功能开发。

技能目标:1. 能够运用所学知识独立设计并实现微博应用的界面布局;2. 能够编写代码实现微博应用的登录、发微博、查看微博等功能;3. 能够对微博应用进行调试和优化,解决常见问题。

情感态度价值观目标:1. 培养学生对移动应用开发的兴趣,激发创新意识和探索精神;2. 培养学生团队协作意识,学会与他人共同解决问题;3. 引导学生关注网络社交现象,培养积极健康的网络素养。

课程性质:本课程为实践性较强的课程,以项目为导向,结合课本知识,使学生能够掌握Android平台微博应用的开发技能。

学生特点:学生具备一定的编程基础,对Android开发有一定了解,对微博应用有较高的兴趣。

教学要求:教师需采用案例教学、任务驱动等方法,引导学生主动探索,注重实践操作,提高学生的动手能力。

同时,关注学生的个体差异,给予个性化指导,确保课程目标的实现。

在教学过程中,将目标分解为具体的学习成果,便于后续教学设计和评估。

二、教学内容1. 微博应用概述:介绍微博应用的基本功能、界面设计及用户交互方式,关联课本第一章内容,帮助学生建立整体认识。

- 界面设计原理与布局:分析微博应用界面布局,学习Android常用布局方法,如LinearLayout、RelativeLayout等,结合课本第二章内容。

- 用户登录功能实现:讲解微博应用登录功能的技术要点,学习使用SharedPreferences、Intent等,关联课本第三章内容。

2. 微博功能实现:- 发送微博:学习使用EditText、Button等控件,结合课本第四章内容,实现发送微博功能。

- 查看微博:学习使用ListView、BaseAdapter等,展示微博列表,关联课本第五章内容。

android微博v2

android微博v2

OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。

与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAUTH是安全的。

下面废话不多说,直接进入今天的主题:如何实现新浪微博的Oauth2.0认证以及自动登录1.首先下载新浪最新SDK文档,下载地址如下:/p/android-weibo-sdk/downloads/list下贼个东东weibo_sdk_source_code_20120322.zip里面有2个项目com_weibo_android (引用项目is Library)和com_weibo_android_example (例子项目,要引用com_weibo_android)(右键例子项目)选择properties---android---点击下面的Add 选择引用项目即可。

2.在新浪微博开发平台,创建一个应用,获得App Key和App Secret替换到例子项目的App Key和App Secret,重要一点,要在开发平台---我的应用中---应用信息---高级信息里面填写应用回调页(这个可以任意写)3.在AuthorizeActivity 中替换掉App Key和App Secret然后填写应用回调页要和上面的一致,必须填写// Oauth2.0// 隐式授权认证方式weibo.setRedirectUrl("");// 此处回调页内容应该替换为与appkey对应的应用回调页// 对应的应用回调页可在开发者登陆新浪微博开发平台之后,// 进入我的应用--应用详情--应用信息--高级信息--授权设置--应用回调页进行设置和查看,// 应用回调页不可为空4.这样就可以进行授权登录了,登录成功还可以进行分享微博,这是sdk中自带的方法。

OK,完成上面几步,其实example就可以跑起来了,不过这个DEMO始终都需要先进行认证,然后再进行后续一些发微博等API操作,而我们希望在第一次认证通过之后,以后直接就登录不用再进行认证操作,那该如何实现?看example的这段代码[java]view plaincopy1.class AuthDialogListener implements WeiboDialogListener {2.3.@Override4.public void onComplete(Bundle values) {5. String token = values.getString("access_token");6. String expires_in = values.getString("expires_in");7. mToken.setText("access_token : " + token + " expires_in: "8. + expires_in);9. AccessToken accessToken = new AccessToken(token, CONSUMER_SECRET);10.//accessToken.setExpiresIn(expires_in);11. Weibo.getInstance().setAccessToken(accessToken);12. Intent intent = new Intent();13. intent.setClass(AuthorizeActivity.this, TestActivity.class);14. startActivity(intent);15. }在认证成功后,关键在于保存access_token字段的值,然后构造AccessToken对象,最后调用Weibo.setAccessToken方法后,后续即可进行相关API调用操作。

微博跨平台开发实践之路-微博程伟

微博跨平台开发实践之路-微博程伟

Render
flutter view
交互事件
JS Bridge(Native)
Service
js engine
Page A vdom js logic
渲染指令
WBox Framework
微博小程序 – 基于 Flutter 的渲染方案(预研)
Page A vdom js logic
.js
微博小程序 - 前端框架
webview
Render
js engine
Render Framework
Service
js engine
Page A vdom js logic
document.createComment('div') document.appendChild('image') document.addEventListener
js engine
交互事件
Render Framework
JS Bridge(Native)
Service
js engine
Page A vdom js logic
渲染指令
JS Binding
WBox Framework
微博小程序
微博小程序 – 同层渲染
微博小程序 – 同层渲染
微博小程序 – 同层渲染
• iOS:找浏览器预留的坑,并嵌入 原生控件
• Android:定制浏览器内核
微博小程序 – 前端框架
webview
web core
Render
js engine
交互事件
Render Framework
JS Bridge(Native)

Android平台微博SDK说明文档

Android平台微博SDK说明文档

微博Android平台SDK文档北京新潮讯捷信息技术有限公司编号:WEIBO_ANDROID_SDK版本:WEIBO_ANDROID_SDK V2.0.0修订记录目录微博Android平台SDK文档 (1)概述 (3)主要类说明: (3)主要接口说明 (3)1.获取Weibo对象 (3)2.获取Oauth2AccessToken对象 (5)3.分享到微博 (5)4.SSO支持 (6)实例分析 (6)1.通过Oauth2.0授权获得AccessToken (7)2.发送微博 (8)SSO介绍 (10)1.SSO功能使用方式 (10)2.SSO授权功能介绍 (10)3.SSO授权优势 (10)4.SSO授权流程示例 (10)SDK使用说明 (12)1.使用weibo.sdk.android(不包含sso功能) (12)2.使用weibo.sdk.android.sso (15)3.SDK使用及修改必须遵守微博开发者协议,以及开源软件协议。

(18)概述微博Android平台SDK为第三方微博应用提供了文档易用的微博API调用服务,使第三方客户端无需了解复杂的验证,API调用过程。

并可以实现分享到微博的功能,可以分享文字,或者多媒体信息到内置的分享页面,并发送到微博。

主要类说明:1.Weibo: 微博API 接口类,对外提供weiboapi的调用,包括登录,API调用,微博分享等功能。

2.Oauth2AccessToken:封装了“access_token”,“expires_in”,"refresh_token",并提供了他们的管理功能3.Utility:工具类,提供了url 的encode,decode方法。

4.AsyncWeiboRunner:微博api异步执行类,封装了回调接口,通过创建线程来调用Weibo中的接口方法。

5.HttpManager: 负责与服务器进行通讯的类,封装了GET、POST请求方式,并对外提供图片上传等功能6.WeiboAPI: 该类及其子类封装了新浪微博对外提供的api接口方法。

Weibo_Android_SDK使用手册

Weibo_Android_SDK使用手册

上图“ZIP”按钮,下载后解压缩可得到开发工具包。开发工具主要包含: Weibo.sdk.android.api(封装 Weibo.api 接口) Weibo.sdk.android.sso.demo(使用 sso 一个 Demo,包含调用 weibo.api 接口) Weibo.sdk.android.sso(基于 weibo.sdk.android 扩展的 sso 源码) Weibo.sdk.android(OAuth2.0 封装源码) Android 平台微博 SDK 说明文档(建议下载,方便开发) Weibo.sdk.android.sso.jar(必须下载,该 jar 封装了 weibo.api 和 sso 相关方法) 开发工具下载地址: 3. 搭建开发环境 环境需求:JDK+SDK+IDE(Eclipse)+ Weibo.sdk.android.sso.jar 此处基于 Weibo.sdk.android.sso.demo 为例。可以类比新建项目。 1) 在 Eclipse 中右键选择 Import,选择 Existing Projects into Workspace,从中 选 择 weibo.sdk.android.sso.demo 项 目 所 在 位 置 。 导 入 结 果 如 下 图 所 示 :
配置授权回调页 授权回调页是为 OAuth2.0 认证机制中的登陆认证地址,用户登录完成后最后悔跳 转此地址。 须在应用中配置次跳转地址才能使用 SDK 完成用户登录。 授权回调页查看及 设置地址: 第三方应用主页应用信息高级信息OAuth2.0 授权设置。 如下图所示: 2)
注:在使用 SDK 时,配置授权毁掉也是必不可少的,若没有配置,则登陆完成后无 法检测到授权地址,就无法获取授权的 Token 等信息。此地址并非必须配置成能访问地 址,保证格式正确即可。 2. 下载 Android 终端开发工具包 在 新 浪 微 博 开 放 平 台 文 档 一 页 有 SDK 下 载 一 项 , 找 到 IOS SDK 下 载 链 接 https:///mobileresearch/weibo_android_sdk/downloads ,打开后可打包 下载。

Android授权登录新浪微博获取用户个人信息汇总

Android授权登录新浪微博获取用户个人信息汇总

Android授权登录新浪微博获取用户个人信息一、准备工作我们都知道,无论是分享到新浪微博,还是获取新浪微博的用户信息,都离不开一样东西,那就是新浪微博的APPID,APPID通过绑定我们应用程序的包名和签名进行识别,可以说它是我们跟新浪微博官方所提供接口进行交互的一个重要令牌,这一点跟QQ、微信接口等访问原理基本是一样的。

那么问题来了,APPID到底怎么得到?答案就是你要到新浪微博开放平台/注册一个帐号,填写并创建你的应用。

如下图所示:点击创建应用后会出现如下图所示页面,在这个页面中你必须要填写你的Android包名和Android签名,包名就是你应用程序AndroidManifest.xml文件中的package中的字符串,比如你新建了一个名称为“test”的项目,那么你的包名应该是com.example.test了。

至于Android 签名,你可以在该开放平台下载签名工具apk装到手机,然后打开该apk填写程序包名获取签名,也可以直接在开发工具eclispe中点击Window->Preferences->Android->Build查看,如下图所示,至于其它必要的填写信息,你自己去完善就可以了将所有信息填写完善后我们点击提交审核,注意,只有审核通过的应用才能调用他们提供的API。

二、工程准备新建一个工程,包名要跟你上面填写的包名一致。

新建完成后下载新浪微博SDK,下载完成后解压,将libs目录下的文件全部拷贝到你的工程libs目录下,将weiboSDKCore_3.1.2.jar 包也拷贝到libs目录下,找到AccessTokenKeeper.Java、UsersAPI.java、AbsOpenAPI.java文件并拷贝到你的包中,我把我的工程目录图贴出来,后面我会把整个示例源码放上来。

注意上面common中的SinaUserInfo.java是我自己建的,只是用来方便存和取用户信息而已。

新浪微博for Android界面技术方案设计

新浪微博for Android界面技术方案设计

新浪微博Android界面技术方案设计新浪微博Android界面设计方案,需要进行以下的分析和总结。

1、明确建立网站的目标和用户需求;2、确定总体设计方案主题;3、功能、框架确定及可用性分析(需要与软件开发人员共同探讨)4、原型设计,即初步板式确定及色彩使用分析;5、界面设计,即在相关软件上实现界面;6、修改并交予重构。

一、产品定位与市场分析阶段1、目的:了解新浪微博移动客户端(基于Android系统)针对的市场、客户群体、运行方式、盈利方式等,以确定相应的产品开发方向。

2、产品定位:新浪微博是一款为大众提供娱乐休闲生活服务的信息分享和交流平台。

娱乐——涵盖最全面的娱乐明星与资讯;生活——反映网民现实生活的点点滴滴;快乐——分享发现人们身边的趣闻轶事3、市场分析:截至2010年10月底,新浪微博用户数已达5000万,目前是中国用户数最多的微博产品,公众名人用户众多是新浪微博的一大特色,目前基本已经覆盖大部分知名文体明星、企业高管、媒体人士。

根据2010年官方公布数据显示,新浪微博每天发博数超过2500万条,其中有38%来自于移动终端。

每天发布微博数量超过两千五百万条,微博总数累计超过20亿条。

是目前国内最有影响力、最受瞩目的微博运营商。

移动客户端发展前景巨大移动客户端的优点在于其实时性,实地性,故可以将新浪微博移动客户端定位为新闻发布平台,信息交互平台,娱乐休闲平台,生活展示平台,快乐分析平台。

故在设计界面时,Android是目前主流的智能手机操作系统,那么智能手机在各个方面的应用当然也要体现出其系统优势出来,即给用户更好的交互体验及功能享受。

界面的展现会主要以微博为主,实现查看、发表、评论、分享等功能,结合Android良好的触控体验,二、用户需求分析1、目的:收集相关资料分析目标用户的使用特征、情感、习惯、心理、需求等,提出用户研究报告和可用性设计建议。

这部分工作有团队配合完成。

时间与项目需求允许的情况下,更可以制定实景用户分析。

新浪微博android客户端

新浪微博android客户端

新浪微博android客户端概述微博Android平台SDK为第三方微博应用提供了文档易用的微博API调用服务,使第三方客户端无需了解复杂的验证,API调用过程。

并可以实现分享到微博的功能,可以分享文字,或者多媒体信息到内置的分享页面,并发送到微博。

此SDK封装了 HTTP请求以及Json信息的解析,我们只要实现页面相关功能的开发就行了,这样对于我们Android开发人员来说,减轻了不少压力呀!名词解释Consumer_key 分配给每个第三方应用的app key。

用于鉴权身份,显示来源等功能。

Consumer_secret 生成请求request Token的secret,与consumer key一起分配。

Oauth_token 服务器根据app key和时间,callback_url等哈希出的token值,用于获取oauth verifier。

Oauth_token_secret 与oauth token一起使用,用于获取oauth verifier。

Oauth_verifier 通过oauth页面返回的verifier,用于最终获取access token。

Access_token 表示用户身份的token,用于微博API的调用。

整体架构及分层∙UI层∙微博中的各个窗体∙logic层∙程序的核心控制调度模块,获取UI传递的数据、要执行的任务,调用微博接口,获得网络数据,返回消息,刷新(切换)UI ∙微博接口层(新浪API已封装)∙网络访问层(新浪API已封装)1.OAuth(1)和初始页面介绍1.首先说明一下新浪微博提供了OAuth和Base OAuth两种认证方式(如果不知道什么是OAuth和BaseOAuth请自己google一下恶补),本项目是采用OAuth认证方式,采用这种方式就需要有用户的新浪UserID、Access Token、AccessSecret这3样东西才能自由便利的调用新浪的开放接口,本项目是这样做的当用户第一次使用软件时进行授权认证获取这3样东西的时候存储到SharedPreferences中以便用户下次使用时不需要重新进行繁琐的授权认证操作直接从SharedPreferences中读取出来即可,由于这样的需求载入页面的功能设定是这样:当用户打开软件显示载入页面时开始检查SharedPreferences中是否已经保存有用户的新浪微博的UserID号、Access Token、AccessSecret的记录,如果一条记录都没有那就说明用户是第一次使用本软件那么跳到认证授权页面进行授权认证操作(认证授权功能在接下来的两篇中进行实现讲解)获取这3个值保存到SharedPreferences中,如果已经包括了记录,那么读取这些记录的UserID号、Access Token、AccessSecret值然后根据这3个值调用新浪的api接口获取这些记录对应的用户昵称信息等!下图是OAuth认证的原理图1.开场动画及登陆好了既然了解的认证机制,那么我们就来实现这个功能,首先我们先为我们的项目设计开场动画,然后跳转转到登陆页面!(由于我没时间去做那么多精美的图片,所以教程中的图片大部分还是来自于原版的新浪微博,有兴趣的同学可以自己设计一些自己比较喜欢的图片,所以这里图片的资源引用我就不做详细的介绍了!)在UI层创建Logo.java 和Login.javalogo Activity的介绍Logo的布局文件就是两个ImageView,并对这两个ImageView设置动画效果上面的是一个帧动画,下面是一个渐变Alpha动画并对这个动画进行监听,当动画结束的时候我们启动Login Activity最后记得在mainfest中注册声明Login activity当做完这些,我们的基本页面就算完成了!2.了解程序的运行流程上图说明了程序的整体运行框架,接着我们来详细看一下Logic层的一些核心类的介绍,为我们的登录验证做好前置工作2.Logic核心层的的介绍:1. IWeiboActivity接口的介绍∙IWeiboActivity接口∙所有窗口实现∙init()方法∙完成初始化∙refresh(Objet ...args)方法∙完成窗体刷新∙3.Task类的介绍定义程序中的任务如:登录,发表新微博,获取用户微博,获取用户详细信息等各种任务int taskId//当前任务的IDMap params //当前任务的参数4.MainService的介绍(核心控制类)1. 首先说一下MainService的主要功能完成程序调度接收UI层数据(任务),完成业务逻辑,返回信息,更新UI在后台运行(继承自Service类)线程(实现Runnable接口)不断侦听UI传过来任务消息2. MainService流程图预览3. MainService的核心方法个变量List<Activity> allActivity保存当前所有Activity,方便切换List<Task> allTask把当前任务加到集合中然后开启线程在Task中遍历任务去执行任务public void run() {while (isrun) {Task lastTask = null;synchronized (allTask) {//这里有可能同时有多个任务并发所以要加锁同步if (allTask.size() > 0) {lastTask = allTask.get(0);Log.i("yanzheng", "任务ID" + lastTask.getTaskID());doTask(lastTask);}}// 每隔一秒钟检查是否有任务try {Thread.sleep(1000);} catch (Exception e) {}}当接线程发现任务会调用doTask(Task task)方法去执行任务Message mess = hand.obtainMessage();mess.what = task.getTaskID();//将当前任务的ID 放到Message中mess.obj = Object object;//讲当前任务执行的结果放到message中hand.sendMessage(mess);//发送当前消息allTask.remove(task);//当前任务执行完毕把任务从任务集合中removepublic void handleMessage(Message msg) 可以接收一个Message对象(也就是我们doTask中传递的Message)switch (msg.what) {case Task.TASK_GET_USER_HOMETIMEINLINE://任务ID//因为当前HomeActivity实现了IWeiboActivity这个接口,我们得到当前activity的实例,并调用它实现的刷新方法,同时讲参数传递过去,这里就实现了Service中刷新数据的方法了!IWeiboActivity ia = (IWeiboActivity) MainService.getActivityByName("HomeActivity");ia.refresh(HomeActivity.REFRESH_WEIBO, msg.obj);break;说到这里相信大家对MainService有了一个整体的了解,接下来我们通过登陆来验证我们Service’的功能!4. OAuth(2)登陆请求认证篇1.调用web进行登录验证上次我们的UI篇说到了登陆页面,接下来我们要做的就是实现登陆功能首先当我们进入Login activity时我们没有进行授权,就要给用户提示一个信息,让用户进入到授权页面!那么我们首先来做这个提示功能,并实现点击确定按钮,跳转到认证页面!首先我们来了解一下OAuthActivity 这个Activity我们需要特殊处理首先介绍一下他的注册当我们点击Dialog中的确定按钮先打开那个callbackurl 那个URL回调的页面就是我们的OAuthActivity .我们在这个页面就可以处理我们返回的数据,Uriuri=this.getIntent().getData();得到AccessToken的key和Secret,可以使用这两个参数进行授权登录了!这里我们需要保存我们的登陆信息以及AccessToken的key和Secret,下次在进入页面我们就不需要,从新授权,直接拿这个信息就可以进行登陆认证!那么OK 我们在这个页面进行保存信息!首先我们需要写一个方法来保存首选项SharedPreferences,将用户信息保存起来!那么接下来我们在Util下写这个方法!2.保存授权信息一个是保存当前用户信息,一个是读取用户保存的信息!在OAuthActivity中当我们点击登陆按钮,需要执行认证请求,然后将返回的数据保存在首选项中,在跳转到登陆页面! 此时我们的登陆页面依然有那个提示框,所以我们要判断当前首选项中是否有保存的用户信息,如果没有则提示那个登陆框,如果有得话,就把用户的昵称显示在EdieText中! 所以我们需要在初始化的时候判断当前的首选项是否保存了用户的信息如果提示认证的Dialog没有显示我们则可以点击登陆按钮在Service进行登陆请求此时我们需要做的就是当点击登陆按钮向Service发送一个任务,此时记住我们要在Manifest中注册MainService和在Login Activity启动MainService3.MainService任务执行流程前面我们说了MainService的工作原理,接下来我们来详细说下,当任务发送到Service接到任务会怎么处理!下图是我画的一个启动任务到完成任务的流程图通过上面的大致流程,相信大家!对Service的工作流程有了一个更深刻的认识接下来我们来讲解一下认证登陆的原理!用户安装完应用程序,第一次登录,会提示用户认证,用户认证调取的是新浪的页面,调用此页面需要第三方应用的appkey和用户在认证页面输入自己的账号密码提交到新浪,新浪会返回给第三方应用一个加密的密匙,第三方应用通过这个密匙(也就是用户的凭据),去向新浪服务器端请求用户的信息,完成登录!具体参考下图:5.主页面的实现当我们完成登录的验证,就会自动跳转的主页面,在实现主页面功能的开始我们先看一下程序完成后的效果图,下图就是我们完成后的新浪微博客户端的主页面!怎么样?看着心动吧!那么下面我们就来动手实现这样一个漂亮的页面首先我们来说明下,整个页面的组成部分!首先是外框架采用TabActivity,下面五个按钮是TabActivity布局文件的一组RadioGroup当我们点击任何一个页面的时候就会将该一个与之对应的Activity在当前页显示!1.TabActibity的实现首先我们要实现的就是布局文件,我们来创建一个maintabs.xml文件,里面是父容器是</TabHost>,在Tab Host中我们必须要写它的TabWidget属性,这里我们设置它不可见!下面就是我们的要实现的按钮组RadioGroup!如下图所示的效果!要实现下图效果我们就要需创建我们用来切换的5个ActivityHomeActivity//主页MSGActivity//信息UserInfoActivity//用户信息SearchUser//收索MoreSetting//更多这里我们的按钮都是使用的是同一个style效果,具体的参数属性设置参考style文件完成布局文件,接下来我们来实现TabActivity内代码的编写,来实现我们的需求!首先我们的activity需要继承自TabActivitytab1=this.getTabHost();//获取TabHostTabSpec ts1=tab1//tab子标签跳转到HomeActivity.newTabSpec(TAB_HOME)//设定标签.setIndicator(TAB_HOME);//指定一个标签作为选项卡指示符//指定一个加载activity的Intent对象作为选项卡内容ts1.setContent(new Intent(MainActivity.this, HomeActivity.class));tab1.addTab(ts1);//添加第一个子页TabSpec ts2=tab1.newTabSpec(TAB_MSG).setIndicator(TAB_MSG);//tab子标签跳转到MsgActivityts2.setContent(new Intent(MainActivity.this, MSGActivity.class));tab1.addTab(ts2);//添加第二个子页…….剩下的依次添加就行了下面的就是我们的点击切换页面功能的实现做完上面这一步,我们来先一下效果图!这样我们的主页面就搭建完成了!接下来我们就进入了微博的核心代码编写!2 .HomeActivity的实现1.主页面的基本内容展示.首先我们来简单的实现一下主页面的信息,简单的效果如下图所示那么我们现在首先要实现的就是布局文件,home.xml布局文件分为3个部分,标题头和进度条,以及ListView,前面我我们讲述了Service的工作原理,这里我们的HomeActivity只要实现IWeiboActivity这个接口.然后在in it()方法中去实例化任务,并把任务添加到MainService中,MainService的线程会去调用doTask()方法在dotask时候调用WeiBo这个类// 获取当前登录用户及其所关注用户的最新20条微博消息List<Status> allweibo = weibo.getFriendsTimeline();mess.obj=allweibo; //将获取信息放入到Message中发送然后在handmessage中将message传来的数据放入refresh(Object... param)方法中这里由于我们已经获取当前Activity的上下文,所以可以通过handle来更新当前Activity的页面信息,这里的param参数里就是我们放入的List<Status>allweibo,这里我们把它强制转换成List<Status> 传入adapter中! 讲LlistView setadapter 我们的主页面信息也就完成了!我这里解释一下 Status这个对象就是微博内容.里面封装了微博的各种信息这里我们可以根据传递的List<Status> 中微博内容的各种信息显示到ListView中!这里我们来实现另外一个功能就是我们现在主页面一次只加载5条微博信息,当我们的ListView 拖动到底部的时候会显示一项更多选项,当我们点击更多的时候,会去在向服务器请求,在加载5条微博显示!现在我们要做的就是写用来显示微博信息的Listview中的item布局,具体的实现代码参考item.xml;这里我就不在解释item.xml中的布局是如何实现的,首先我们来看一下当我们点击更多选项时,程序大致的运行流程现在我们就要了解另外一个概念分页,其实在SDK已经有一个方法就是专门为我们请求微博信息做分页的方法Paging(int page, int count) ,这里我们只要传递,当前的请求的页说和每页的条数!系统就会返回我们需要的微博条目!这里我们需要从新写上面init()方法中的任务参数!同时在Service请求微博的时候我们可以吧paging这个参数传递进去接下来我们来详细说一下我们的weiboAdapter这里我就主要解释一下 addmore()和getView 方法//请求更多的数据public void addmoreDate(List<Status> addmore){this.status.addAll(addmore);//吧新传得数据加到现在的list中this.notifyDataSetChanged();}上面的方法主要功能就是给当前的adapter添加新的数据,然后提醒当前的适配器数据发生改变了,此处使用this.notifyDataSetChanged();就是吧当前添加的新数据,追加显示到ListView中! 下面我们来说一下@Overridepublic View getView(int position, View conterView, ViewGroup parent) { ViewHolder vHolder;if (conterView==null) {//加载一个新的View当 Root为null时可以拿到所有XML的资源文件conterView=LayoutInflater.from(mContext).inflate(yout.itemview, null);vHolder=new ViewHolder();itemName=(TextView)conterView.findViewById(ItemName);…conterView.setTag(vHolder);}else {//如果缓存中没有就重新创建vHolder=(ViewHolder) conterView.getTag();}上面就是一个很普通的复用conterView,如果这一块看不懂得话还是好好看看Listview吧下面来看一下我们完成后的效果图实现完上面的效果!我们会发现尽管我们在Service中去下载微博信息来更新UI 界面显示,但是主页面依然会很卡.而且现实的时间要很久,因为每调用一次getView()就去下载那些微博内容图片,下载是一个耗时的操作,所以这里我们就需要做异步加载图片!至于关于什么是异步我相信大家都能理解,因为我们前面的项目中已经学习了异步加载,这里我就直接上代码,不做过多的解释,如果还有看不懂或者弄不明白的可以在来单独给我说!做到这里,细心的同学可能会发现一个BUG,就是我们如果按标准的convertview复用,就会出现一个问题,就是当我们采用上面那种标准的复用写法,加载的微博信息会出现错位,也就是说当我们的item不一样高度,页面显示的item数量不统一时,LlistView就会出现错位!当我们异步加载的时候不管怎么打标签就会发现图片依然会错位!这里我们需要另外一种写法,虽然效率上可能没用convertview复用高!但是它不会出现错位的现场!View statusView=null;if ((conterView!=null)&&(conterView.findViewById(R.id.contentPic)!=null)) { statusView=conterView;}else {//如果缓存中没有就重新创建//加载一个新的View当 Root为null时可以拿到所有XML的资源文件statusView=LayoutInflater.from(mContext).inflate(yout.itemview, null);}ViewHolder vHolder=null;vHolder=new ViewHolder();Content=(TextView)statusView.findViewById(ItemContent);vHolder.ivitemPorprait=(ImageView)statusView.findViewById(R.id.ivItemPortrait);………..vHolder.contentPic=(ImageView)statusView.findViewById(R.id.contentPic);通过这种方式去实例化我们item中的每一个子控件!至于每个item要显示什么数据,就是根据 Status mstatus=status.get(position);来判断,这里我们通过if (mstatus.getRetweeted_status()!=null) {….}判断当前微博是否是又转发!其中, mstatus.getRetweeted_status()获得的同样是status对象,我们同样可以判断是否有内容图片之类的,具体的判断参考WeiboAdapter其中需要我们注意的是我们的Item 中的布局可以简单的看成3不封,左边是头像,右边是上下两部分,上面是微博内容,下面是又转发内容,如果没有使用又转发,我们可以显示所有微博内容,包括内容图片,还有就是我们的新浪V认证,是系统认真的用户我们就给一个V字标示!到这里我们的主页面就算基本完成接下来我们来实现基本菜单的功能2.菜单功能的实现实现效果如下图所示:具体怎么实现 ,这里我就不说了很简单,不明白得可以参考代码这里菜单功能的实现,由于时间的原因,我们就只只实现退出功能,其余的我们可以根据API进行扩展实现,这个退出功能的代码我们只在Service中实现,下面我们来写这个代码public static void exitAPP(Context context) {Intent it = new Intent("weibo4android.logic.util.MainService");context.stopService(it);//停止服务//杀死进程我感觉这种方式最直接了当android.os.Process.killProcess(android.os.Process.myPid());for (Activity activity : allActivity) {//遍历所有activity 一个一个删除activity.finish();}}接下来我们来实现一个小功能就是当我们点击back键的时候,程序就退出去了,这样给用户的体验很不好,这里我们就需要拦截Back键执行的动作,去弹出一个确认退出提示框,当用户点击确认的时候,才会退出应用程序!这里我们需要重写父类的onKeyDown(int keyCode, KeyEvent event){….}方法这里if (keyCode == KeyEvent.KEYCODE_BACK) {btexit();//当我们按下返回键的时候要执行的方法return true;}这样我们就完成了Back键的拦截在btexit()方法中我们弹出一个dialog 让用户选择是否退出!实现玩这个功能,我们就来实现标题头按键及功能的实现!3.实现布局标题头我们要实现的效果如下图所示,当我们点击写微博按钮和刷新按钮执行相应的功能因为我们这个标题都可能多出会用到所以,这里我们两边的ImageView默认是没有内容的当我们需要在一个Activity显示什么按钮是可以找到那个imageview的ID,我们这当前的Aictiity去给那个imageview指定按钮图片!接下来我们从Service取得当前用户,并将它的用户名称名显示在title中间那么我们现在来实现标题头的两个按按钮的功能,首先我们说一下刷新主页面微博信息的功能如何实现当我们点击刷新按钮时,头部的进度条会显示,,同时刷新按钮不会显示!刷新的功能是就是从新请求第一页的信息来显示,从新加载listView(这里可能需要优化)写完点击事件,我们接下来要写的就是发表微博,这里我们首先要创建一个新的activity3.发表一条新微博当我们在HomeActivity点击写微博按钮,就会跳转到发送微博的Activity,这里我们新建一个WriteWeibo,写微博页面的布局很简单,现在我们先看一下布局的实现这个布局的底部功能,没有实现,大家有兴趣的尅自己实现,这里我们就只实现一个主要功能,就是当我们点击发送按钮,发送当前文本框中内容!在WriteWeibo,里有一个方法,这里我们来解释一下这里我们只是简答的只能发布文字微博,如果我们发布成功,就结束当前页面微博类有发送带图片和当前位置的方法,有兴趣的同学也可以自己看一下6.微博信息页面1.显示当前点击的微博信息当我们点击主页面的微博信息时,可以跳转到微博信息页面,这里我们新建一个叫WeiboInfo得Activity!当我们在主页面点击某一个Item的时候就会跳转到这个页面,那么我们来看一下,点击那一快代码当我们到另外一个线程的时候,新启动一个线程,来接收这些数据,并用handle来更新这些数据到页面显示!这里先贴出显示效果给大家看一下页面布局没什么特别的,就是底部是通过一个线性布局,加5个TextView来实现的,别的基本上没什么技术含量!它也可以设置自己的点击事件,这里我们实现了评论转发收藏这三个功能!别的就没什么难度了,大家可根据自己的需要来实现!这里我们来介绍另外一个工具类WeiboUtil,这个类里面写的是一些我们对微博操作的方法,比发表,转发,评论微博…至于如何实现这些方法,我是通过官方SDKWeiBo类里的实现方法,直接调用的,如果哪位同学先练习http请求那一块可以自己写方法来实现,很简单只要把官方要的参数传递过去就行请求URL https:///2/statuses/repost.json返回的是Gson数据,解析就行了至于WeiboUtil里面的方法,我相信大家一看都明白了2.评论页面当我们点击微博新页面的评论按钮,就到了评论页面!页面布局很简单,这里给大家看一下效果图页面布局没什么好说的这里我们就说一下代码部分!在创建的时候获取上一个页面传递的微博的ID,在我们点击提交评论的时候将文本框中的评论内容提交!并判断是否讲内容发布成微博下面的按钮功能由于时间的原因我一直没弄,如果按照官方的做法,我现在还实现不了大家如果有能力的话可以自己实现,其中@ 和话题很简单就是在当前文本框中插入一个“@”符号和# 内容 #符号至于表情实现是能实现但是优化的有问题大家可以从官方去下载那些表情用网格视图来显示那些表情坐标就是插入你当前的位置,这里要调用GPS 我还没研究3.转发页面首先看一下效果图吧,拿图说话这个布局我就不用解释了 ,底部的那个是单独的一个布局,这里用include吧那个布局包含到我们需要的页面下面就是一个线性布局,包含5个ImageButton转发页面其实很简单,我们在weiboInfo那个activity点击转发将我们需要的信息传递到转发页面只要我们点击发送就实现了转发功能,具体实现参考代码7. UserInfoActivity页面1.页面布局主页面的布局实现稍微有点复杂 ,也有可能是我实现的方法不合理,但是效果达到了!此布局主要分为五大块第一 <!-- 头布局 --> 显示标题头信息第二 <!-- 用户头像及用户名布局 --> 显示用户头像那一块第三 <!-- 用户地址和登录布局 --> 此处采用了 2个层叠和2个相对布局完成第四 <!--微博话题粉丝条数布局 --> 此处采用了大的线性和相对层叠布局嵌套完成第五 <!--底部收藏和黑名单 --> 此处布局与第三布局向类似整体部分采用一个大的ScrollView 这样方便我们浏览更多的东西具体的可以参考代码布局userinfo.xml下面我们来看一下代码实现的效果图2.代码实现代码部分就相对简单一点,还记得我们在登录认证的时候,获取当前的User对象,也就是我们自己,在Service中我们设置当前user为当前登录的User对象这里我们可以直接取哪里的数据将当前User的各种需要显示的属性显示到这个页面具体的代码参考UserInfoActivity这里我们可以点击关注,微博,粉丝,话题,按钮来到想对应的Activity这里由于时间原因,实现的过程先放到后面,到时候我会把我以前写的代码贴出来供大家参考,其实自己实现的话也很简单 ,大家没事可以多看看WeiBo这个类好多我们需要的功能人家都给封装了这里我们只要会调用就OK了这里我们来实现更多项的布局8.MoreSetting页面的实现这个页面除了布局基本上没什么好说的这里我们就先上布局效果给大家看看这是在xml中实现的布局效果,这个布局跟新浪的菜单项布局不一样,我感觉那个看着不舒服所以就做了一个这样的!里面大部分内容采用表格布局,没有使用什么自定义控件,所以大家看起了没什么困难就是实现嵌套的比较繁琐,如果前面几个加这个UI都能OK的话,我相信android这一块你的布局就没什么大的问题了呵呵通过OutLine我们可以很清晰的看出此页面的流程结构对于各种布局的嵌套使用,掌握好规律实现起来还是挺简单的至于菜单项的功能,我们这里先不做过多具体的实现,这里我先将,实现的框架搭建好,方便大家以后自己实现好了更多菜单项页面我们已经基本完成下面我们来看一下收索页面的实现9. SearchUser页面的实现还是老规矩,直接上效果图,然后我们在来看实现过程那么首先我们来看一下这个页面的布局,分为三个部分,头部是一块收索那是一块,下面那一大块是一个Listview!稍微有点难度的是中间那一块那么我们就首先来讲解中间那一快得问题,上面是一个相对布局,里面一个AutoCompleteTextView,这个AutoCompleteTextView采用了一个自定义的背景布局,还有一个button就是那个收索按钮底部是一组RadioGroup,里面是两个RadioButton,采用了自定义的style<style name="search_radiobutton_user"><item name="android:textColor">#ff7f7f7f</item><item name="android:ellipsize">marquee</item><item name="android:background">@drawable/search_radio_user</item><item name="android:paddingLeft">55.0dip </item><item name="android:layout_width">fill_parent</item><item name="android:layout_height">fill_parent</item><item name="android:button">@null</item><item name="android:singleLine">true</item><item name="android:drawablePadding">6.0dip</item><item name="android:layout_weight">1.0</item></style这样我们就完成了收索页面的布局实现,接着我们来做一下代码功能的实现当我们在搜索框输入搜索字段点击收索会调用下面的方法给Service发一个任务在Service中接收到任务会根据我们传入的搜索字段去搜索相应的微博,根据我们的分页显示来返回数据,实现原理跟HomeActivty一样,这里我就不在详细接收,他也有点击事件,当我们点击某一条搜索的微博信息,也会跳转到We iboInfo这个页面来显示某一条微博详细信息收索微博的方法一样我写在了WeiboUtil类里面,这里我解释一下doweisetTok(context, weibo);这个方法,这里因为有些操作需要登陆验证,这里我们需要从新setToken,所以我就把这个方法写到这个工具类里面了!后记:这里我在扩展两个功能就是检查网络和自动选择自动登录自动登录就是吧checkbox的选择结果存到首选项,在根据这个值来判断,是否选择了自动登录功能!网络检查就是WeiboUtil中的一个检查当前网络连接是否正常的方法!10.项目总结与扩展转眼我们这个项目的基本介绍已经接近尾声了,现在我们来总结一下整个项目的核心内容整个项目的框架结构,本项目采用了一种很优秀的设计实现,就是通过Service加载数据在前台更新页面的设计模式,通过Task任务类来区分各种任务,及任务传递的参数信息,我们可以在Service中去做一些耗时的操作,讲获得的数据message发送到handle中,在doTask方法我中我们可以将message 中消息的信息通过refresh(Object... param)方法将参数在当前页面加载,由于此方法是在Service中加载所以不会照成UI阻塞.我们应该让我们的Acitivity尽可能的简洁,最好只负责数据信息的现实,至于逻辑和加载内容,我们最好放在后台或者线程中去处理!下面我们来说一下这个项目的扩展实现,其实比起官方的客户端应用我们做的还是相当的简陋,这里我说一下我们有能力可以实现的一些功能(1):菜单功能的完善(2):主页面上下文菜单的实现(3):私信接口的调用与数据的获取显示(4):搜索页面的标签选项(5):数据库的创建,保存当前用户的信息,方便切换账号使用(6):更多页面的部分功能(7):@人名与话题文本高亮显示(8):表情的解析与显示还有一些细节性的功能我们可以根据自己的需求进行实现,我相信如果大家把文档的内容实现,在把这些扩展的功能实现一部分!找份合适的android开发工作还是不是问题的!呵呵….。

【推荐下载】Android自定义View之实现流行的新浪微博底部菜单:高仿“咸鱼APP”的底部菜单动画效果。

【推荐下载】Android自定义View之实现流行的新浪微博底部菜单:高仿“咸鱼APP”的底部菜单动画效果。

Android 自定义View 之实现流行的新浪微博底部菜单:高仿“咸鱼APP”的底部菜单动画效果。

2017/07/23 2193 博主一份努力,转载请支持本原创:blog.csdn/xh870189248/article/details/759492831、前几天在手机看到了很好看的动画效果,于是,扬起袖子就是干:上图的是咸鱼App 效果,下图是俺高仿的,大神莫喷~ 1、看到咸鱼app 的效果,大家都是第一反应想到是安卓动画,没错!就是安卓动画,但是本人是刚刚入门动画,并没有使用高级的动画——属性动画,因此图片移动到了新的位置,那么新的位置就不具备点击事件效果,这也是帧动画的局限。

因此,有大神还可以使用属性动画的,可以自己造一个啦!2、整个布局只是一个PopupWindow,但是毕竟是点击事件有限,因此我考虑了用了以下的方法:3、整个过程我简单的说一下:先画好一个布局,下面是3 个图片,只有那个加号图片是显示的,而其他的二张是隐藏的,而我用的是RelativeLayout 布局,就很好地解决了重叠图片问题。

那么上面的2 张图片也是隐藏的,为何要这样?因为我要的是这两张图片位置点击事件效果,如果你是按照下面2 张图片到上面的话,点击事件还是在下面的,对吧?那么我想到是这样:先隐藏上面的图片。

监听下面图片的动画事件,当动画停止时候,就显示出来,因此,也要把对应的图片隐藏。

退出界面,就直接使用动画,就好啦!没那么麻烦了~1、既然讲到动画,坐标是肯定离不开的,每次的移动、旋转都是需要动画,那么在之前先声明下,要想获取到自控件的坐标,必须要等其类初始化完毕才可以获取,要么会获取为0 。

这是我反复遇到的问题,因此,一定要监听动画事件的停止,才可以做获取坐标的事情,这样就可以轻松获取到坐标了。

2、文件布局问题:要知道,如果想把某个控件平移到不是非父布局里面,就会在边界消失掉,不知道大家遇到这样的问题不?因此,我必须把整个布局放在只有。

Android集成新浪微博第三方登录的方法

Android集成新浪微博第三方登录的方法

Android集成新浪微博第三⽅登录的⽅法本⽂实例讲述了Android集成新浪微博第三⽅登录的⽅法。

分享给⼤家供⼤家参考。

具体实现⽅法如下:1.下载微博的sdk ,导⼊微博的jar包两个 android-support-v4.jar和weibosdkcore.jar两个包2.把新浪微博中的demo_src中SDK中的com,导⼊到项⽬中3.⽤demo中的constants,主要是参数设置,将⾥⾯的参数改成⾃⼰的参数。

4.编写代码,主要步骤如下:复制代码代码如下:// 初始化微博对象mWeiboAuth = new WeiboAuth(this, Constants.APP_KEY, Constants.REDIRECT_URL, Constants.SCOPE);// sinaAuthorWebView.loadUrl("https:///oauth2/authorize?scope=email&redirect_uri=&state=flashmemoAndroid&forcelogin=true&display=mobile&client_id=2529326755"); //获取codemWeiboAuth.authorize(new AuthListener(), WeiboAuth.OBTAIN_AUTH_CODE);// 第⼆步:通过 Code 获取 TokenfetchTokenAsync(mCode, WEIBO_DEMO_APP_SECRET);5.主要的核⼼代码如下:复制代码代码如下:/*** 微博认证授权回调类。

*/class AuthListener implements WeiboAuthListener {@Overridepublic void onComplete(Bundle values) {if (null == values) {// 获取code失败return;}String code = values.getString("code");if (TextUtils.isEmpty(code)) {// 获取code失败return;}// 获取code成功mCode = code;// 获取code成功,第⼆步:通过 Code 获取 TokenfetchTokenAsync(mCode, WEIBO_DEMO_APP_SECRET);}@Overridepublic void onCancel() {Log.e("LoginActivity", "sinaAuth cancel");//如果取消授权,那么可以调到登录页⾯等}@Overridepublic void onWeiboException(WeiboException e) {Log.e("LoginActivity", "sinaAuth exception :" + e.getMessage());}}/*** 该 Handler 配合 {@link RequestListener} 对应的回调来更新 UI。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

蓝灰 色系
上海海同信息科技有限公司
微博项目演示
微博项目的简介 android项目功能展示
蓝灰 色系
上海海同信息科技有限公司
微博项目演示
微博项目的简介
微博市场占有率大 微博用到的知识点全面 微博的操作简单
蓝灰 色系
上海海同信息科技有限公司
微博项目演示
android项目功能展示
蓝灰 色系
上海海同信息科技有限公司
用户名 地址 微博数
关注数
粉丝等
蓝灰 色系
上海海同信息科技有限公司
更多设置
用于设置客户端的基本属性
字体样式 字体大小 背景皮肤等其他设置
微博项目答辩标准
项目功能的实现 性能的规范 可维护性的规范 个性化的规范
蓝灰 色系
上海海同信息科技有限公司
微博项目答辩标准
性能的规范
流畅性: 软件运行应该流畅,不会出现卡机; 美观性: 软件界面应力求美观,赏心悦目; 稳定性: 软件运行过程中不会出现BUG; 边界条件:主界面应该全屏;
微博项目需求明细
登录 多用户登录 主界面 微博列表
发送微博
转发评论 个人信息
蓝灰 色系
上海海同信息科技有限公司
更多设置
微博项目需求明细
登录
接受用户输入的用户名密码; 使用微博提供的接口完成登陆; 登录成功后保存用户的登录信息,以便于 多用户和离线阅读的实现。
多用户登录
之前成功登录过的用户可以不用输入用户 名及密码就可以直接登录使用该客户端。
资源损耗:设计尽量节约资源;不用的资源应及时回收(如服务结 束,线程应退出)。
蓝灰 色系
上海海同信息科技有限公司
微博项目答辩标准
可维护性的规范
对可维护性的最终要求:别人能够轻松上手你的代码
结构清晰:封装良好;继承关系清晰;代码块清晰; 变量命名规范,变量名应该具有自明性;
注释充分:变量、方法、代码功能块、一些复杂算法……等都需要清晰 明了地说明。
微博项目需求明细
发送微博
通过点击发送微博按钮跳转到发送微 博界面; 接受用户输入的文字信息以及添加的 图片; 调用微博的接口发送微博。
转发评论
蓝灰 色系
上海海同信息科技有限公司
点击单条微博时提示转发和评论的选 择; 跳转到指定界面后实现转发或评论的 功能。
微博项目需求明细
个人信息
用于显示用户信息
熟练掌握常用UI 熟练使用四大组件 熟练操作数据库 掌握网络编程
多知识点的组合
蓝灰 色系
上海海同信息科技有限公司
如何将多个知识点用到一个项目中
android项目的宗旨
android项目开发经验的培养
了解项目开发流程
为之后更快适应新公司做准备
熟悉项目框架的搭建方法
学会UML类图的绘画
熟悉项目过程的控制
Android 项目
蓝灰 色系
讲师:杨阳
上海海同信息科技有限公司
课程目标
android项目的宗旨 微博项目演示
微博项目需求明细 微博项目答辩标准
蓝灰 色系
上海海同信息科技有限公司
android项目的宗旨
android知识点的巩固
单个知识点的使用 android 项目开发经验的培养
蓝灰 色系
上海海同信息科技有限公司
微博项目答辩标准个性Fra bibliotek的规范把项目做出个性出来
设计思路:包括软件的整体架构、功能块的设计思路等等; 功能实现:从用户的角度,使用上发现与众不同的地方; 其它方面。
蓝灰 色系
上海海同信息科技有限公司
本节课程到这里就结束了, 谢谢大家
蓝灰 色系
蓝灰 色系
上海海同信息科技有限公司
微博项目需求明细
主界面
登陆后跳到微博主界面; 用于显示微博列表及不同功能模块的切换。
(建议使用ViewPage加fragment实现划屏效果)
微博列表
微博内容的显示包括文字和图片的显示; 保存到本地(数据库)。
蓝灰 色系
上海海同信息科技有限公司
获取最新微博(刷新)和以前的微博(更多);
相关文档
最新文档