@Override
    public void simpleInitApp() {

        // useAbsolute = true;
        // enableRumble = true;

        if (enableFlyByCameraRotation) {
            flyCam.setEnabled(true);
        } else {
            flyCam.setEnabled(false);
        }

        Mesh lineX = new Line(Vector3f.ZERO, Vector3f.ZERO.add(Vector3f.UNIT_X.mult(3)));
        Mesh lineY = new Line(Vector3f.ZERO, Vector3f.ZERO.add(Vector3f.UNIT_Y.mult(3)));
        Mesh lineZ = new Line(Vector3f.ZERO, Vector3f.ZERO.add(Vector3f.UNIT_Z.mult(3)));

        Geometry geoX = new Geometry("X", lineX);
        Material matX = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
        matX.setColor("Color", ColorRGBA.Red);
        matX.getAdditionalRenderState().setLineWidth(30);
        geoX.setMaterial(matX);
        rootNode.attachChild(geoX);

        Geometry geoY = new Geometry("Y", lineY);
        Material matY = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
        matY.setColor("Color", ColorRGBA.Green);
        matY.getAdditionalRenderState().setLineWidth(30);
        geoY.setMaterial(matY);
        rootNode.attachChild(geoY);

        Geometry geoZ = new Geometry("Z", lineZ);
        Material matZ = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
        matZ.setColor("Color", ColorRGBA.Blue);
        matZ.getAdditionalRenderState().setLineWidth(30);
        geoZ.setMaterial(matZ);
        rootNode.attachChild(geoZ);

        Box b = new Box(1, 1, 1);
        geomZero = new Geometry("Box", b);
        Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
        mat.setColor("Color", ColorRGBA.Yellow);
        Texture tex_ml = assetManager.loadTexture("Interface/Logo/Monkey.jpg");
        mat.setTexture("ColorMap", tex_ml);
        geomZero.setMaterial(mat);
        geomZero.setLocalTranslation(Vector3f.ZERO);
        geomZero.setLocalRotation(Quaternion.IDENTITY);
        rootNode.attachChild(geomZero);


        // Touch (aka MouseInput.BUTTON_LEFT) is used to record the starting
        // orientation when using absolute rotations
        inputManager.addMapping("MouseClick", new MouseButtonTrigger(MouseInput.BUTTON_LEFT));
        inputManager.addListener(this, "MouseClick");

        Joystick[] joysticks = inputManager.getJoysticks();
        if (joysticks == null || joysticks.length < 1) {
            logger.log(Level.INFO, "Cannot find any joysticks!");
        } else {

            // Joysticks return a value of 0 to 1 based on how far the stick is
            // push on the axis. This value is then scaled based on how long
            // during the frame the joystick axis has been in that position.
            // If the joystick is push all the way for the whole frame,
            // then the value in onAnalog is equal to tpf.
            // If the joystick is push 1/2 way for the entire frame, then the
            // onAnalog value is 1/2 tpf.
            // Similarly, if the joystick is pushed to the maximum during a frame
            // the value in onAnalog will also be scaled.
            // For Android sensors, rotating the device 90deg is the same as
            // pushing an actual joystick axis to the maximum.

            logger.log(Level.INFO, "Number of joysticks: {0}", joysticks.length);
            JoystickAxis axis;

            for (Joystick joystick : joysticks) {
                // Get and display all axes in joystick.
                List<JoystickAxis> axes = joystick.getAxes();
                for (JoystickAxis joystickAxis : axes) {
                    logger.log(Level.INFO, "{0} axis scan Name: {1}, LogicalId: {2}, AxisId: {3}",
                        new Object[]{joystick.getName(), joystickAxis.getName(), joystickAxis.getLogicalId(), joystickAxis.getAxisId()});
                }

                // Get specific axis based on LogicalId of the JoystickAxis
                // If found, map axis
                axis = joystick.getAxis(SensorJoystickAxis.ORIENTATION_X);
                if (axis != null) {
                    axis.assignAxis(ORIENTATION_X_PLUS, ORIENTATION_X_MINUS);
                    inputManager.addListener(this, ORIENTATION_X_PLUS, ORIENTATION_X_MINUS);
                    logger.log(Level.INFO, "Found {0} Joystick, assigning mapping for X axis: {1}, with max value: {2}",
                            new Object[]{joystick.toString(), axis.toString(), ((SensorJoystickAxis) axis).getMaxRawValue()});
                }

                axis = joystick.getAxis(SensorJoystickAxis.ORIENTATION_Y);
                if (axis != null) {
                    axis.assignAxis(ORIENTATION_Y_PLUS, ORIENTATION_Y_MINUS);
                    inputManager.addListener(this, ORIENTATION_Y_PLUS, ORIENTATION_Y_MINUS);
                    logger.log(Level.INFO, "Found {0} Joystick, assigning mapping for Y axis: {1}, with max value: {2}",
                            new Object[]{joystick.toString(), axis.toString(), ((SensorJoystickAxis) axis).getMaxRawValue()});
                }

                axis = joystick.getAxis(SensorJoystickAxis.ORIENTATION_Z);
                if (axis != null) {
                    axis.assignAxis(ORIENTATION_Z_PLUS, ORIENTATION_Z_MINUS);
                    inputManager.addListener(this, ORIENTATION_Z_PLUS, ORIENTATION_Z_MINUS);
                    logger.log(Level.INFO, "Found {0} Joystick, assigning mapping for Z axis: {1}, with max value: {2}",
                            new Object[]{joystick.toString(), axis.toString(), ((SensorJoystickAxis) axis).getMaxRawValue()});
                }

                joystickMap.put(joystick.getJoyId(), joystick);

            }
        }
    }
Example Test Case to test using Android sensors as Joystick axes.  Make sure to enable Joystick Events from
the test chooser menus.  Rotating the device will cause the block to rotate.  Tapping the screen will cause the
sensors to be calibrated (reset to zero) at the current orientation.  Continuously tapping the screen causes
the "rumble" to intensify until it reaches the maximum amount and then it shuts off.

@author iwgeric
jme3-android-examples/src/main/java/jme3test/android/TestAndroidSensors.java