編輯:關於Android編程
標簽(空格分隔): Android基礎入門教程
說到傳感器,相信大家都不會陌生吧,比如微信的搖一搖就用到了加速度傳感器;
方向傳感器(Orientation sensor) 加速感應器(Accelerometer sensor) 陀螺儀傳感器(Gyroscope sensor) 磁場傳感器(Magnetic field sensor) 距離傳感器(Proximity sensor) 光線傳感器(Light sensor) 氣壓傳感器(Pressure sensor) 溫度傳感器(Temperature sensor) 重力感應器(Gravity sensor,Android 2.3引入) 線性加速感應器(Linear acceleration sensor ,Android 2.3引入) 旋轉矢量傳感器(Rotation vector sensor,Android 2.3) 相對濕度傳感器(Relative humidity sensor,Android 4.0) 近場通信(NFC)傳感器(Android 2.3引入),NFC和其他不一樣,具有讀寫功能。
傳感器的定義:一種物理設備或者生物器官,能夠探測、感受外界的信號,物理條件(如光,熱,
適度)或化學組成(如煙霧),並將探知的信息傳遞給其他的設備或者器官!
傳感器的種類:可以從不同的角度對傳感器進行劃分,轉換原理(傳感器工作的基本物理或化學
效應);用途;輸出信號以及制作材料和工藝等。一般是按工作原來來分:物理傳感器與化學傳感器
兩類!手機上搭載的基本都是物理傳感器,手機上搭載的傳感器有下面這些:當然除了這些以外還有其他比如心率傳感器,記步傳感器,指紋傳感器等,
關於Android設備所支持的傳感器類型可見官方文檔:Sensor Summary部分的內容~
上面說的這麼多種肯定不是所有手機都具備的,每台手機上搭載的傳感器類型
以及數目都可能是不一樣的,比如我手頭上的Nexus 5支持的傳感器類型有:
重力,光線,距離,氣壓和陀螺儀!而令意外moto x 二代則有重力,光線,
距離和紅外傳感器!關於自己手機支持的傳感器類型,你可以到相關的評測
網站比如:中關村手機在線,太平洋等,搜索到自己的機型查看相關參數!
當然,我們也可以自己寫代碼來看看自己手機支持的傳感器類型~
代碼示例:
運行效果圖:
代碼實現:
activity_main.xml:
MainActivity.java:
public class MainActivity extends AppCompatActivity {
private TextView txt_show;
private SensorManager sm;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
txt_show = (TextView) findViewById(R.id.txt_show);
List allSensors = sm.getSensorList(Sensor.TYPE_ALL);
StringBuilder sb = new StringBuilder();
sb.append(此手機有 + allSensors.size() + 個傳感器,分別有:
);
for(Sensor s:allSensors){
switch (s.getType()){
case Sensor.TYPE_ACCELEROMETER:
sb.append(s.getType() + 加速度傳感器(Accelerometer sensor) +
);
break;
case Sensor.TYPE_GYROSCOPE:
sb.append(s.getType() + 陀螺儀傳感器(Gyroscope sensor) +
);
break;
case Sensor.TYPE_LIGHT:
sb.append(s.getType() + 光線傳感器(Light sensor) +
);
break;
case Sensor.TYPE_MAGNETIC_FIELD:
sb.append(s.getType() + 磁場傳感器(Magnetic field sensor) +
);
break;
case Sensor.TYPE_ORIENTATION:
sb.append(s.getType() + 方向傳感器(Orientation sensor) +
);
break;
case Sensor.TYPE_PRESSURE:
sb.append(s.getType() + 氣壓傳感器(Pressure sensor) +
);
break;
case Sensor.TYPE_PROXIMITY:
sb.append(s.getType() + 距離傳感器(Proximity sensor) +
);
break;
case Sensor.TYPE_TEMPERATURE:
sb.append(s.getType() + 溫度傳感器(Temperature sensor) +
);
break;
default:
sb.append(s.getType() + 其他傳感器 +
);
break;
}
sb.append(設備名稱: + s.getName() +
設備版本: + s.getVersion() +
供應商:
+ s.getVendor() +
);
}
txt_show.setText(sb.toString());
}
}
從2中的例子我們可以大概地總結下獲取Sensor傳感器以及獲取傳感器相關的一些信息
流程如下:
Step 1:獲得傳感器管理器:
SensorManager sm = (SensorManager)getSystemService(SENSOR_SERVICE);
Step 2:獲得設備的傳感器對象的列表:
List allSensors = sm.getSensorList(Sensor.TYPE_ALL);
Step 3:迭代獲取Sensor對象,然後調用對應方法獲得傳感器的相關信息:
for(Sensor s:allSensors){
sensor.getName(); //獲得傳感器名稱
sensor.getType(); //獲得傳感器種類
sensor.getVendor(); //獲得傳感器供應商
sensor.getVersion(); //獲得傳感器版本
sensor.getResolution(); //獲得精度值
sensor.getMaximumRange(); //獲得最大范圍
sensor.getPower(); //傳感器使用時的耗電量
}
一般我們是很少說直接去獲取Sensor,然後獲取上面這些信息的!因為這沒什麼
大的作用,我們更多的時候是去獲取傳感器采集到的數據,比如獲取當前的大氣壓,
或者方向傳感器三個角的值,或者陀螺儀的值這樣~而大部分的傳感器數據采集都是
下面的一個套路:
~Step 1:獲得傳感器管理器:
SensorManager sm = (SensorManager)getSystemService(SENSOR_SERVICE);
~Step 2:調用特定方法獲得需要的傳感器:
比如這裡獲取的是方向傳感器,想獲得什麼傳感器自己查API~:
Sensor mSensorOrientation = sm.getDefaultSensor(Sensor.TYPE_ORIENTATION);
~Step 3:實現SensorEventListener接口,重寫onSensorChanged和onAccuracyChanged的方法!
onSensorChanged:當傳感器的值變化時會回調
onAccuracyChanged:當傳感器的進度發生改變時會回調
@Override
public void onSensorChanged(SensorEvent event) {
final float[] _Data = event.values;
this.mService.onSensorChanged(_Data[0],_Data[1],_Data[2]);
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
我們一般獲取傳感器數據的來源就是這個SensorEvent,這個類中有一個values的變量,
類型是Float[],該變量最多有只有三個元素,而且傳感器不同,對應元素代表的含義也不同,
比如方向傳感器中第一個元素是方位角的值,而氣壓傳感器中第一個值則是氣壓值!
~Step 4:SensorManager對象調用registerListener注冊監聽器:
ms.registerListener(mContext, mSensorOrientation, android.hardware.SensorManager.SENSOR_DELAY_UI);
方法也很簡單,對應的參數:上下文對象,Sensor傳感器對象,
以及傳感器的延時時間的精度密度,有四個可選值:
SENSOR_DELAY_FASTEST——延時:0ms
SENSOR_DELAY_GAME——延時:20ms
SENSOR_DELAY_UI——延時:60ms
SENSOR_DELAY_NORMAL——延時:200ms
當然低延時意味著更頻繁的檢車,更意味著更多的電量消耗,如果不是要求精度非常高的建議
別使用太高精度的,一般用第三個較多~自己衡量衡量吧~
~Step 5:監聽器的取消注冊:
用完就放,一個很好的習慣,一般我們可以把他寫到Activity或者Service的銷毀方法中:
public void destroy(){
ms.unregisterListener(mContext, mSensorOrientation);
}
好的,套路非常簡單~
隔了很久沒寫博客,現在必須快速脈動回來。今天我還是接著上一個多線程中的異步加載系列中的最後一個使用異步加載實現ListView中的圖片緩存及其優化。具體來說這次是一個綜合
一直以來Android性能測試一直是Android測試中一個被一部分人遺忘,有被一部分人無可奈何的東西。在絕大部分的創業公司,性能測試基本上都是被遺忘的,因為功能測試和穩
很多時候需要先判斷當前用戶的網絡,才會繼續之後的一些處理邏輯。但網絡類型獲取這一塊,我用我自己的的手機調試時遇到一些問題,這裡記錄一下。一加手機一代,移動4G 網絡,得到
在此鄭重聲明,貼出來的目的不是為了去破解人家的軟件,完全是一種學習的態度,不過好像通過這種方式也可以去漢化一些外國軟件。一、反編譯Apk得到Java源代碼首