要从不在视图中的应用程序中读取游戏手柄事件,可以使用Android的输入管理器(InputManager)来实现。以下是一个包含代码示例的解决方法:
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.view.InputDevice;
import android.view.InputEvent;
import android.view.InputManager;
public class GamepadService extends Service {
private InputManager mInputManager;
private InputManager.InputDeviceListener mInputDeviceListener;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
// 获取InputManager实例
mInputManager = (InputManager) getSystemService(Context.INPUT_SERVICE);
// 注册InputDeviceListener监听器
mInputDeviceListener = new InputManager.InputDeviceListener() {
@Override
public void onInputDeviceAdded(int deviceId) {
// 检查新添加的设备是否是游戏手柄
InputDevice device = mInputManager.getInputDevice(deviceId);
if (device != null && (device.getSources() & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD) {
// 注册事件监听器
mInputManager.registerInputDeviceListener(this, null);
}
}
@Override
public void onInputDeviceRemoved(int deviceId) {
// 处理设备移除事件
}
@Override
public void onInputDeviceChanged(int deviceId) {
// 处理设备变化事件
}
};
mInputManager.registerInputDeviceListener(mInputDeviceListener, null);
}
@Override
public void onDestroy() {
super.onDestroy();
mInputManager.unregisterInputDeviceListener(mInputDeviceListener);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
}
Intent intent = new Intent(context, GamepadService.class);
context.startService(intent);
通过以上步骤,你就可以在不在视图中的应用程序中读取游戏手柄事件了。你可以在onInputDeviceAdded方法中处理游戏手柄的按键事件和触摸事件。