无线传感器基础:获取手机传感器、加速度

一些实验过程中的疑问:

如何知道设备上有哪些传感器?

如果手机不支持的传感器,程序运行往往不会抛出异常,只是无法获得传感器传回的数据。那么如何知道设备上有哪些传感器可用呢?有两种方式,一种是直接方式,一种是间接方式。直接方式就是遍历获取得到传感器信息集合。间接方式则是通过在AndroidManifest.xml配置文件中,指定该应用程序只支持运行在具有哪些硬件功能的设备上。如果应用程序需要温度传感器,可以在配置文件中添加下面一行代码:

        <uses-feature android:name="android.hardware.sensor.temperature"

                             android:required="true"/>

        Android Market只将应用程序安装在有温度传感器的设备上。但是该规则并不适用于其他Android应用商店。也就是说,一些Android应用商店不会执行检测以确保应用程序安装在支持指定传感器的设备上

import android.support.v7.app.AppCompatActivity;       报错

去Google android研发网站查找到了关于Android X的解释:

    AndroidX 对原始 Android 支持库进行了重大改进,后者现在已不再维护。
    androidx 软件包完全取代了支持库,不仅提供同等的功能,而且提供了新的库。
    此外,AndroidX 还包括以下功能:
    AndroidX 中的所有软件包都使用一致的命名空间,以字符串 androidx 开头。支持库软件包已映射到对应的 androidx.* 软件包。有关所有旧类到新类以及旧构建工件到新构建工件的完整映射,请参阅软件包重构页面。
    与支持库不同,androidx 软件包会单独维护和更新。从版本 1.0.0 开始,androidx 软件包使用严格的语义版本控制。您可以单独更新项目中的各个 AndroidX 库。
    版本 28.0.0 是支持库的最后一个版本。我们将不再发布 android.support 库版本。所有新功能都将在 androidx 命名空间中开发。
    怎么使用Android X呢?

例如:

把原先的

import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;

改为

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;

就可以了

原先的很多都要去替换。包括在build.gradle、xml文件、java文件中。

手机没有温度传感器怎么监控温度

其实在我们的手机中的元器件是十分微小紧密而又复杂的,光是一个CPU就是以nm级别的单位来研发制造的,而在手机的内部也存在着许多热敏元器件,其中就会在多个地方设置安装热敏电阻,以达到实时检测手机某些特殊地方运行温度来进行整体调度避免手机损坏的目的。而这些软件就是通过这些热敏电阻其中的参数值变化,将其转化为手机上可以实时直观看到的温度的,所以即便是你的手机没有专门的温度检测器,也能够通过手机上都内置的热敏电阻来获取温度信息。

参考代码:https://www.cnblogs.com/1138720556Gary/p/9279841.html

chuanganqi2.app(获取手机传感器列表)

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private TextView tx1;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        Button bt1 = findViewById(R.id.button);

        tx1=findViewById(R.id.textView);

        //从系统获得传感器管理器

        final SensorManager sm = (SensorManager)getSystemService(Context.SENSOR_SERVICE);

        bt1.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                String str;

                //从传感器管理器中获得全部的传感器列表

                // 用TYPE_ALL参数调用getSensorList()方法,以获取一个包含设备上所有传感器的列表。

                List<Sensor> allSensors = sm.getSensorList(Sensor.TYPE_ALL);

                int i;

                //给ViewText添加滚动条

                tx1.setMovementMethod(ScrollingMovementMethod.getInstance());

                //显示有多少个传感器

                tx1.setText("经检测该手机有"+allSensors.size()+"个传感器,它们分别是:");

                Sensor s;

                //显示每个传感器的具体信息

                for(i=0;i<allSensors.size();i++)

                {

                    s=allSensors.get(i);

                    str="设备名称:"+s.getName();

                    switch(s.getType())

                    {

                        //加速传感器     Sensor.TYPE_ACCELEROMETER

                        case Sensor.TYPE_ACCELEROMETER:

                            tx1.setText(tx1.getText()+"\n"+i+"加速传感器accelerometer:\n"+str);

                            break;

                        //陀螺仪传感器    Sensor.TYPE_GYROSCOPE

                        case Sensor.TYPE_GYROSCOPE:

                            tx1.setText(tx1.getText()+"\n"+i+"陀螺仪传感器gyroscope:\n"+str);

                            break;

                        //环境光仪传感器   Sensor.TYPE_LIGHT

                        case Sensor.TYPE_LIGHT:

                            tx1.setText(tx1.getText()+"\n"+i+"环境光仪传感器light:\n"+str);

                            break;

                        //电磁场传感器    Sensor.TYPE_MAGNETIC_FIELD

                        case Sensor.TYPE_MAGNETIC_FIELD:

                            tx1.setText(tx1.getText()+"\n"+i+"电磁场传感器magnetic:\n"+str);

                            break;

                        //方向传感器    Sensor.TYPE_ORIENTATION:

                        case Sensor.TYPE_ORIENTATION:

                            tx1.setText(tx1.getText()+"\n"+i+"方向传感器orientation:\n"+str);

                            break;

                        //压力传感器     Sensor.TYPE_PRESSURE:

                        case Sensor.TYPE_PRESSURE:

                            tx1.setText(tx1.getText()+"\n"+i+"压力传感器pressure:\n"+str);

                            break;

                        //距离传感器     Sensor.TYPE_PROXIMITY:

                        case Sensor.TYPE_PROXIMITY:

                            tx1.setText(tx1.getText()+"\n"+i+"距离传感器proximity:\n"+str);

                            break;

                        //温度传感器     Sensor.TYPE_TEMPERATURE:

                        case Sensor.TYPE_TEMPERATURE:

                            tx1.setText(tx1.getText()+"\n"+i+"温度传感器temperature:\n"+str);

                            break;

                        default:

                            tx1.setText(tx1.getText()+"\n"+i+"未知传感器:\n"+str);

                            break;

                    }

                }

            }

        });

    }

}

activity_main.xml

    <TextView

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:text="传感器操作!"

        android:textSize="10pt" />

    <Button

        android:id="@+id/button"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="获取手机传感器信息"/>

    <TextView

        android:id="@+id/textView"

        android:scrollbars="vertical"

        android:layout_width="fill_parent"

        android:layout_height="fill_parent"

        android:textSize="8pt"/>

</LinearLayout>

Jiasuqi.app(获取手机加速度)

MainActivity.java

public class MainActivity extends AppCompatActivity implements SensorEventListener,View.OnClickListener {

//要监控传感器的原始数据,你需要实现SensorEventListener接口

    private SensorManager mSensorMgr;

    private  TextView tvx;

    private  TextView tvy;

    private  TextView tvz;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        Button bt=findViewById(R.id.bt_dsp);

        bt.setOnClickListener(this);

        Button bt_stop=findViewById(R.id.bt_stop);

        bt_stop.setOnClickListener(this);

        tvx=findViewById(R.id.tvx);

        tvy=findViewById(R.id.tvy);

        tvz=findViewById(R.id.tvz);

        //要识别设备上的传感器,你首先需要获取一个传感器设备的引用。

        // 你可以通过调用getSystemService(),并传入SENSOR_SERVICE参数,来创建一个SensorManage

        mSensorMgr=(SensorManager)getSystemService(Context.SENSOR_SERVICE);

    }

//使用了onResume()和onPause()回调方法来注册和注销传感器事件侦听器

    protected void onPause()

    {

        super.onPause();

        mSensorMgr.unregisterListener(this);

    }

    protected void onResume()

    {

        super.onResume();

    }

    protected void onStop()

    {

        super.onStop();

        mSensorMgr.unregisterListener(this);

    }

    //要监控传感器的原始数据,你需要实现SensorEventListener接口的onSensorChanged()回调方法

    //l传感器报送一个新数据

    //这种情况下,系统会调用onSensorChanged()方法,并传给你一个SensorEvent对象TYPE_ACCELEROMETER。

    // SensorEvent对象中包含了新数据的相关信息

    public void onSensorChanged(SensorEvent event)

    {

        if(event.sensor.getType()==Sensor.TYPE_ACCELEROMETER)

        {

            float[] values=event.values;

            tvx.setText("X方向的加速度: "+Float.toString(values[0]));

            tvy.setText("Y方向的加速度: "+Float.toString(values[1]));

            tvz.setText("Z方向的加速度: "+Float.toString(values[2]));

        }

    }

    //要监控传感器的原始数据,你需要实现SensorEventListener接口的onAccuracyChanged()回调办法

    public void onAccuracyChanged(Sensor sensor,int accuracy)

    {//不用处理,空着就行

        return;

    }

    public void onClick(View v)

    {

        if(v.getId()==R.id.bt_dsp)

        {

            mSensorMgr.unregisterListener(this,mSensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER));

            mSensorMgr.registerListener(this,

                    //用某类型常量作为参数的getDefaultSensor()来检测设备上是否存在该类型的传感器

                    mSensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),

                    SensorManager.SENSOR_DELAY_NORMAL);

            return;

        }

        if(v.getId()==R.id.bt_stop)

        {

            mSensorMgr.unregisterListener(this);

            return;

        }

    }

}

activity_main.xml

    <TextView

        android:id="@+id/tvx"

        android:layout_width="214dp"

        android:layout_height="69dp"

        android:text="TextView"

        tools:layout_editor_absoluteX="117dp"

        tools:layout_editor_absoluteY="100dp" />

    <TextView

        android:id="@+id/tvy"

        android:layout_width="214dp"

        android:layout_height="53dp"

        android:text="TextView"

        tools:layout_editor_absoluteX="126dp"

        tools:layout_editor_absoluteY="158dp" />

    <TextView

        android:id="@+id/tvz"

        android:layout_width="214dp"

        android:layout_height="53dp"

        android:text="TextView"

        tools:layout_editor_absoluteX="130dp"

        tools:layout_editor_absoluteY="234dp" />

    <Button

        android:id="@+id/bt_dsp"

        android:layout_width="131dp"

        android:layout_height="79dp"

        android:text="开始显示加速度"

        tools:layout_editor_absoluteX="115dp"

        tools:layout_editor_absoluteY="444dp" />

    <Button

        android:id="@+id/bt_stop"

        android:layout_width="217dp"

        android:layout_height="81dp"

        android:text="停止显示加速度" />

</LinearLayout

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值