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

(0)

相关推荐

  • Android Handler之消息循环的深入解析

    Handler是用于操作线程内部的消息队列的类.这有点绕,没关系,我们慢慢的来讲.前面Looper一篇讲到了Looper是用于给线程创建消息队列用的,也就是说Looper可以让消息队列(MessageQueue)附属在线程之内,并让消息队列循环起来,接收并处理消息.但,我们并不直接的操作消息队列,而是用Handler来操作消息队列,给消息队列发送消息,和从消息队列中取出消息并处理.这就是Handler的职责.Handler,Looper和MessageQueue是属于一个线程内部的数据,但是它提

  • Unity3D游戏引擎实现在Android中打开WebView的实例

    本文讲述了如何在Unity中调用Android中的WebView组件,实现内部浏览器样式的页面切换.首先打开Eclipse创建一个Android的工程: UnityTestActivity.java 入口Activity ,Unity中会调用这个Activity中的方法从而打开网页. package com.xys; import android.content.Context; import android.content.Intent; import android.os.Bundle; i

  • Android游戏开发实践之人物移动地图的平滑滚动处理

    如图所示为程序效果动画图 地图滚动的原理 在本人之前博客的文章中介绍过人物在屏幕中的移动方式,因为之前拼的游戏地图是完全填充整个手机屏幕的,所以无需处理地图的平滑滚动.这篇文章我着重的向 大家介绍一下控制人物移动后地图滚动的处理方式.举个例子 如上图所示 比如人物向右移动,如果地图贴在屏幕左边边界 将先移动人物在地图的坐标,当人物在屏幕中超过三分之二后 则将地图向人物行走的反方向移动给玩家一种人物还在向右移动的假象,其实这时候人物只是播放向右行走的动画 在屏幕中的坐标不变 ,当地图向人物行走反方

  • 解析Android游戏中获取电话状态进行游戏暂停或继续的解决方法

    对智能手机有所了解的朋友都知道其中一个应用广泛的手机操作系统Android 开源手机操作系统.那么在这一系统中想要实现通话的监听功能的话,我们应当如何操作呢?在这里就为大家详细介绍了Android监听通话的相关实现方法. 开发应用程序的时候,我们希望能够监听电话的呼入,以便执行暂停音乐播放器等操作,当电话结束之后,再次恢复播放.在Android平台可以通过TelephonyManager和PhoneStateListener来完成此任务.TelephonyManager作为一个Service接口

  • android游戏载入的activity跳转到游戏主菜单的activity具体实现

    复制代码 代码如下: public class LoadActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE);// 去掉标题栏 getWindow().setFlags(WindowManager.Layou

  • Android 游戏开发之Canvas画布的介绍及方法

    Canvas,在英语中,这个单词的意思是帆布.在Android中,则把Canvas当做画布,只要我们借助设置好的画笔(Paint类)就可以在画布上绘制我们想要的任何东西:另外它也是显示位图(Bitmap类)的核心类.随用户的喜好,Canvas还可设置一些关于画布的属性,比如,画布的颜色.尺寸等.Canvas提供了如下一些方法:    Canvas(): 创建一个空的画布,可以使用setBitmap()方法来设置绘制具体的画布.    Canvas(Bitmap bitmap): 以bitmap对

  • Android实现完整游戏循环的方法

    本文实例讲述了Android实现完整游戏循环的方法.分享给大家供大家参考.具体如下: 1. DroidzActivity.java: package net.obviam.droidz; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.Window; import android.view.WindowManager; public class

  • Android基本游戏循环实例分析

    本文实例讲述了Android基本游戏循环.分享给大家供大家参考.具体如下: // desired fps private final static int MAX_FPS = 50; // maximum number of frames to be skipped private final static int MAX_FRAME_SKIPS = 5; // the frame period private final static int FRAME_PERIOD = 1000 / MAX

  • Android 游戏引擎libgdx 资源加载进度百分比显示案例分析

    因为案例比较简单,所以简单用AndroidApplication -> Game -> Stage 搭建框架 一.主入口,无特殊 复制代码 代码如下: public class App extends AndroidApplication { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //初始化Demo initialize(new Demo()

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

    目前智能电视终端(智能电视和智能电视盒子)已经越来越火,过去主打视频功能,如今的智能电视终端不仅会继续完善视频功能,还会加入电视游戏功能,同时这也赶上了"电视游戏机解禁"的时机. 当今的大部分Android手游都能够在Android系统的电视终端上运行,其中有少数手游是原生支持手柄(例如MOGA手柄),这部分游戏可以作为电视游戏.但其他手游(射击,赛车,动作等游戏)若要在电视上玩,就需要修改操控模式,把触摸屏操控改为手柄实体键操控. 本文主要讲解的是如何使用/system/bin/之下

  • Android编程实现手绘及保存为图片的方法(附demo源码下载)

    本文实例讲述了Android编程实现手绘及保存为图片的方法.分享给大家供大家参考,具体如下: 运行效果图预览: 应 yzuo_08 要求做了此Demo,跟以前那个手写板Demo不同的是可以将画布的内容保存为图片. 附上关键代码: MainView.java package com.tszy.views; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; impor

  • JQuery手速测试小游戏实现思路详解

    (-1)写在前面 我用的chrome49,jquery3.0,我得到过399分,信不信由你. (1)设计思路 两个p元素放在div里,每个p元素的高度和宽度都和div一样,当鼠标放在div上时,第一个p向上移动(更改marginTop值),当鼠标离开div上时,第一个p向下移动. (2)知识储备 a. :nth-child #lol p:nth-child(1),当前元素p相对于他的父元素的所有子元素,如果第一个元素是p则匹配成功. #lol :nth-child(1) 相当于#lol *:nt

  • Android提高Service优先级的方法分析

    本文实例讲述了Android提高Service优先级的方法.分享给大家供大家参考,具体如下: Android 系统对于内存管理有自己的一套方法,为了保障系统有序稳定的运信,系统内部会自动分配,控制程序的内存使用.当系统觉得当前的资源非常有限的时候,为了保 证一些优先级高的程序能运行,就会杀掉一些他认为不重要的程序或者服务来释放内存.这样就能保证真正对用户有用的程序仍然再运行.如果你的 Service 碰上了这种情况,多半会先被杀掉.但如果你增加 Service 的优先级就能让他多留一会,我们可以

  • Android 自定义View手写签名并保存图片功能

    GIF压缩有问题,运行很顺滑!!! 1.自定义View--支持设置画笔颜色,画笔宽度,画板颜色,清除画板,检查是否有签名,保存画板图片(复制粘贴可直接使用) /** * Created by YyyyQ on 2020/3/5. * 电子签名 */ public class SignatureView extends View { private Context context; //X轴起点 private float x; //Y轴起点 private float y; //画笔 priva

  • unity实现手游虚拟摇杆

    本文实例为大家分享了unity实现手游虚拟摇杆的具体代码,供大家参考,具体内容如下 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; /// <summary> /// 绑定到摇杆上的摇杆类,参考半径50 /// </summary> public class Rocker : MonoBehaviour { Vector2 m_o

  • Android Studio做超好玩的拼图游戏 附送详细注释源码

    目录 一.项目概述 二.开发环境 三.需求分析 四.实现过程 1.拼图游戏布局绘制 2.拼图游戏时间计时 3.拼图游戏打乱显示 4.拼图游戏碎片位置切换 5.拼图游戏成功的条件 6.拼图游戏重新开始 五.运行效果 六.项目总结 七.项目源码 一.项目概述 之前有不少粉丝私信我说,能不能用Android原生的语言开发一款在手机上运行的游戏呢? 说实话,使用java语言直接开发游戏这个需求有点难,因为一些比较复杂的游戏都是通过cocos2D或者Unity3D等游戏引擎开发出来的,然后再移植到Andr

  • 详解Flutter手游操纵杆移动的原理与实现

    目录 前言 基本思路 绘制 静态效果 添加手势交互 GestureDetector 总结 前言 上一篇介绍了手势在画布上的应用,那么手势与绘制画布究竟能摩擦出怎样的火花呢,本篇文章将为你详解手游中操纵杆移动角色的的原理与实现过程. 基本思路 确定操纵杆区域,确定点击时手势响应区域,当手指滑动操纵杆时,计算出当前的手指位置与当前操纵杆圆心偏移弧度,从而确定当前角色的移动方向.接下来就一步一步实现吧. 绘制 绘制操纵杆的静态图形,玩过手游应该知道操纵杆基本构成由底部圆和手指移动圆球组成,手指移动的圆

  • Hook实现Android 微信、陌陌 、探探位置模拟(附源码下载)

    Hook实现Android 微信.陌陌 .探探位置模拟 最近需要对微信,陌陌等程序进行位置模拟 实现世界各地发朋友圈,搜索附近人的功能,本着站在巨人肩膀上的原则 爱网上搜索一番. 也找到一些 代码和文章,但是代码大都雷同而且都有一个弊端 比如说 微信 对目标函数实现hook之后第一次打开微信 第一次定位是可以改变的 但是 我如果想更换地址的话 就需要重启手机了,重新加载hook了,试了很多次都是这样满足不了需求. 为了改进这个地方我们从gps定义的源代码流程开始看寻找hook系统函数的突破口 我

  • 如何在Python 游戏中模拟引力

    学习如何使用 Python 的 Pygame 模块编程电脑游戏,并开始操作引力. 真实的世界充满了运动和生活.物理学使得真实的生活如此忙碌和动态.物理学是物质在空间中运动的方式.既然一个电脑游戏世界没有物质,它也就没有物理学规律,使用游戏程序员不得不模拟物理学. 从大多数电脑游戏来说,这里基本上仅有两个方面的物理学是重要的:引力和碰撞. 当你添加一个敌人到你的游戏中时,你实现了一些碰撞检测,但是这篇文章要添加更多的东西,因为引力需要碰撞检测.想想为什么引力可能涉及碰撞.如果你不能想到任何原因,不

随机推荐