机器人远程控制系统(安卓端)

前言

现在正值春招面试的时间段(收尾阶段),笔者并没有投很多简历,因为经历过一些大公司的面试之后发现太多的不足,与其花时间在刷简历上,不如好好总结和复习学过的东西,本篇就作为个人项目总结的开端。
这个项目其实就是学校的一个参赛项目,主要实现的功能是通过发送语音文字识别控制机器人移动,也可以定点或多点导航,实时接收并更新机器人反馈的状态。我主要负责安卓的开发,下面分功能模块讲解:

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
  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值