标签: android-sensors

199
推荐指数
10
解决办法
23万
查看次数

Google Fit应用程序如何在不耗尽电量的情况下始终测量步数?

谷歌飞度的应用程序,在安装时,测量你在走路或跑步的时间,也步数所有的时间.然而,奇怪的是,使用它似乎并没有耗尽电池.其他应用程序,如Moves,似乎可以非常准确地记录步数,因为它不断监控GPS和加速度计,因此它会消耗大量功率.

我想象几种可能性:

  • 每分钟左右唤醒手机,然后分析传感器几秒钟,然后再次睡觉.然而,似乎记录非常精确,所以醒来必须经常.
  • 实际上一直打开加速度计,只有在加速度计测量数据缓冲区满后才进行分析.但是我认为加速度计有一个小缓冲区来存储最新的测量值.
  • 使用GPS 估算步数而不是实际计算步数.然而,情况并非如此,因为它甚至可以在室内使用.

该应用程序仍然感觉神奇.一直计数步骤而没有可察觉的电池消耗.

gps android accelerometer android-sensors google-fit

43
推荐指数
3
解决办法
7万
查看次数

在片段中调用时,getSystemServices是否未定义?

我想TextViews在a中显示传感器读数Fragment.当试图初始化SensorManagergetSystemServices在未定义Fragment,日食says.Why以及如何解决它.

分段

public class FragSensors extends Fragment {

private TextView accXTv, accYTv, accZTv;
private SensorManager sensorManager;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    View v = inflater.inflate(R.layout.frag_sensors, container, false);
    accXTv = (TextView) v.findViewById(R.id.accXValue);
    accYTv = (TextView) v.findViewById(R.id.accYValue);
    accZTv = (TextView) v.findViewById(R.id.accZValue);
    return v;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onActivityCreated(savedInstanceState);
    sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

}

private …
Run Code Online (Sandbox Code Playgroud)

android android-fragments android-sensors

40
推荐指数
3
解决办法
5万
查看次数

Android 4.3:BLE:startLeScan()的过滤行为

我正在开发一种蓝牙传感器设备,我需要对其进行一对多的数据广播.根据规范,外设可能只有一个主机,由于我正在设计的芯片和堆栈的限制,主机只能有三个从机.据我所知,Android无论如何都不能成为BLE奴隶,因此将我的设备作为主人不是一种选择.

BT4规范和制造商文档都讨论了另一种操作模式,称为广播模式.在广播模式中,从不进行连接,并且应用数据作为广告包的一部分被发送.这完全符合我的需求,因为许多Android/iOS手机可以同时扫描每个数据包.广告数据包以突发方式多次传输,因此我怀疑数据接收最可靠.如果数据包在此处丢失,则可以容忍.

这有趣的是,我希望这些数据包携带实时传感器数据,以10-20Hz的速率更新.从我在网上找到的例子来看,这种模式下的BLE主要用于"iBeacon"类型的实现,它们在那里广播静态数据.我找不到有关如何在Android堆栈中过滤广告数据包的任何信息.它可能是每个蓝牙硬件地址返回一个结果,或者它可能是地址和数据的唯一组合.第二个选项适用于此应用程序.如果启动和停止扫描重置过滤器,我也可以做一些工作.

Android文档没有提及扫描方法中的设备过滤如何工作.我已经能够在网上找到一个试图解决同样问题的帖子,它有一个未解决的响应:BLE:在扫描期间多次发现相同的外设.在iOS中,我的同事通知我,有一个参数可以传递给扫描功能,使其成为可能.

我试图从Android源代码中的startLeScan()调用回溯代码,但是代码非常复杂,并且使用抽象使得很难识别包含它的对象的实现.我得到的最远的是从BluetoothManagerService类方法getBluetoothGatt()返回的IBluetoothGatt对象.该对象接收开始扫描的请求.它正在当前版本的github上的BluetoothManagerService.java的第790行进行实例化.该对象是从消息的结果转换而来的,所以我怀疑结果可能是电话/驱动程序特定的.能够进一步追踪它是我的专长.

我想解决的另一个问题是如何快速打开和关闭扫描.扫描是一项功耗密集型操作,但数据广播将在相当精确的实时计时器上定期进行.因此,如果可以打开和关闭扫描,这将是一个很好的优化,使得广播和扫描同步,扫描仪关闭其他90%以上的时间.这可能需要通过实验进行测试.

我还在进行可行性研究,看看我们的Android配件是否可行.我现在的手机还没有运行4.3版,所以我无法通过实验测试/黑客攻击.

android android-sensors bluetooth-lowenergy android-bluetooth

27
推荐指数
5
解决办法
2万
查看次数

Android中"重力"和"加速度"传感器有什么区别?

Android中的重力和加速度传感器有什么区别?从我的观点来看,两种情况下的物理价值都是相同的.

哪一个测量作用于设备内部单位质量的力?

加成

问题是:这些传感器测量的物理量是多少?根据等效原理,加速度和重力是无法区分的,测量两者的唯一方法是通常(但是3d)弹簧平衡.

android accelerometer gravity android-sensors

22
推荐指数
1
解决办法
5万
查看次数

Android中的旋转矢量传感器和方向传感器之间的概念差异是什么?

Android提供旋转矢量传感器和方向传感器.我知道它们会返回不同的数据,因为对于矢量传感器,我们有角度,在方向传感器中我们有角度.但是概念上的区别是什么?我从文档中无法理解.哪一个提供了三维空间中设备的方向?我糊涂了!

android android-sensors android-orientation

22
推荐指数
2
解决办法
2万
查看次数

Android Compass可以补偿Tilt和Pitch

我正在尝试在我的Android手机(Nexus 4)上制作应用程序,该手机将用于模型船.我添加了低通滤波器来滤除传感器的gitter.

但是,当手机背面平放时,指南针才稳定.如果我把它向上倾斜,(例如转动一个嘘声的页面),那么指南针标题就会消失 - 多达50*.

我已经使用Sensor.TYPE_GRAVITY和Sensor.TYPE_ACCELEROMETER对Sensor.TYPE_MAGNETIC_FIELD进行了尝试,效果相同.

我已经使用了这里提到的解决方案以及许多其他地方.我的数学并不好,但这必定是一个常见的问题,我发现没有一个API可以解决这个问题令人沮丧.

我已经在这个问题上工作了3天并且仍然没有找到任何解决方案,但是当我使用CatchCompass时,无论手机倾斜多少,它们都能保持稳定.所以我知道这一定是可能的.

我想做的就是创建一个指南针,如果手机指向北方,那么指南针将向北读取,而当手机通过任何其他轴(滚动或俯仰)时,指南针不会跳转.

在我不得不放弃我的项目之前,任何人都可以请求帮助.

谢谢,亚当

android android-sensors

22
推荐指数
2
解决办法
2万
查看次数

如何替换android 4.0.3的type_orientation(已弃用)?

您好我想使用该类型,type_orientation但它已被弃用为android 4.0.3.我用它来增强现实.我试图在网上找到但没有成功.我的申请有效,但我的文字在同一个地方!这是我的代码:

 @Override
    protected void onStart() {      
        super.onStart();
        sensorMngr = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        sensorLstr = createListener();
        sensorMngr.registerListener(sensorLstr, sensorMngr.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_UI);
    }

    @Override
    protected void onStop() {       
        super.onStop();
        sensorMngr = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        sensorMngr.unregisterListener(sensorLstr, sensorMngr.getDefaultSensor(Sensor.TYPE_ORIENTATION));        
    }
Run Code Online (Sandbox Code Playgroud)

这一切都很好,我已经看过http://developer.android.com/reference/android/hardware/Sensor.html,但我不明白(我是法国人,我的英语不是很完美...... ) 非常感谢您的帮助!!!

java eclipse android android-sensors

21
推荐指数
1
解决办法
2万
查看次数

在Android关闭屏幕时,以编程方式关闭屏幕

我的应用程序是拨号器,当用户将手机靠近他的头时,我需要关闭屏幕并防止点击控件 - 就像本机Android拨号器行为一样.我需要什么API级别以及如何以正确的方式执行此操作?

android screen android-sensors sensormanager

21
推荐指数
1
解决办法
2万
查看次数

从rotationMatrix中提取偏航,俯仰和滚动

我有一个传感器管理器,它rotationMatrix根据设备Magnetometer和Accelerometer 返回一个.我一直试图计算用户设备的偏航俯仰和滚动,但我发现俯仰和滚动相互干扰并给出不准确的结果.有没有办法从rotationMatrix?提取设备的YAW PITCH和ROLL ?

编辑 试着解释下面的blender的答案,我感谢但还没到那里,我试图从这样的旋转矩阵中获得角度:

       float R[] = phoneOri.getMatrix();
       double rmYaw = Math.atan2(R[4], R[0]);
       double rmPitch = Math.acos(-R[8]);
       double rmRoll = Math.atan2(R[9], R[10]);
Run Code Online (Sandbox Code Playgroud)

我不知道我是否引用矩阵的错误部分,但我没有得到我想的结果.

我希望得到度数的价值,但我得到奇怪的整数.

我的矩阵来自我的sensorManager看起来像这样:

public void onSensorChanged(SensorEvent evt) {
            int type=evt.sensor.getType();
            if(type == Sensor.TYPE_ORIENTATION){
                yaw = evt.values[0];
                pitch = evt.values[1];
                roll = evt.values[2];
            }
            if (type == Sensor.TYPE_MAGNETIC_FIELD) {
                orientation[0]=(orientation[0]*1+evt.values[0])*0.5f;
                orientation[1]=(orientation[1]*1+evt.values[1])*0.5f;
                orientation[2]=(orientation[2]*1+evt.values[2])*0.5f;
            } else if (type == Sensor.TYPE_ACCELEROMETER) {
                acceleration[0]=(acceleration[0]*2+evt.values[0])*0.33334f;
                acceleration[1]=(acceleration[1]*2+evt.values[1])*0.33334f;
                acceleration[2]=(acceleration[2]*2+evt.values[2])*0.33334f;
            }
            if ((type==Sensor.TYPE_MAGNETIC_FIELD) || (type==Sensor.TYPE_ACCELEROMETER)) {
                float newMat[]=new float[16]; …
Run Code Online (Sandbox Code Playgroud)

android rotational-matrices android-sensors

20
推荐指数
2
解决办法
2万
查看次数