目录
摘 要 I
Abstract II
第一章 绪论 3
1.1 会展经济 3
1.1.1 需求背景 3
1.1.2 面临的问题 3
1.2 移动互联网 4
1.2.1 移动互联网概述 4
1.2.2 将会展驶入移动互联网快车道 5
1.3 项目意义 5
1.4 系统概要介绍 6
第二章 基础技术介绍 7
2.1 百度云开发环境 7
2.1.1 百度应用引擎(BAE) 7
2.1.2 百度LBS云 7
2.1.3 百度个人云存储(PCS) 9
2.2 安卓(Android)系统简介 9
2.2.1 应用程序 10
2.2.2 应用程序框架 10
2.2.3 系统运行库 10
2.3 近场通讯技术(NFC) 11
2.4 会展导游系统架构概述和运行原理 12
2.5 小结 12
第三章 需求分析 14
3.1 用户需求分析 14
3.1.1 用例1 14
3.1.2 用例2 15
3.1.3 用例3 15
3.1.4 用例4 16
3.1.5 用例5 16
3.1.6 用例6 17
3.2 系统需求分析 17
3.2.1 系统界面运行流畅 17
3.2.2 第三方授权 17
3.3 小结 17
第四章 系统概要设计 18
4.1 系统前端设计 18
4.1.1 交互与原型设计 18
4.1.2 瀑布流布局 22
4.2 系统后端设计 22
4.2.1 系统模块设计 22
4.3 系统视图层设计 24
4.3.1 展会列表界面刷新流程 24
4.3.2 展会概要界面刷新流程 25
4.3.3 展品详情界面刷新流程 26
4.4 小结 26
第五章 系统详细设计与实现 27
5.1 视图层详细设计与实现 27
5.1.1 展会列表首页的详细设计与实现 27
5.1.2 展会详情页的详细设计与实现 28
5.1.3 展品详情页的详细设计与实现 29
5.2 逻辑层详细设计与实现 30
5.2.1 联系人模块详细设计与实现 30
5.3 关键问题及解决方案 32
5.3.1 瀑布流图片的设计与实现 32
5.3.2 资源加载任务的设计与实现 34
5.3.3 异步加载线程的设计与实现 34
5.4 小结 36
第六章 总结与展望 37
6.1 总结 37
6.2 展望 37
参考文献 38
致谢 39
第三章需求分析
3.1用户需求分析
本节主要介绍用户需求。从用户观展前、观展中、观展后几个场景,梳理分析用户的需求点。
3.1.1用例1
用户希望获得所在城市的展会信息。
当用户有参展的兴趣时,希望通过定位功能查找当地展馆举办的展会信息,并希望系统提供展会的相关内容作为决策的依据。比如说车展,用户可以看到最新或者是热门的车型,又或者是车模的照片,吸引用户决策去参加这个展会。
3.1.2用例2
用户希望在参展的过程中,能获得更多的展品的介绍,必要时能获取展品优惠券。
目前参展商的宣传方式仍以传单和现场讲解为主,大屏滚动播出宣传视频也作为一种宣传手段使用。可是这些方式存在天生的缺陷,传单所承载的内容不够详尽,而现场的讲解或宣传视频,让晚到的用户无法知晓到全部内容。
所以,用户希望可以获得更多的展品介绍,无论是文字、图片、视频或者是其他形式的附件。当用户看到某些展品的介绍后,如果产生了购买的兴趣,希望能够获得展品的优惠券,以便用户在购买时享受到优惠。
3.1.3用例3
用户希望将感兴趣的展品的电子介绍保存至百度云。
展品的详情介绍,包含了文字介绍,但都是概要式的说明,详情中还包含了更详尽内容的富文本附件,用户对展品感兴趣时,可以将附件保存至百度云,长久的保存起来,不易丢失。
这种保存附件的形式,解放了用户。用户不需要再担心在展会看中某一心仪的展品后,回家后就忘记其名称;或者是不再需要在逛展会的时候,拿着五花八门的传单介绍。
3.1.4用例4
用户在观展其间,希望能在饭点在展馆周边找到吃饭的地方。
展馆建筑面积比较大,一般坐落在城市的近郊,四周较为荒凉,而且因为展馆更注重自身的建设,所以周边的餐饮等配套设施,有所不足,比如说餐厅的地点距展台较远,或者较偏僻,位于地下层或者是在附近某栋建筑较多。而对于异地游客,陌生的环境对于他们而言,更难找到目的地。
所以,用户希望能够在饭点,在展馆周边找到餐厅。餐厅应能在几个维度作分类查找,比如说距离、品味、价格等。
3.1.5用例5
用户在观展其间,会认识不同的人。比如说销售代表会认识客户,用户在对某件展品产生购买意向时,也会认识某些销售代表;摄影师对在展会其间认识了一些影友;用户无意见也可能搭讪某位车模。当他们需要相互留联系方式时,希望能够快捷方便的交换联系方式信息,因为他们可能在赶车时才想起留联系方式,要求交换的方便更快捷。
3.1.6用例6
用户在看到某件有趣的产品或者是遇见某件趣事时,希望能通过微博与朋友们分享。
3.2系统需求分析
本节主要介绍系统需求,涉及第三方服务授权和系统性能等需求。
3.2.1系统界面运行流畅
系统向用户展示展会、展品的概况,需加载大量的图片,系统使用资源较多,应使用缓存、多线程技术绘制用户界面,保证界面的流畅性。
3.2.2第三方授权
系统引入的第三方服务,均需获得用户授权能可使用,引入的第三方服务包括百度云个人云存储(PCS)、新浪微博开放服务。百度云LBS云服务,需要应用申请权限用户无需授权。
3.3小结
系统的需求分析,充分基于用户在参展的前、中、后的活动进行,是一次合理的分析。它包括参展前的决策,本文转载自http://www.biyezuopin.vip/onews.asp?id=14557系统需提供富媒体信息供用户参考,帮助决策是否参展;参展中,使用近场识别技术方便用户识别展品、使用百度个人云存储服务持久化保存展品介绍。此外,还挖掘出用户在参展中有查找附近餐饮的需求和交换联系人信息的需求。
/*** 这是首页* 顶部可浏览展览会图片* 下面可以对应信息* 能查看详情*/package com.scut.exguide.ui;import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.oauth.BaiduOAuth;
import com.baidu.oauth.BaiduOAuth.BaiduOAuthResponse;
import com.example.exguide.R;import com.scut.exguide.listener.MyLocationListener;
import com.scut.exguide.listener.WeiboOAuthListener;
import com.scut.exguide.mulithread.GetExhList;
import com.scut.exguide.mulithread.LoaderImageTask;
import com.scut.exguide.utility.AccessTokenKeeper;
import com.scut.exguide.utility.Constant;
import com.scut.exguide.utility.DBUtility;
import com.scut.exguide.utility.Location;
import com.scut.exguide.utility.MyActivity;
import com.scut.exguide.utility.TaskHandler;
import com.scut.exguide.utility.ToastShow;
import com.weibo.sdk.android.Oauth2AccessToken;
import com.weibo.sdk.android.Weibo;import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.StrictMode;
import android.app.ActionBar;
import android.app.Activity;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ImageView;
import android.widget.Toast;public class HomeActivity extends Activity implements MyActivity {// 菜单、VIEW等UIprivate ActionBar mActionBar;// 主页的actionbarprivate Menu mMenu;private ExhListView mExhListView;// 定位APIpublic LocationClient mLocationClient = null;public BDLocationListener myListener;public static Location myLocation;// 全局标识的地理位置public String myPoint = "当前位置为:";// 当前位置public LoaderImageTask LoaderImage1 = new LoaderImageTask();public LoaderImageTask LoaderImage2 = new LoaderImageTask();// PCS APIBaiduOAuth oauthClient = null;public static String mbOauth = null;// AcessTokenpublic Weibo mWeibio;public static Oauth2AccessToken mOauth2AccessToken;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// setContentView(R.layout.activity_home);ToastShow.setActivity(this);mExhListView = new ExhListView(this);setContentView(mExhListView.getView());SQLiteDatabase db = openOrCreateDatabase(Constant.dbname, MODE_WORLD_WRITEABLE, null);DBUtility.setDb(db);DBUtility.CreateDB();LoaderImage1.start();LoaderImage2.start();if (Build.VERSION.SDK_INT >= 11) {StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());}initialLocService();intialActionbar();}/*** 初始化actionbar*/private void intialActionbar() {mActionBar = getActionBar();// mActionBar.setDisplayHomeAsUpEnabled(true);// mActionBar.setBackgroundDrawable(getResources().getDrawable(R.drawable.title_bg_trans));mActionBar.show();}/*** 初始化定位服务*/private void initialLocService() {mLocationClient = new LocationClient(getApplicationContext());myListener = new MyLocationListener(this);LocationClientOption option = new LocationClientOption();option.setAddrType("all");// 返回的定位结果包含地址信息option.setCoorType("bd09ll");// 返回的定位结果是百度经纬度,默认值gcj02option.disableCache(true);// 禁止启用缓存定位mLocationClient.setLocOption(option);mLocationClient.registerLocationListener(myListener);mLocationClient.start();if (mLocationClient != null && mLocationClient.isStarted())mLocationClient.requestLocation();elseLog.d("LocSDK3", "locClient is null or not started");// mLocationClient.}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.option, menu);mMenu = menu;mMenu.getItem(0).setTitle(myPoint);return true;}@Overrideprotected void onStart() {// TODO Auto-generated method stubsuper.onStart();}/*** actionbar的菜单判断*/@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// TODO Auto-generated method stubswitch (item.getOrder()) {case 1: {// 定位}break;case 2: {// 设置绑定PCSGotoPcsOAuth();}break;case 3: {// 设置绑定WeiobmWeibio = Weibo.getInstance(Constant.APP_KEY,Constant.REDIRECT_URL, Constant.SCOPE);mWeibio.anthorize(HomeActivity.this, new WeiboOAuthListener(mOauth2AccessToken));AccessTokenKeeper.keepAccessToken(getApplicationContext(), mOauth2AccessToken);}break;case 4: {finish();}break;}return super.onOptionsItemSelected(item);}public Handler mhandler = new Handler() {@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubswitch (msg.what) {case Constant.SetLoaction: {myLocation = (Location) msg.obj;String l = myPoint + myLocation.City;mMenu.getItem(0).setTitle(l);GetExhList asyGet = new GetExhList(mExhListView);String city = String.copyValueOf(myLocation.City.toCharArray(),0, myLocation.City.length() - 1);String path = Constant.RequestExhlistUrl + "/city/" + city;asyGet.execute(path);}break;case Constant.UpdateUI: {TaskHandler task = (TaskHandler) msg.obj;Bitmap bp = LoaderImageTask.PicsMap.get(task.getPath());// ImageView iv = (ImageView) LoaderImageTask.ViewsMap.get(task// .getPath());task.Update(bp);// iv.setImageBitmap(bp);Log.d("TEST", "设置");}break;}super.handleMessage(msg);}};public String getTag() {// TODO Auto-generated method stubreturn null;}public void GotoPcsOAuth() {BaiduOAuth oauthClient = new BaiduOAuth();oauthClient.startOAuth(this, Constant.mbApiKey, new String[] { "basic","netdisk" }, new BaiduOAuth.OAuthListener() {@Overridepublic void onException(String msg) {Toast.makeText(getApplicationContext(), "Login failed " + msg,Toast.LENGTH_SHORT).show();}@Overridepublic void onComplete(BaiduOAuthResponse response) {if (null != response) {mbOauth = response.getAccessToken();Toast.makeText(getApplicationContext(),"Token: " + mbOauth + " User name:"+ response.getUserName(),Toast.LENGTH_SHORT).show();}}@Overridepublic void onCancel() {Toast.makeText(getApplicationContext(), "Login cancelled",Toast.LENGTH_SHORT).show();}});}@Overrideprotected void onDestroy() {// TODO Auto-generated method stubLoaderImageTask.Toggle();mLocationClient.stop();super.onDestroy();}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {// TODO Auto-generated method stubswitch (event.getKeyCode()) {case KeyEvent.KEYCODE_BACK: {}}return false;}@Overridepublic void Update(Object... param) {// TODO Auto-generated method stubMessage msg = new Message();msg.what = Constant.UpdateUI;msg.obj = param[0];mhandler.sendMessage(msg);}
}