一、团队成员
姓名 |
学号 |
博客链接 |
洪居兴 |
1600802113 |
|
邓旺 |
1600802108 |
|
李洪岩 |
1600802119 |
二、团队项目APK链接
https://coding.net/u/qhu_1600802113/p/Final_Work/git/blob/master/app/app-release.apk
三、团队项目链接
https://git.coding.net/qhu_1600802113/Final_Work.git
四、团队项目总体效果
功能说明:想进入软件App中需要进行注册,在注册界面需要填写正确的手机号,而后等待验证码的发送,待验证码验证正确
后,将进入修改界面进行修改信息,修改完成后即可进入App首页。
在App首界面中,可以点击播放区下的4个对应的图标:景区、酒店、美食、路线跳转到不同功能的界面。在景点精选榜中可
以查看推荐的值得去的景点,并可点赞以及进入相应详情界面进行查看,还可进行位置的查看。底部导航栏可跳转到相应功能的界面。
在攻略功能模块中,能够选择西北5省部的部分旅游景点,并点击进入查看详细,还可切换各省查看每个省份的景点。
在驴友功能模块中,用户可以在其中发布寻找驴友的消息,并且进行查看详情。在动态功能模块中,能够发布自己的动态信息,
也能查看他人的动态信息。
在个人信息中心,显示用户的基本信息,并在个人信息当中修改自己的信息。
4.1 登陆界面及注册界面
实现用户的注册和登入,进入首页面。
4.2 修改信息界面及首界面
实现注册信息后信息的补充,以及登陆后首页面的情况。
4.3 查看美食和酒店的界面
实现酒店和美食详情的界面。
4.4 旅游攻略及详情页
实现西北五个省份的部分旅游景点的介绍以及点击每个景点可查看对应的详情页,包括简介、地理位置、特色等等。
4.5 发布动态以及发布寻找旅游的消息
实现动态的发布与查看、实现寻找驴友消息的查看与发布。
4.6 个人中心信息的查看以及修改
实现用户对自己基本信息的查看和对自己信息的修改。
五、关键代码
5.1 首页图片切换
int[] images = new int[] { R.drawable.shufflingtwo, R.drawable.shufflingthree, R.drawable.shufflingfour, R.drawable.shufflingfive, R.drawable.shufflingone, }; //定义一图片计数器 int currentImg = 0; //定义一个handler来进行隔时间操作 private Handler handler = new Handler(); //新建一个runnable对象 private Runnable myRunnable = new Runnable() { public void run() { //每隔1秒切换一次 handler.postDelayed(this, 3000); if (currentImg >= 4) { currentImg = -1; } // 改变ImageView里显示的图片 image1.setImageResource(images[++currentImg]); } };
5.2 登录匹配
login.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { EditText name = (EditText)findViewById(R.id.userName); EditText psw = (EditText)findViewById(R.id.usePassword); SQLiteDatabase db=dbHelper.getWritableDatabase(); Cursor cursor = db.query("UserInfo",null,null,null,null,null,null); if(cursor.moveToFirst()){ do{ String sername = cursor.getString(cursor.getColumnIndex("userName")); String assword = cursor.getString(cursor.getColumnIndex("mima")); info.setId(assword); if(name.getText().toString().equals(sername) && psw.getText().toString().equals(assword)){ info.setId(sername); info.setIsFirst(false); Toast.makeText(MainActivity.this,"登录成功!", Toast.LENGTH_SHORT).show(); Intent intent = new Intent(MainActivity.this,homePage.class); startActivity(intent); }else{ Toast.makeText(MainActivity.this,"用户名或密码输入错误,请重新输入!", Toast.LENGTH_SHORT).show();//插入数据 } }while(cursor.moveToNext()); } } }); }
5.3 获取每个详情页的内容并显示
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main2); mapView = (MapView) findViewById(R.id.bmapView); baiduMap = mapView.getMap(); baiduMap.setMyLocationEnabled(true); locationClient = new LocationClient(this); locationClient.registerLocationListener(myListener); LocationClientOption option = new LocationClientOption(); option.setOpenGps(true); // 打开gps option.setCoorType("bd09ll"); // 设置坐标类型 option.setScanSpan(1000);//定位请求时间间隔 locationClient.setLocOption(option); locationClient.start(); Intent intent = getIntent();//接收数据 Bundle bundle = intent.getExtras(); int number = bundle.getInt("id"); final ImageView pre = (ImageView)findViewById(R.id.pre); final ImageView sence = (ImageView)findViewById(R.id.sence); final TextView site = (TextView)findViewById(R.id.site); final TextView youwangailan = (TextView)findViewById(R.id.youwangailan); final TextView article = (TextView)findViewById(R.id.article); final ImageView beauty1 = (ImageView)findViewById(R.id.character1); final ImageView beauty2 = (ImageView)findViewById(R.id.character2); final ImageView beauty3 = (ImageView)findViewById(R.id.character3); final ImageView beauty4 = (ImageView)findViewById(R.id.character4); final ImageView beautys1 = (ImageView)findViewById(R.id.beautys1); final ImageView beautys2 = (ImageView)findViewById(R.id.beautys2); final ImageView beautys3 = (ImageView)findViewById(R.id.beautys3); final TextView decise1 = (TextView)findViewById(R.id.decise1); final TextView decise2 = (TextView)findViewById(R.id.decise2); final TextView decise3 = (TextView)findViewById(R.id.decise3); final TextView decise4 = (TextView)findViewById(R.id.decise4); pre.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(Main2Activity.this,homePage.class); startActivity(intent); } }); TypedArray arr = getResources().obtainTypedArray(R.array.represent); int len = arr.length(); int[] arr_represent = new int[len]; for(int i = 0;i<len;i++) { arr_represent[i] = arr.getResourceId(i,0); } arr.recycle(); String[] arr_title = getResources().getStringArray(R.array.titles); String[] arr_introduce = getResources().getStringArray(R.array.introduce); String[] arr_youwangaishu = getResources().getStringArray(R.array.youwanliulan); arr = getResources().obtainTypedArray(R.array.tedianphoto1); len = arr.length(); int[] arr_pic1 = new int[len]; for(int i = 0;i<len;i++) { arr_pic1[i] = arr.getResourceId(i,0); } arr.recycle(); arr = getResources().obtainTypedArray(R.array.tedianphoto2); len = arr.length(); int[] arr_pic2 = new int[len]; for(int i = 0;i<len;i++) { arr_pic2[i] = arr.getResourceId(i,0); } arr.recycle(); arr = getResources().obtainTypedArray(R.array.tedianphoto3); len = arr.length(); int[] arr_pic3 = new int[len]; for(int i = 0;i<len;i++) { arr_pic3[i] = arr.getResourceId(i,0); } arr.recycle(); arr = getResources().obtainTypedArray(R.array.tedianphoto4); len = arr.length(); int[] arr_pic4 = new int[len]; for(int i = 0;i<len;i++) { arr_pic4[i] = arr.getResourceId(i,0); } arr.recycle(); arr = getResources().obtainTypedArray(R.array.beauty1); len = arr.length(); int[] arr_beautypic1 = new int[len]; for(int i = 0;i<len;i++) { arr_beautypic1[i] = arr.getResourceId(i,0); } arr.recycle(); arr = getResources().obtainTypedArray(R.array.beauty2); len = arr.length(); int[] arr_beautypic2 = new int[len]; for(int i = 0;i<len;i++) { arr_beautypic2[i] = arr.getResourceId(i,0); } arr.recycle(); arr = getResources().obtainTypedArray(R.array.beauty3); len = arr.length(); int[] arr_beautypic3 = new int[len]; for(int i = 0;i<len;i++) { arr_beautypic3[i] = arr.getResourceId(i,0); } arr.recycle(); sence.setImageResource(arr_represent[number]); String[] arr_tese1 = getResources().getStringArray(R.array.tedian1); String[] arr_tese2 = getResources().getStringArray(R.array.tedian2); String[] arr_tese3 = getResources().getStringArray(R.array.tedian3); String[] arr_tese4 = getResources().getStringArray(R.array.tedian4); site.setText(arr_title[number]); article.setText(arr_introduce[number]); youwangailan.setText(arr_youwangaishu[number]); beauty1.setImageResource(arr_pic1[number]); beauty2.setImageResource(arr_pic2[number]); beauty3.setImageResource(arr_pic3[number]); beauty4.setImageResource(arr_pic4[number]); decise1.setText(arr_tese1[number]); decise2.setText(arr_tese2[number]); decise3.setText(arr_tese3[number]); decise4.setText(arr_tese4[number]); beautys1.setImageResource(arr_beautypic1[number]); beautys2.setImageResource(arr_beautypic2[number]); beautys3.setImageResource(arr_beautypic3[number]); }
5.4 发布动态消息及显示
fabiao.setOnClickListener(new View.OnClickListener() { @RequiresApi(api = Build.VERSION_CODES.N) @Override public void onClick(View view) { SQLiteDatabase db = dbHelper1.getWritableDatabase(); ContentValues values1 = new ContentValues(); values1.put("id",total); values1.put("userNames",info.getId()); values1.put("article",neirong.getText().toString()); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); Date date = new Date(System.currentTimeMillis()); values1.put("releasetime",simpleDateFormat.format(date)); db.insert("Message",null,values1); total++; Toast.makeText(releaseMessage.this,"发布成功!", Toast.LENGTH_SHORT).show(); Intent intent = new Intent(releaseMessage.this,personalDynamics.class); startActivity(intent); //Toast.makeText(mContext,"insert success", Toast.LENGTH_SHORT).show(); } });
final saveSelfInfo info = (saveSelfInfo)getApplication(); dbHelper1 = new Database(this,"releaseMessage.db",null,1); SQLiteDatabase db = dbHelper1.getWritableDatabase(); Cursor cursor = db.query("Message",null,null,null,null,null,null,null); int i = 0; if(cursor.moveToFirst()) { do { //遍历Cursor对象,去除数据并打印 Map<String, Object> map = new HashMap<String, Object>(); map.put("touxiang1", R.drawable.touxiang); map.put("username", info.getId()); map.put("article", cursor.getString(cursor.getColumnIndex("article"))); //map.put("seletephoto1", arr_photo1[i]); //map.put("seletephoto2", arr_photo2[i]); //map.put("seletephoto3", arr_photo3[i]); map.put("longtime", cursor.getString(cursor.getColumnIndex("releasetime"))); map.put("Comment", arr_comment[i]); dataList.add(map); i++; }while (cursor.moveToNext()); } cursor.close();
5.5 个人信息修改
update.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { SQLiteDatabase db = dbHelper.getWritableDatabase(); if(nicheng.getText().toString().equals("") || phone.getText().toString().equals("") || site.getText().toString().equals("") || Email.getText().toString().equals("")){ Intent intent = new Intent(personInfo.this,personInfo.class); startActivity(intent); } ContentValues values = new ContentValues(); values.put("id",11); values.put("nicheng",nicheng.getText().toString()); values.put("userName",nicheng.getText().toString()); values.put("phoneNumber",phone.getText().toString()); values.put("suozaidi",site.getText().toString()); values.put("email",Email.getText().toString()); values.put("mima",mima.getText().toString()); db.update("UserInfo",values,"phoneNumber = ?",new String[]{myphone}); info.setId(nicheng.getText().toString()); info.setRegisterPhone(phone.getText().toString()); info.setIsFirst(false); Toast.makeText(personInfo.this,"修改成功!", Toast.LENGTH_SHORT).show(); Intent intent = new Intent(personInfo.this,homePage.class); startActivity(intent); } });
5.6 获取当前地理位置
public class MyLocationListenner implements BDLocationListener { @Override public void onReceiveLocation(BDLocation location) { // map view 销毁后不在处理新接收的位置 if (location == null || mapView == null) { return; } MyLocationData locData = new MyLocationData.Builder() .accuracy(location.getRadius()) // 此处设置开发人员获取到的方向信息,顺时针0-360 .direction(100).latitude(location.getLatitude()) .longitude(location.getLongitude()).build(); baiduMap.setMyLocationData(locData); if (isFirstLoc) { isFirstLoc = false; LatLng ll = new LatLng(location.getLatitude(), location.getLongitude()); MapStatus.Builder builder = new MapStatus.Builder(); builder.target(ll).zoom(18.0f); baiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build())); } } public void onReceivePoi(BDLocation location) { } }
5.7 验证手机号码
if(v.getId() == R.id.btn_check){ phone = et_phonenum.getText().toString().trim().replaceAll("/s",""); if (!TextUtils.isEmpty(phone)) { //定义需要匹配的正则表达式的规则 String REGEX_MOBILE_SIMPLE = "[1][358]\\d{9}"; //把正则表达式的规则编译成模板 Pattern pattern = Pattern.compile(REGEX_MOBILE_SIMPLE); //把需要匹配的字符给模板匹配,获得匹配器 Matcher matcher = pattern.matcher(phone); // 通过匹配器查找是否有该字符,不可重复调用重复调用matcher.find() if (matcher.find()) {//匹配手机号是否存在 alterWarning(); } else { toast("手机号格式错误"); } } else { toast("请先输入手机号"); } }
5.8 发送短信
EventHandler eh=new EventHandler(){ @Override public void afterEvent(int event, int result, Object data) { if (result == SMSSDK.RESULT_COMPLETE) { if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) { toast("验证成功"); }else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE){ //获取验证码成功 toast("获取验证码成功"); }else if (event ==SMSSDK.EVENT_GET_SUPPORTED_COUNTRIES){//如果你调用了获取国家区号类表会在这里回调 //返回支持发送验证码的国家列表 } }else{//错误等在这里(包括验证失败) //错误码请参照http://wiki.mob.com/android-api-错误码参考/这里我就不再继续写了 ((Throwable)data).printStackTrace(); String str = data.toString(); toast(str); } } };
5.9 验证验证码
else if(v.getId() == R.id.btn_sure){ //获得用户输入的验证码 String code = et_checkecode.getText().toString().replaceAll("/s",""); if (!TextUtils.isEmpty(code)) {//判断验证码是否为空//验证 SMSSDK.submitVerificationCode( country, phone, code); final saveSelfInfo info = (saveSelfInfo)getApplication(); if(info.getIsCheck()){ SQLiteDatabase db = dbHelper.getWritableDatabase();//插入数据库数据 ContentValues values = new ContentValues(); values.put("id",1); values.put("phoneNumber",et_phonenum.getText().toString()); db.insert("UserInfo",null,values); isright = "success"; if(isright.equals("success")) { //final saveSelfInfo info = (saveSelfInfo)getApplication(); info.setRegisterPhone(et_phonenum.getText().toString()); info.setIsFirst(true); Intent intent = new Intent(forgetPassword.this, personInfo.class); startActivity(intent); }}else { Toast.makeText(forgetPassword.this,"请同意协议!!", Toast.LENGTH_SHORT).show(); } //这里加上你原来的代码 }else{//如果用户输入的内容为空,提醒用户 toast("请输入验证码后再提交"); } }
6、评选其他团队项目前五名并进行评价
第一名:沈顺文组的“代码杀”
实现了一款学习代码的App,实现了基本的功能,能够对学习代码知识有一定的帮助
优点:界面较为美观、功能模块之间搭配合理,能够较好的结合,促进用户学习代码知识,还能够较好的解决用户在代码知识中的疑问。
缺点:少部分功能没有实现、只能从自身存储的数据进行查询。
如果是我来做:如果是我参加这个项目,将增加APP能够从网络上查找资源的功能,能够更全面的解释代码知识点。
第二名:杨圣豪、汤文涛、黄东强组的校园二手交易APP
该App是一个基于校园内二手货品的交易平台,实现了发布二手商品和与商家的互动,功能较为完善、界面简介明了、一目了然、操作也较为简单。
优点:关于二手交易的基本功能及界面都已经做出,能够有一定的交互,完成度比较高,其中照片的获取较为新颖。
缺点:界面简洁,但没有令人看一眼就想用的欲望。偶尔出现闪退的现象,在留言上还存在有一定的缺陷。
如果是我来做:如果我参加这个项目,将会增加用户发布自己想要的二手商品,让商家和用户实现双向交互。
第三名:李怡龙、刘显云、刘志祥组的windroid App
实现了注册登录、与PC端的链接,能够进行数据传输,实现PC端与安卓端的交互;
优点:能够实现安卓端与PC端的链接,并且能够读取和显示连接的信息,并且对其进行修改等功能。
缺点:界面不够美化,功能较为单一。
如果是我来做:如果是我参加这个项目,将从界面的美化上花些功夫。
第四名:刘宇莹、孟鑫菲组的电子拍卖App
实现了一个电子版的拍卖行,能够发布拍卖品并且能够参与竞拍。
优点:功能较为完善、能够查看拍卖物品、自己拍卖物品等详细情况;能够在平板和安卓手机上运行,还实现了服务器端。
缺点:有一些功能还没能够实现,有时会出现闪退的现象,对竞拍物品没有图片的展示,不够完善。
如果是我来做:如果我参加这个项目,将会增加获取拍卖品的图片,能够更好的让用户了解拍品的情况。
第五名:苏毅俊、南加拉才让、周泽加、李长栋的点名app
实现上课的顺序点名、随机点名、还能修改学生信息和查看学生旷课及请假次数,方便点名。
优点:对学生旷课和请假的次数进行统计,能够进行随机点名。
缺点:功能较单一、还可以继续拓展其他方面。
如果是我来做:如果我参加该项目,将可以实现作业提交情况的统计,或者保存管理学生的提交的电子作业功能。
七、游山玩水APP操作录屏
http://www.iqiyi.com/w_19s4zcup2d.html
八 、遇到的问题
洪居兴,1600802113,在做项目中遇到的问题有:
1)数据库的创建以及增删改查不能够正常运行,常出现执行sql语句错误。
2)发布动态常不能够发布多条
3)ListView列表对数据的绑定
4)水平ListView的实现
解决办法:
1)重新创建一个数据库,在其中创建表,注意表的命名以及使用该数据库时数据库名字须相同。最终原因在于变量名出错,因此重新修改数据库即可解决。
2)将发布的动态设置一个唯一的id,因此就可实现多条信息打发布。
3)ListView列表对数据的绑定实在适配器中进行设置,需要获取子页面布局中的变量,并为其赋值,追加至列表中即可。
4)通过引入对应的自定义java文件,后实现水平ListView,还可对其点击作出监听。
邓旺,1600802108,在项目中遇到的问题:
1)地图所用的包选择
2)权限的问题
3)验证码的获取和验证
4)短信的多种使用方法的不同和缺陷
5)配置的问题
解决办法:
采用看百度地图平台和MD5平台的官方文档解决,以及上网查阅资料解决问题。
九、团队成员在本项目中的得分
姓名 | 分工 | 工作比例 | 得分(10) |
洪居兴 | App整体框架构建、大部分数据库链接、大部分界面编写、地图 | 40% | 4 |
邓旺 | 验证码、地图显示、整体框架构建、部分数据库、部分界面编写 | 40% | 4 |
李洪岩 | 部分界面编写、框架构建、资料查找 | 20% | 2 |