时间:2021-05-20
目前智能电视终端(智能电视和智能电视盒子)已经越来越火,过去主打视频功能,如今的智能电视终端不仅会继续完善视频功能,还会加入电视游戏功能,同时这也赶上了“电视游戏机解禁”的时机。
当今的大部分Android手游都能够在Android系统的电视终端上运行,其中有少数手游是原生支持手柄(例如MOGA手柄),这部分游戏可以作为电视游戏。但其他手游(射击,赛车,动作等游戏)若要在电视上玩,就需要修改操控模式,把触摸屏操控改为手柄实体键操控。
本文主要讲解的是如何使用/system/bin/之下的Input命令模拟按键和触摸屏操作,调用Input命令需要具备root权限。本文完整代码点击此处本站下载。
程序运行结果如下图所示:
本文核心RootCommand.java的代码如下,不建议把代码浓缩成全局静态方法,这里保持process和os这2个变量的生命周期直到app结束,可以减去多次初始化/释放的耗时。具体代码如下:
package com.hellogv.slinput;import java.io.DataOutputStream;import java.io.IOException;import android.util.Log;/** * 调用su执行input命令 * 全局只调用一次init()和exit(),多次调用run()。 * @author hellogv * */public class RootCommand { private String TAG="RootCommand"; private Process process = null; private DataOutputStream os = null; public void init() { try { process = Runtime.getRuntime().exec("su"); os = new DataOutputStream(process.getOutputStream()); } catch (IOException e) { Log.e(TAG, getExceptionMessage(e)); } } /** * 模仿shell来执行命令,必须先root再使用 * * @param command * @return */ public boolean run(String command) { try { os.writeBytes(command + "\n"); os.flush(); } catch (Exception e) { Log.e(TAG, getExceptionMessage(e)); return false; } return true; } /** * 模仿shell来执行命令,必须先root再使用 * * @param command * @return */ public void release() { try { os.writeBytes("exit\n"); os.flush(); process.waitFor(); } catch (Exception e) { Log.e(TAG, getExceptionMessage(e)); } finally { try { if (os != null) { os.close(); } process.destroy(); } catch (Exception e) { } } } private static String getExceptionMessage(Exception ex){ String result=""; StackTraceElement[] stes = ex.getStackTrace(); for(int i=0;i<stes.length;i++){ result=result+stes[i].getClassName() + "." + stes[i].getMethodName() + " " + stes[i].getLineNumber() +"line" +"\r\n"; } return result; }}调用RootCommand的代码如下,input命令的使用格式详见代码:
public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);rootCommand.init();//模拟按下Home键btnTestKey = (Button) this.findViewById(R.id.btnTestKey);btnTestKey.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { //命令格式:input keyevent keycode rootCommand.run("/system/bin/input keyevent "+KeyEvent.KEYCODE_HOME); }});//模拟滑动触摸屏btnTestSwipe= (Button) this.findViewById(R.id.btnTestSwipe);btnTestSwipe.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { int x2 = MainActivity.this.getWindow().getDecorView().getWidth() - 10; //先去到桌面 rootCommand.run("/system/bin/input keyevent "+KeyEvent.KEYCODE_HOME); //滑动桌面,命令格式:input swipe x1 y1 x2 y2 for(int i=0;i<4;i++){ rootCommand.run("/system/bin/input swipe 10 300 "+x2+" 400"); rootCommand.run("/system/bin/input swipe "+x2+" 300 10 400"); } }});//模拟点击触摸屏btnTestTap= (Button) this.findViewById(R.id.btnTestTap);btnTestTap.setOnClickListener( new OnClickListener(){ @Override public void onClick(View v) { int[] location = new int[2]; btnTestSwipe.getLocationOnScreen(location); int x = location[0]+btnTestSwipe.getWidth()/2; int y = location[1]+btnTestSwipe.getHeight()/2; //模拟点击btnTestTap rootCommand.run("/system/bin/input tap "+x+" "+y); }});//退出程序btnExit = (Button) this.findViewById(R.id.btnExit);btnExit.setOnClickListener( new OnClickListener(){ @Override public void onClick(View v) { rootCommand.release(); MainActivity.this.finish(); }});//判断是否root过,没root过不可用if(RootTools.isRootAvailable()==false){ Toast.makeText(this, "本程序需要使用ROOT权限。", Toast.LENGTH_SHORT).show(); this.finish();}}感兴趣的朋友可以下载本实例的完整代码加以调试运行,相信会对大家的Android程序设计有很大的帮助。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
随着智能电视的普及,在电视上玩游戏也变得新潮起来了,针对玩家对于模拟器游戏的需求,小鸡模拟器推出了TV版,目前支持街机(FBA\MAME)FC\SFC\MD几个
大家都知道,android游戏有很多是很好玩的,那大家知道怎么在电脑上玩android游戏吗?其实只要安装一个安卓模拟器就可以了。可是又有很多网友反映安卓模拟器
数字电视和模拟电视的区别: 1、性质不同:模拟电视的原理主要是把模拟的数字信号转化为图像。数字电视是从节目采集、节目制作、节目传输一直到用户端都以数字方式处理
让我们一起学习一下模拟器的使用。本文内容如下:模拟器和真机的比较创建Android模拟器(emulator)运行Android模拟器设置简体中文语言界面模拟手机
模拟电视和数字电视的意思分别是: 模拟电视是把模拟的数字信号转化为图像,每一个像素都对应一个点,说白了就是用一个点阵显示图像。图象信号的产生、传输、处理到接收