赞
踩
目录
第1章 绪论 1
1.1 课题背景 1
1.1.1 人工智能 1
1.1.2 大数据 1
1.2 目的意义 2
1.3 论文主要工作 2
第2章 相关技术和理论基础 3
2.1 技术与理论基础1 3
2.1.1 ButterKnife依赖注入框架 3
2.1.2 Gson框架 4
2.1.3 OkHttp网络框架 4
2.2 技术与理论基础2 4
2.2.1 科大讯飞语音识别与图灵机器人 5
2.2.2 Bmob后端服务平台以及蒲公英应用平台 5
2.2.3 GitHub项目管理工具 5
第3章 系统分析(需求分析) 7
3.1功能需求分析 7
3.1.1 用户需求分析 7
3.1.2 功能需求分析 7
3.2 非功能需求分析 8
3.3可行性分析 8
3.3.1 经济可行性 8
3.3.2 技术可行性 8
3.3.3 操作可行性 8
第4章 系统设计 9
4.1 总体设计 9
4.1.1 功能模块图 9
4.1.2 用例图 10
4.1.3 数据流图 10
4.2 详细设计 10
4.2.1 登录注册模块 11
4.2.2 网易新闻模块 11
4.2.3 图灵机器人模块 11
4.2.4 欧酷天气模块 11
4.2.5 引导页、欢迎页模块 12
4.2.6 开发者详情模块 12
4.2.7 应用更新模块 12
第5章 系统实现与测试 13
5.1 系统实现 13
5.1.1 登录、注册模块实现 13
5.1.2 图灵机器人模块实现 16
5.1.3 网易新闻模块实现 19
5.2 系统测试 20
5.2.1 登录注册功能测试 20
5.2.2 图灵机器人、网易新闻模块测试 22
5.2.3 欧酷天气模块测试 24
第6章 总结和展望 26
6.1 本文总结 26
6.1.1 项目管理总结 27
6.1.2 项目中遇到问题如何解决 27
6.1.3 如何获取开发方面的优质资源 27
6.2 未来展望 27
6.2.1 可添加的功能 27
6.2.2 解决兼容性问题 27
参考文献 28
附录 29
致谢 35
4.2 详细设计
对于引导页模块,采用图片滑动形式,引导用户了解如何使用该软件以及相关的功能。
对于登录模块,采用两种登录方式:账号密码登录和刷脸登录。账号密码登录的话采用Bmob后端云数据库实现,刷脸登录采用的是一登刷脸服务。
对于注册模块,同样采用的是Bomb后端云数据库。
对于网易新闻模块,采用的是网易新闻的接口。
对于欧酷天气模块,采用的是天气预报的接口。
对于图灵机器人模块,采用的图灵智能机器人的接口。
对于开发者个人信息模块,采用列表显示出来。
对于应用更新模块,采用蒲公英应用发布平台的App更新技术。
4.2.1 登录注册模块
1、登录模块处理逻辑如下:
(1)用户输入账号密码进行登录
(2)通过回调函数获取登录返回结果
(3)根据返回结果判断登陆是否成功,若登录成功则显示用户信息,否则提示登录失败。
(4)登陆成功将用户的姓名和电话显示出来
2、注册模块处理逻辑如下:
(1)用户输入账号密码进行注册
(2)通过回调函数获取注册返回结果
(3)根据注册返回结果判断是否注册成功,本文转载自http://www.biyezuopin.vip/onews.asp?id=14613若注册成功则返回登录页面,否则提示注册失败
4.2.2 网易新闻模块
1、网易新闻模块处理逻辑如下:
(1)通过天气接口的URL获取返回的JSON数据
(2)将JSON数据转换为News对象
(3)将数据显示在页面上
4.2.3 图灵机器人模块
1、图灵机器人模块的处理逻辑如下:
(1)将语音数据转换为文本数据
(2)通过图灵接口的URL获取返回的JSON数据
(3)将JSON数据转换为TalkBean对象
(4)获取对象中的内容,再将其转换为语音输出
4.2.4 欧酷天气模块
1、欧酷天气模块处理逻辑如下:
(1)通过城市URL获取城市JSON数据
(2)将JSON数据转换为城市对象
(3)通过天气URL获取天气JSON数据
(4)将天气JSON数据转换为天气对象
(5)在页面显示天气信息
4.2.5 引导页、欢迎页模块
1、引导页、欢迎页模块处理逻辑如下:
(1)判断应用是不是第一次打开
(2)判断本地数据库是否有记录,若是第一次打开的话则显示引导页,并将记录写到本地数据库
(3)否则直接进入欢迎页
4.2.6 开发者详情模块
1、开发者详情模块处理逻辑如下:
(1)直接加载布局文件的内容显示出来
4.2.7 应用更新模块
1、应用更新模块的处理逻辑如下:
(2)点击检测更新按钮
(3)系统比较本地版本和服务器上的版本
(4)若本地版本等于服务器版本,则提示用户“您的应用已是最新版本!”
(5)若本地版本低于服务器版本,则提示用户“检测到新版本,是否更新?”
(6)若用户点击“取消”,则退出更新
(7)若用户点击“确定”,则后台服务自动下载应用更新包
(8)下载完成后,系统提示用户是否立即安装
(9)若用户点击“取消”,则退出安装程序
(10)若用户点击“确定”,则等待安装完成
package com.zscdumin.zhixinapp.activity; import android.annotation.SuppressLint; import android.content.DialogInterface; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.design.widget.NavigationView; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.view.KeyEvent; import android.view.MenuItem; import android.view.View; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import com.pgyersdk.crash.PgyCrashManager; import com.pgyersdk.javabean.AppBean; import com.pgyersdk.update.PgyUpdateManager; import com.pgyersdk.update.UpdateManagerListener; import com.zscdumin.zhixinapp.R; import com.zscdumin.zhixinapp.fragment.MeFragment; import com.zscdumin.zhixinapp.fragment.ParentFragment; import java.io.IOException; import java.io.InputStream; import butterknife.BindView; import butterknife.ButterKnife; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.ResponseBody; public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { @BindView(R.id.drawer_layout) DrawerLayout drawer; @BindView(R.id.nav_layout) NavigationView nav_layout; //Fragment private ParentFragment newsListFragment = null; private MeFragment meFragment = null; private FragmentTransaction transaction; private Fragment fragment; private ImageView user_icon_iv = null; private TextView user_name_tv = null; private TextView user_phone_tv = null; @SuppressLint("HandlerLeak") private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case 0x11: user_icon_iv.setImageBitmap((Bitmap) msg.obj); break; } } }; @SuppressLint("SetTextI18n") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getSupportActionBar() != null) { getSupportActionBar().hide(); } setContentView(R.layout.fragment_main); ButterKnife.bind(this); PgyUpdateManager.register(this); transaction = getSupportFragmentManager().beginTransaction(); //初始是新闻页面 newsListFragment = new ParentFragment(); transaction.add(R.id.fl_content, newsListFragment, "newsListFragment").commit(); nav_layout.setNavigationItemSelectedListener(this); View view = nav_layout.inflateHeaderView(R.layout.nav_header_main); user_name_tv = view.findViewById(R.id.user_name); user_phone_tv = view.findViewById(R.id.user_phone); user_icon_iv = view.findViewById(R.id.user_icon); /** * 获取用户数据 */ Intent intent = getIntent(); Bundle bundle = intent.getExtras(); String login_type = bundle.getString("login_type"); if (login_type.equals("with_face")) { String user_name = bundle.getString("user_name"); String user_icon_url = bundle.getString("user_icon"); String user_phone = bundle.getString("phone_num"); user_name_tv.setText("用户:【" + user_name + "】"); user_phone_tv.setText("手机:【" + user_phone + "】"); setBitmapByUrl(user_icon_url); } else if (login_type.equals("with_account")){ user_name_tv.setText("用户:【杜敏】"); user_phone_tv.setText("手机:【18979429542】"); } } public void setBitmapByUrl(final String url) { new Thread() { @Override public void run() { //获取okHttp对象get请求, try { OkHttpClient client = new OkHttpClient(); //获取请求对象 Request request = new Request.Builder().url(url).build(); //获取响应体 ResponseBody body = client.newCall(request).execute().body(); //获取流 InputStream in = body.byteStream(); //转化为bitmap Bitmap bitmap = BitmapFactory.decodeStream(in); //使用Hanlder发送消息 Message msg = Message.obtain(); msg.what = 0x11; msg.obj = bitmap; handler.sendMessage(msg); } catch (IOException e) { e.printStackTrace(); } } }.start(); } @Override public boolean onNavigationItemSelected(MenuItem item) { Intent intent; switch (item.getItemId()) { case R.id.nav_news: //新闻菜单 item.setChecked(true); transaction = getSupportFragmentManager().beginTransaction(); fragment = getSupportFragmentManager().findFragmentByTag("newsListFragment"); if (fragment != null) { transaction.show(newsListFragment); } else { transaction.add(R.id.fl_content, newsListFragment, "newsListFragment"); } if (meFragment != null) { transaction.hide(getSupportFragmentManager().findFragmentByTag("meFragment")); } //提交事务 transaction.commit(); //关闭抽屉菜单 drawer.closeDrawers(); break; case R.id.nav_me: item.setChecked(true); transaction = getSupportFragmentManager().beginTransaction(); if (meFragment != null) { transaction.show(meFragment); } else { meFragment = new MeFragment(); transaction.add(R.id.fl_content, meFragment, "meFragment"); } if (newsListFragment != null) { transaction.hide(getSupportFragmentManager().findFragmentByTag("newsListFragment")); } transaction.commit(); //关闭抽屉菜单 drawer.closeDrawers(); break; case R.id.nav_tuling: intent = new Intent(this, TulingActivity.class); startActivity(intent); break; case R.id.nav_weather: intent = new Intent(this, WeatherMainActivity.class); startActivity(intent); break; case R.id.nav_version_update: checkAppUpdate(); break; } return true; } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { new AlertDialog.Builder(this).setTitle("主人,确定要退出吗?") .setIcon(R.drawable.exit) .setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { finish(); } }) .setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(MainActivity.this, "向右滑弹出抽屉菜单!", Toast.LENGTH_LONG).show(); } }).show(); } return false; } @Override protected void onDestroy() { super.onDestroy(); PgyCrashManager.unregister(); System.exit(0); } //版本更新代码 private void checkAppUpdate() { PgyUpdateManager.register(MainActivity.this, new UpdateManagerListener() { @Override public void onUpdateAvailable(final String result) { // 将新版本信息封装到AppBean中 final AppBean appBean = getAppBeanFromString(result); new AlertDialog.Builder(MainActivity.this) .setIcon(R.drawable.update_bg) .setTitle("发现新版本,立即更新?") .setMessage(appBean.getReleaseNote()) .setNegativeButton( "确定", new DialogInterface.OnClickListener() { @Override public void onClick( DialogInterface dialog, int which) { startDownloadTask( MainActivity.this, appBean.getDownloadURL()); } }).show(); } @Override public void onNoUpdateAvailable() { Toast.makeText(MainActivity.this,"当前应用已经是最新版了!",Toast.LENGTH_SHORT).show(); } }); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。