【问题标题】:How to Build a Sensor Simulator for Android?如何为 Android 构建传感器模拟器?
【发布时间】:2010-11-06 18:53:07
【问题描述】:

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

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

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

基本上,我所有的要求只是为了一些方向。

【问题讨论】:

    标签: android simulation sensors


    【解决方案1】:

    好吧,您似乎想要制作一个应用程序,该应用程序将在模拟器上进行测试时为您的应用程序模拟 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。

    【讨论】:

    • 嗨艾萨克!感谢您的回答。这或多或少是我想要构建的,我会试一试,让大家知道结果如何。 =)
    • 嗨,你有没有实施过这个解决方案?我最近尝试过并遇到了问题,我必须创建新的 SensorEvent 对象,但我无法设置这些值,因为它们在 SensorEvent 类中是最终的。当我尝试通过反射设置它来解决这个问题时,我在 SensorEvent 上遇到了 ClassNotFound 错误,如果我没记错的话......
    猜你喜欢
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 2012-01-30
    相关资源
    最近更新 更多