如何为安卓系统构建一个传感器模拟器?

11

我正在为Android平台构建一个应用程序,希望使用加速度计。现在,我找到了一个非常好的传感器模拟应用程序(OpenIntents' SensorSimulator),但是对于我的需求,我想创建自己的传感器模拟应用程序。

我没有找到如何做到这一点的信息(我不知道是否正确地反汇编了模拟器的jar文件),并且正如我所说,我想构建一个更小、更简单的传感器模拟器版本,更适合我的意图。

您知道我可以从哪里开始吗?我在哪里可以看到需要构建的代码片段?

基本上,我只是寻求一些指导。

1个回答

8

你想制作一个应用程序,在模拟器上测试时,它将模拟Android设备上的传感器。
很可能在你的应用程序中,有这样一行代码:

SensorManager mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);

为什么不创建一个具有您从SensorManager使用的方法的接口:
interface MySensorManager {
    List<Sensor> getSensorList(int type);

    ... // You will need to add all the methods you use from SensorManager here
}

然后创建一个SensorManager的包装器,它只是在真实的SensorManager对象上调用那些方法:
class MySensorManagerWrapper implements MySensorManager {
    SensorManager mSensorManager;

    MySensorManagerWrapper(SensorManager sensorManager) {
        super();
        mSensorManager = sensorManager;
    }

    List<Sensor> getSensorList(int type) {
         return mSensorManager.getSensorList(type_;
    }

    ... // All the methods you have in your MySensorManager interface will need to be defined here - just call the mSensorManager object like in getSensorList()
}

然后创建另一个MySensorManager,这次通过套接字与您将创建的桌面应用程序通信,在其中输入传感器值或其他内容:

class MyFakeSensorManager implements MySensorManager {
    Socket mSocket;

    MyFakeSensorManager() throws UnknownHostException, IOException {
        super();
        // Connect to the desktop over a socket
        mSocket =  = new Socket("(IP address of your local machine - localhost won't work, that points to localhost of the emulator)", SOME_PORT_NUMBER);
    }

    List<Sensor> getSensorList(int type) {
        // Use the socket you created earlier to communicate to a desktop app
    }

    ... // Again, add all the methods from MySensorManager
}

最后,将你的第一行替换为:

SensorManager mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);

换行:

MySensorManager mSensorManager;
if(YOU_WANT_TO_EMULATE_THE_SENSOR_VALUES) {
    mSensorManager = new MyFakeSensorManager();
else {
    mSensorManager = new MySensorManagerWrapper((SensorManager)getSystemService(SENSOR_SERVICE));
}

现在,您可以直接使用该对象而不是之前使用的SensorManager。

1
嗨,艾萨克!谢谢你的回答。那差不多就是我想要构建的东西,我会尝试一下并让大家知道它的结果。=) - Hugo
你好,你有没有实现这个解决方案?我最近尝试了一下,但遇到了问题。我需要创建新的SensorEvent对象,但由于它们在SensorEvent类中是final的,所以无法设置值。当我尝试通过反射来解决这个问题时,出现了SensorEvent的ClassNotFound错误,如果我没记错的话... - andreas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接