Android提高之手游转电视游戏的模拟操控
2023-06-13 09:15:41 时间
目前智能电视终端(智能电视和智能电视盒子)已经越来越火,过去主打视频功能,如今的智能电视终端不仅会继续完善视频功能,还会加入电视游戏功能,同时这也赶上了“电视游戏机解禁”的时机。
当今的大部分Android手游都能够在Android系统的电视终端上运行,其中有少数手游是原生支持手柄(例如MOGA手柄),这部分游戏可以作为电视游戏。但其他手游(射击,赛车,动作等游戏)若要在电视上玩,就需要修改操控模式,把触摸屏操控改为手柄实体键操控。
程序运行结果如下图所示:
本文核心RootCommand.java的代码如下,不建议把代码浓缩成全局静态方法,这里保持process和os这2个变量的生命周期直到app结束,可以减去多次初始化/释放的耗时。具体代码如下:
packagecom.hellogv.slinput; importjava.io.DataOutputStream; importjava.io.IOException; importandroid.util.Log; /** *调用su执行input命令 *全局只调用一次init()和exit(),多次调用run()。 *@authorhellogv * */ publicclassRootCommand{ privateStringTAG="RootCommand"; privateProcessprocess=null; privateDataOutputStreamos=null; publicvoidinit(){ try{ process=Runtime.getRuntime().exec("su"); os=newDataOutputStream(process.getOutputStream()); }catch(IOExceptione){ Log.e(TAG,getExceptionMessage(e)); } } /** *模仿shell来执行命令,必须先root再使用 * *@paramcommand *@return */ publicbooleanrun(Stringcommand){ try{ os.writeBytes(command+"\n"); os.flush(); }catch(Exceptione){ Log.e(TAG,getExceptionMessage(e)); returnfalse; } returntrue; } /** *模仿shell来执行命令,必须先root再使用 * *@paramcommand *@return */ publicvoidrelease(){ try{ os.writeBytes("exit\n"); os.flush(); process.waitFor(); }catch(Exceptione){ Log.e(TAG,getExceptionMessage(e)); }finally{ try{ if(os!=null){ os.close(); } process.destroy(); }catch(Exceptione){ } } } privatestaticStringgetExceptionMessage(Exceptionex){ Stringresult=""; StackTraceElement[]stes=ex.getStackTrace(); for(inti=0;i<stes.length;i++){ result=result+stes[i].getClassName() +"."+stes[i].getMethodName() +""+stes[i].getLineNumber()+"line" +"\r\n"; } returnresult; } }
调用RootCommand的代码如下,input命令的使用格式详见代码:
publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); rootCommand.init(); //模拟按下Home键 btnTestKey=(Button)this.findViewById(R.id.btnTestKey); btnTestKey.setOnClickListener(newOnClickListener(){ @Override publicvoidonClick(Viewv){ //命令格式:inputkeyeventkeycode rootCommand.run("/system/bin/inputkeyevent"+KeyEvent.KEYCODE_HOME); } }); //模拟滑动触摸屏 btnTestSwipe=(Button)this.findViewById(R.id.btnTestSwipe); btnTestSwipe.setOnClickListener(newOnClickListener(){ @Override publicvoidonClick(Viewv){ intx2=MainActivity.this.getWindow().getDecorView().getWidth()-10; //先去到桌面 rootCommand.run("/system/bin/inputkeyevent"+KeyEvent.KEYCODE_HOME); //滑动桌面,命令格式:inputswipex1y1x2y2 for(inti=0;i<4;i++){ rootCommand.run("/system/bin/inputswipe10300"+x2+"400"); rootCommand.run("/system/bin/inputswipe"+x2+"30010400"); } } }); //模拟点击触摸屏 btnTestTap=(Button)this.findViewById(R.id.btnTestTap); btnTestTap.setOnClickListener(newOnClickListener(){ @Override publicvoidonClick(Viewv){ int[]location=newint[2]; btnTestSwipe.getLocationOnScreen(location); intx=location[0]+btnTestSwipe.getWidth()/2; inty=location[1]+btnTestSwipe.getHeight()/2; //模拟点击btnTestTap rootCommand.run("/system/bin/inputtap"+x+""+y); } }); //退出程序 btnExit=(Button)this.findViewById(R.id.btnExit); btnExit.setOnClickListener(newOnClickListener(){ @Override publicvoidonClick(Viewv){ rootCommand.release(); MainActivity.this.finish(); } }); //判断是否root过,没root过不可用 if(RootTools.isRootAvailable()==false){ Toast.makeText(this,"本程序需要使用ROOT权限。",Toast.LENGTH_SHORT).show(); this.finish(); } }
感兴趣的朋友可以下载本实例的完整代码加以调试运行,相信会对大家的Android程序设计有很大的帮助。
相关文章
- android onresume方法,非静态方法’onResume’Android Studio
- android中的加密算法,Android中加密算法[通俗易懂]
- android 常用加密,分享一下Android各种类型的加密
- android 7 uc flash,UC浏览器7.2版新增加FLASH游戏支持功能[通俗易懂]
- android app 退出功能,Android 完美退出 App (Exit)
- Android触摸事件_android设置按钮点击事件
- Android 编译_android线程
- Android n_android 反编译
- Android修改字体_android设置字体样式
- android线程间通信的几种方法_Android进程间和线程间通信方式
- android 系统浏览器 源码-Android 最最最简单的浏览器代码
- Android手机监控小程序
- 【Android 逆向】Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )
- 【Android 逆向】逆向修改游戏应用 ( 分析应用结构 | 定位动态库位置 | 定位动态库中的修改点 | 修改动态库 | 重打包 )
- 【Android Gradle 插件】LintOptions 配置 ① ( BaseExtension#lintOptions 配置 | LintOptions 配置简介 | lint 工具 )
- 【错误记录】Android 应用安全检测漏洞修复 ( StrandHogg 漏洞 | 设置 Activity 组件 android:taskAffinity=““ )
- 【错误记录】Android Studio 编译报错 ( The minCompileSdk (33) specified in a dependency‘s AAR metadata META-I )
- Android控制文字水平间距android:letterSpacing详解手机开发
- [android] 线性布局和布局的组合详解手机开发
- android PakageManagerService启动流程分析详解手机开发
- Android中android:visibility的3中属性的剖析详解手机开发
- Google为了拉拢iPhone用户:“转移到Android”支持从iOS转移数据
- 安卓编年史(14):Android 2.3 Gingerbread——第一次 UI 大变
- Connecting Android to Oracle: The Ultimate Guide for Seamless Integration.(android连接oracle)
- Android网络图片查看显示的实现方法
- 解析Android游戏中获取电话状态进行游戏暂停或继续的解决方法
- js和html5实现手机端刮刮卡抽奖效果完美兼容android/IOS
- Android游戏源码分享之2048
- Android获取手机号码和运营商信息的方法