Android提高之手游转电视游戏的模拟操控

 更新时间:2014年08月09日 15:19:51   投稿:shichen2014  
这篇文章主要介绍了Android手游转电视游戏的模拟操控方法,是非常具有实用价值的功能,需要的朋友可以参考下

目前智能电视终端(智能电视和智能电视盒子)已经越来越火,过去主打视频功能,如今的智能电视终端不仅会继续完善视频功能,还会加入电视游戏功能,同时这也赶上了“电视游戏机解禁”的时机。

当今的大部分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程序设计有很大的帮助。

相关文章

  • Android编程中图片特效处理方法小结

    Android编程中图片特效处理方法小结

    这篇文章主要介绍了Android编程中图片特效处理方法,实例总结了Android实现图片的转换、缩放、圆角及倒影等效果的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10
  • Android串口通信封装之OkUSB的示例代码

    Android串口通信封装之OkUSB的示例代码

    本篇文章主要介绍了Android串口通信封装之OkUSB的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • Flutter软键盘的原理浅析

    Flutter软键盘的原理浅析

    大家应该都知道目前Flutter官方是没有自定义键盘的解决方案,下面这篇文章主要给大家介绍了关于Flutter软键盘原理的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-10-10
  • android sdk安装及开发环境部署

    android sdk安装及开发环境部署

    本文给大家详细讲解了android sdk安装方法以及android开发环境部署方法,非常的细致全面,有需要的小伙伴务必详细研究下。
    2015-11-11
  • 获取Android系统唯一识别码的方法

    获取Android系统唯一识别码的方法

    这篇文章主要介绍了获取Android系统唯一识别码的方法,涉及通过编程获取Android系统硬件设备标识的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10
  • Android实现局部图片滑动指引效果示例

    Android实现局部图片滑动指引效果示例

    现在滑动效果用的比较多,尤其是在手机端上面,本文介绍了Android实现局部图片滑动指引效果示例,现在就分享给大家,也给大家做个参考。
    2016-10-10
  • MobLink Android端业务场景简单说明

    MobLink Android端业务场景简单说明

    这篇文章主要介绍了MobLink Android端业务场景简单说明,MobLink的功能实现就是在分享前会将链接的参数信息保存到服务器,更多相关内容需要的朋友可以参考一下
    2022-09-09
  • OpenGL Shader实现简单转场效果详解

    OpenGL Shader实现简单转场效果详解

    转场效果常出现再视频剪辑当中,用于衔接两段视频片段切换的过渡效果。本文将介绍如何利用OpenGL Shader实现简单的转场效果,需要的小伙伴可以参考一下
    2022-02-02
  • Android中查看USB连接的外接设备信息的代码实例

    Android中查看USB连接的外接设备信息的代码实例

    这篇文章主要介绍了Android中查看USB连接的外接设备信息的代码实例,需要的朋友可以参考下
    2014-04-04
  • Android编程实现读取本地SD卡图片的方法

    Android编程实现读取本地SD卡图片的方法

    这篇文章主要介绍了Android编程实现读取本地SD卡图片的方法,涉及Android针对文件读取及判定操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11

最新评论