Android 自制金属探测仪(磁场传感器应用)
前言:
十年前传感器在智能设备上早已大行其道,迄今为止无论iOS亦或Android设备没有搭载传感器的屈指可数。今天依赖于完善的开发工具以及成熟的传感器技术的应用,我们得以展开一场完全依靠自己的双手开发一款金属探测仪的机会。
一:构思
传感器种类很多,包括温度、亮度、湿度以及磁场等。它们统称为Sensor
,由其特有的管理者SensorManager
来进行管理使用。当我们想要使用某种传感器,只需将SensorManager
获取具体传感器的方法内传入特定参数即可。我们获得磁场传感器的实例应用后,会得到设备在三维空间中面向x
、y
、z
三个坐标轴的地磁场强度(单位:微特斯拉)。如果说我们的设备处于一个三维环境中,只要任意一轴方向上磁感应强度发生了变化,那么我们就可以判定附近有磁场上的变化,无论x
、y
、z
三个坐标轴的地磁场强度是否相等。事实上,磁场变化并不是在同一时刻围绕一个物体发生360°的变化,那么我们就可以以任意一轴上的磁感应变化来判断设备附件是否有金属(金属引起物体附近磁场变化)。
二:布局
我们就只创建一个活动,里面放入显示x
、y
、z
三个坐标轴的地磁场强度 的控件。这里有TextView
、ProgressBar
、CircleProgress
(第三方控件)。布局结构也非常简单,一个方向向下的线性布局。
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="Tesla Sensor"android:gravity="center"android:textSize="24sp"android:textStyle="bold"android:paddingTop="25dp"/><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/text_view_x"android:gravity="center"/><ProgressBarandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/progress_bar_x"style="@style/Widget.AppCompat.ProgressBar.Horizontal"/><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/text_view_y"android:gravity="center"/><ProgressBarandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/progress_bar_y"style="@style/Widget.AppCompat.ProgressBar.Horizontal"/><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/text_view_z"android:gravity="center"/><ProgressBarandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/progress_bar_z"style="@style/Widget.AppCompat.ProgressBar.Horizontal"/><com.ihat.pihat.circleprogress.CircleProgressandroid:id="@+id/circle_progress_x"android:layout_width="100dp"android:layout_height="100dp"app:despText="X Detective"app:valueText="None"app:valueTextSize="13sp"app:despTextSize="07sp"app:roundProgressColor="@color/colorPrimaryDark"app:valueTextColor="@color/colorAccent"app:circleStrokeWidth="2dp"android:layout_gravity="center"/><com.ihat.pihat.circleprogress.CircleProgressandroid:id="@+id/circle_progress_y"android:layout_width="100dp"android:layout_height="100dp"app:despText="Y Detective"app:valueText="None"app:valueTextSize="13sp"app:despTextSize="07sp"app:roundProgressColor="@color/colorPrimaryDark"app:valueTextColor="@color/colorAccent"app:circleStrokeWidth="2dp"android:layout_gravity="center"/><com.ihat.pihat.circleprogress.CircleProgressandroid:id="@+id/circle_progress_z"android:layout_width="100dp"android:layout_height="100dp"app:despText="Z Detective"app:valueText="None"app:valueTextSize="13sp"app:despTextSize="07sp"app:roundProgressColor="@color/colorPrimaryDark"app:valueTextColor="@color/colorAccent"app:circleStrokeWidth="2dp"android:layout_gravity="center"/></LinearLayout></androidx.constraintlayout.widget.ConstraintLayout>
预览如下:
三:代码:
这里也没什么特别难以理解的地方。onSensorChanged()
内是磁场传感器数值发生改变时回调的方法,里面传入我们想要更新的控件的逻辑即可。另外不要忘了注册SensorManager()
的监听器,以及及时卸载即可。
import androidx.appcompat.app.AppCompatActivity;import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.media.Ringtone;
import android.media.RingtoneManager;
import android.media.SoundPool;
import android.net.Uri;
import android.os.Bundle;
import android.widget.ProgressBar;
import android.widget.TextView;import com.ayst.dashboardview.DashboardView;
import com.ihat.pihat.circleprogress.CircleProgress;public class MainActivity extends AppCompatActivity implements SensorEventListener {private SensorManager sensorManager;private Sensor sensor;private TextView textViewX;private TextView textViewY;private TextView textViewZ;private ProgressBar progressBarX;private ProgressBar progressBarY;private ProgressBar progressBarZ;private SoundPool soundPool;// Third widget to show a progress information.private CircleProgress circleProgressX;private CircleProgress circleProgressY;private CircleProgress circleProgressZ;private void initView(){textViewX = (TextView) findViewById(R.id.text_view_x);textViewY = (TextView) findViewById(R.id.text_view_y);textViewZ = (TextView) findViewById(R.id.text_view_z);progressBarX = (ProgressBar) findViewById(R.id.progress_bar_x);progressBarY = (ProgressBar) findViewById(R.id.progress_bar_y);progressBarZ = (ProgressBar) findViewById(R.id.progress_bar_z);circleProgressX = (CircleProgress) findViewById(R.id.circle_progress_x);circleProgressY = (CircleProgress) findViewById(R.id.circle_progress_y);circleProgressZ = (CircleProgress) findViewById(R.id.circle_progress_z);}// Init the Sensor and SensorManager, notice the parameter of (Sensor.TYPE_MAGNETIC_FIELD),// we get magnetic sensor to use.private void initSensor(){sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);sensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();initSensor();}@Overrideprotected void onResume() {super.onResume();// Register SensorManager listener.sensorManager.registerListener(MainActivity.this, sensor, SensorManager.SENSOR_DELAY_NORMAL);}@Overrideprotected void onPause() {super.onPause();// Unregister SensorManager listener when callback onPause().sensorManager.unregisterListener(this);}/*** Notice event is an array to store float values.* @param event event[0] for x axis, event[1] for y axis, event[2] for z axis.*/@Overridepublic void onSensorChanged(SensorEvent event) {textViewX.setText(String.valueOf(event.values[0]));progressBarX.setProgress(0 - (int) event.values[0]);circleProgressX.setValueText(String.valueOf(event.values[0]));circleProgressX.setSweepValue(-event.values[0]);textViewY.setText(String.valueOf(event.values[1]));progressBarY.setProgress((int) event.values[1]);circleProgressY.setValueText(String.valueOf(event.values[1]));circleProgressY.setSweepValue(event.values[1]);textViewZ.setText(String.valueOf(event.values[2]));progressBarZ.setProgress(0 - (int) event.values[2]);circleProgressZ.setValueText(String.valueOf(event.values[2]));circleProgressZ.setSweepValue(event.values[2]);}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {}
}
**附:**github 地址 :https://github.com/mcry416/metal_detective
Android 自制金属探测仪(磁场传感器应用)相关推荐
- android开发中磁场传感器,Android传感器(加速度传感器,磁场传感器,光线传感器,方向传感器)...
[android]代码库package mobile.android.sensor; import java.util.List; import android.app.Activity; impor ...
- android开发中磁场传感器,Android开发获取传感器数据的方法示例【加速度传感器,磁场传感器,光线传感器,方向传感器】...
本文实例讲述了Android开发获取传感器数据的方法.分享给大家供大家参考,具体如下: package mobile.android.sensor; import java.util.List; im ...
- android开发中磁场传感器,Android NDK中的陀螺仪和磁场传感器事件
看一下传感器的头文件: ANDROID-NDK-ROOT-DIR/platforms/android-/arch-arm/usr/include/android/sensor.h typedef st ...
- Rexsee API介绍:Android传感器系列之 - 磁场传感器Magnetic Field源码
2019独角兽企业重金招聘Python工程师标准>>> Android的磁场传感器,Magnetic Field..读取磁场的变化,通过该传感器可开发出指南针.罗盘等磁场应用.该传感 ...
- android 获取加速度传感器值,Android开发获取传感器数据的方法示例【加速度传感器,磁场传感器,光线传感器,方向传感器】...
本文实例讲述了Android开发获取传感器数据的方法.分享给大家供大家参考,具体如下: package mobile.android.sensor; import java.util.List; im ...
- Android中的传感器之---磁场传感器
磁场传感器和加速度传感器是一样一样的(我说的是得到数据) Android的磁场传感器,Magnetic Field..读取磁场的变化,通过该传感器可开发出指南针.罗盘等磁场应用.该传感器读取的数据是空 ...
- android磁场传感器页面布局在哪,教程:Android传感器—传感器查询demo
今天给大家带来一个篇安卓传感器查询的干货教程,五一出去旅游看人山人海,不如宅在家学技术! 在Android系统中提供有加速度.磁场.方向.陀螺仪.光线.压力.温度和接近等传感器.传感器系统会主动对上层 ...
- android使用磁场传感器和加速度传感器确定当前朝向(即:方位角),以及常见问题的解决办法
原文链接:http://blog.csdn.net/warren288/article/details/43274647 1,功能实现 确定当前设备朝向的方式有两种,一种是是直接使用 方向传感器 Se ...
- android学习笔记之磁场传感器制做指南针
布局添加一个imageView,在加一个自定义pointer视图(需要加上包名) <FrameLayoutxmlns:android="http://schemas.android.c ...
最新文章
- 什么是python第三方库
- C# 中DateTime的各种使用
- 录制元素基于smartgwt框架项目如何开展自动化(一)
- 计算机软考中集成系统,软考中级系统集成项目管理工程师有哪些作用?
- 成立烘焙公司、买茶饮 瑞幸咖啡谋变破局
- android listview添加数据_Android系统列表控件
- jsp mysql电子档案管理系统_学生档案管理系统的设计与实现(JSP,MySQL)(含录像)
- Something about TFS
- 使用Filter防止浏览器缓存页面或请求结果
- 学生选课系统代码-5-共用代码层
- cad批量打印_CAD插件批量打印3.5.9
- AVOD-代码阅读理解系列(一)
- java怎么用switch求闰年_使用switch语句编程,根据输入的年份判断是否为闰年,根据输入的月份判断这月有多少天...
- Prettier your project
- <<视觉问答>>2022:CLIP Models are Few-shot Learners: Empirical Studies on VQA and Visual Entailment
- 重磅更新丨zCloud 数据库云管平台 v2.5
- 关于DirectX的一些知识
- 西北乱跑娃 --- python excel表合并
- ABAP AMDP数据库存储过程(数据源)
- 计算机应用基础教程 rar,计算机应用基础教程全套1000p精选整理.ppt
热门文章
- 固体物理 2022.10.14
- Arduino OLED/TFT屏【显示汉字、图案】保姆级教程
- kkksc03考前临时抱佛脚(DFS)
- Pedestrian Attribute Recognition
- 《流浪地球》--我们的星球
- 基于JSP的网上招标系统的设计与实现(含论文)
- 重装Win10系统的非常简单的操作教程
- 【yum命令】使用yum报错:There are no enabled repos. Run “yum repolist all“ to see the repos you have.
- python语法简洁清晰、特色之一是强制用作为语句缩进_Python--day01
- BZOJ 4385 洛谷3594 POI2015 WIL-Wilcze doły