本文来自/ ,引用必须注明出处!
智能电视终端(智能电视和智能电视盒子)越来越火,过去主打视频功能,预计今年的智能电视终端不仅继续完善视频功能,还会加入电视游戏功能,同时这也赶上了“电视游戏机解禁”的时机。
大部分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().exec("su");os = new OutputStream());} 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("exitn");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"+"rn";}return result;}
}
调用RootCommand的代码如下,input命令的使用格式详见代码:
public void onCreate(Bundle savedInstanceState) {Create(savedInstanceState);setContentView(R.layout.activity_main);rootCommand.init();//模拟按下Home键btnTestKey = (Button) this.findViewById(R.id.btnTestKey);btnTestKey.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {//命令格式:input keyevent keycoderootCommand.run("/system/bin/input keyevent "+KeyEvent.KEYCODE_HOME);}});//模拟滑动触摸屏btnTestSwipe= (Button) this.findViewById(R.id.btnTestSwipe);btnTestSwipe.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {int x2 = Window().getDecorView().getWidth() - 10;//先去到桌面rootCommand.run("/system/bin/input keyevent "+KeyEvent.KEYCODE_HOME);//滑动桌面,命令格式:input swipe x1 y1 x2 y2for(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(){@Overridepublic void onClick(View v) {int[] location = new int[2];LocationOnScreen(location);int x = location[0]Width()/2;int y = location[1]Height()/2;//模拟点击btnTestTaprootCommand.run("/system/bin/input tap "+x+" "+y);}});//退出程序btnExit = (Button) this.findViewById(R.id.btnExit);btnExit.setOnClickListener( new OnClickListener(){@Overridepublic void onClick(View v) {lease();MainActivity.this.finish();}});//判断是否root过,没root过不可用if(RootTools.isRootAvailable()==false){Toast.makeText(this, "本程序需要使用ROOT权限。", Toast.LENGTH_SHORT).show();this.finish();}}
本文发布于:2024-01-30 21:51:19,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170662268023073.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |