前言
现在正值春招面试的时间段(收尾阶段),笔者并没有投很多简历,因为经历过一些大公司的面试之后发现太多的不足,与其花时间在刷简历上,不如好好总结和复习学过的东西,本篇就作为个人项目总结的开端。
这个项目其实就是学校的一个参赛项目,主要实现的功能是通过发送语音文字识别控制机器人移动,也可以定点或多点导航,实时接收并更新机器人反馈的状态。我主要负责安卓的开发,下面分功能模块讲解:
index界面
实现功能:三个页面(控制,对话,基本信息)可以切换。
实现方式:RadioGroup+ViewPager
实现过程:
首先创建好三个fragment并生成对象,加入ArrayList
ControlFrgt controlFrgt=new ControlFrgt();
ChatFrgt chatFrgt=new ChatFrgt();
InfoFrgt infoFrgt=new InfoFrgt();
fragmentlist=new ArrayList<>();
fragmentlist.add(controlFrgt);
fragmentlist.add(chatFrgt);
fragmentlist.add(infoFrgt);
然后写两个监听事件,一个是RadioGroup.OnCheckedChangeListener还有一个是ViewPager.OnPageChangeListener
RadioGroup的切换事件:
private class MyOnCheckListener implements RadioGroup.OnCheckedChangeListener{
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
changeCheck(controlrbtn);
changeCheck(chatrbtn);
changeCheck(infotbtn);//此方法用来改变radiobutton的属性实现切换时的动画效果
switch (checkedId){
case R.id.tap_control:viewPager.setCurrentItem(0);break;
case R.id.tap_chat:viewPager.setCurrentItem(1);break;
case R.id.tap_info:viewPager.setCurrentItem(2);break;
}
}
}
fragment页面切换事件:
private class MyPagerChangeListener implements ViewPager.OnPageChangeListener{
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
//position:当前页面——点击滑动的页面
//positionOffset:当前页面偏移的百分比
//positionOffsetPixels:当前页面偏移的像素位置
}
@Override
public void onPageSelected(int position) {
switch(position){
case 0:radioGroup.check(R.id.tap_control);break;
case 1:radioGroup.check(R.id.tap_chat);break;
case 2:radioGroup.check(R.id.tap_info);break;
}
}
@Override
public void onPageScrollStateChanged(int state) {
//此方法是在当前页面状态发生改变时调用的
switch(state){
case 0:什么都没做;break;
case 1:正在滑动;break;
case 2:滑动完成;break;
}
//所以页面滑动时,state的应该这样改变:1(正在改变)->2(滑动完成)->0(静止状态)
}
}
再创建FragmentPagerAdapter
FragmentPagerAdapter pagerAdapter=new FragmentPagerAdapter(getSupportFragmentManager()) {
//由于v4库不能直接获取FragmentManager,因此这里使用getSupportFragmentManager()间接获取
@Override
public Fragment getItem(int position) {
return fragmentlist.get(position);
}
@Override
public int getCount() {
return fragmentlist.size();
}
};
最后就是viewpager设置adapter和监听器,还有给radiogroup设置监听事件(当然初始的状态也要设置好):
viewPager.setAdapter(pagerAdapter);
viewPager.setCurrentItem(0);
radioGroup.check(R.id.tap_control);
changeCheck(controlrbtn);
MyPagerChangeListener myPagerChangeListener=new MyPagerChangeListener();
MyOnCheckListener myOnCheckListener=new MyOnCheckListener();
viewPager.addOnPageChangeListener(myPagerChangeListener);
radioGroup.setOnCheckedChangeListener(myOnCheckListener);
基本的控制主页面
实现功能:基本的前后左右控制、加减速,开始或停止,状态数据(速度、温度)的更新,展示机器人的视野(监控直播)。
实现方式:http请求(控制),timer周期任务执行(实时更新),webview(由于笔者比较菜,所以监控直播这块直接通过加载一个老师写好的网页来实现功能)。
实现过程:
使用HttpURLConnection发起网络请求
public void requestUrl(final String url){
new Thread(new Runnable() {
@Override
public void run() {
try {
String murl="http://"+url;
Log.e("当前请求的ip",murl);
HttpURLConnection urlConnection= (HttpURLConnection) new URL(murl).openConnection();
urlConnection.setRequestMethod("POST");
urlConnection.setDoOutput(true);//是否允许向网络读取数据
urlConnection.setConnectTimeout(3000);
urlConnection.setReadTimeout(5000);//设置连接,读取的超时限制
if (urlConnection.getResponseCode()==200) {
Log.e("连接服务器","成功");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}) .start();
}
就以前进举例
安卓端这边,requestUrl(ipstr+":8080/forward");
tomcat那边会这样处理:
所以安卓端这边只需要发送类似这样的url请求就可以了,说实话笔者对于java web不是很熟,基本现在的后台都是用php写的,也只是停留在很简单的数据交互,我认为一个好的安卓开发工程师不应该只懂安卓端的开发,所以这块有必要加强。
webview加载视频流的网页
这块是老师直接提供的页面,经过很长时间的尝试都没成功,所以老师没有再为难我哈哈,让我直接用网页代替video,所以这里就写一下加载网页的代码
private void openWeb(String url,WebView webView){
webView.loadUrl(url);
webView.setInitialScale(130);//设置缩放比例,这里放大1.3倍
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setDomStorageEnabled(true);
webView.setWebViewClient(new WebViewClient(){
//如果不设置WebViewClient,请求会跳转系统浏览器
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
return true;
}
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
handler.proceed();//接受证书
}
});
}
放一张运行的图片结束这块的尴尬吧:
实时更新数据
首先从网络获取json
public static void requestJson(final String url, final Handler handler){
………………
……………………………
………
InputStream is=conn.getInputStream();
BufferedReader reader=new BufferedReader(new InputStreamReader(is));
String rline="";
StringBuilder builder_result=new StringBuilder();
while ((rline=reader.readLine())!=null){
builder_result.append(rline);
Log.e("读取到json",rline);
}
Message message=new Message();
message.obj=builder_result.toString();
handler.sendMessage(message);
is.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
然后,创建定时器及TimerTask
timer=new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
NetWorkUtil.requestJson("http://" + ipstr + ":8080/app_GetInfo", handler);
}
},1000,3*1000);
@Override
public void onStop() {
super.onStop();
timer.canc