到目前為止,關于應用程式與用戶之間的相關內容便比較膚淺的大致介紹完畢,而在整個系統架構中,應用程式與用戶之間的互動,猶如參天大樹上的枝干和樹葉,互動起來五彩繽紛,但使整個生態系統保持生命力的核心,在于樹根,也就是應用程式通過Android系統與設備上硬體的互動,
設備硬體
設備的硬體目前主要分為三大類,包括傳感器系列硬體(重力傳感器、加速度傳感器、陀螺儀、位置傳感器、光亮傳感器等),互聯通信系列硬體(SIM卡,無線WLAN,藍牙、NFC、USB等),多媒體系列硬體(麥克風、播放器、相機等),
雖然設備硬體五花八門,但是在系統層都遵循各自的硬體協議封裝了一層,而在應用程式內部只需要使用系統層提供的相關介面即可,不管是對哪種硬體的訪問,首要步驟都是在應用程式的清單檔案中,使用<uses-permission>標簽宣告要使用的相關權限,
而對于某些設備非必需硬體,應用程式中可使用<uses-feature>標簽宣告對某些硬體的需求,以兼容應用程式在沒有該硬體的設備上運行,
注意,使用
<uses-feature>標簽宣告的硬體需求,在應用程式安裝到設備時,并不會檢查該設備是否支持相關需求硬體,而只是在其他服務如官方Google Play中、或應用程式內部運行到相關硬體支持代碼時,檢測相關宣告,
傳感器系列硬體
權限宣告
對于傳感器系列硬體,需要宣告權限名稱為Manifest.permission.BODY_SENSORS,另外,在Android10.0即API 31及以上的版本中,還可以使用Manifest.permission.HIGH_SAMPLING_RATE_SENSORS權限以更快速的重繪獲取傳感器的資料,
使用流程
與傳感器系列硬體的互動,主要借助android.hardware.SensorManager傳感器管理類,該類的物件,可以在能獲取背景關系環境Context物件的地方,呼叫其getSystemService(Context.SENSOR_SERVICE)獲取系統服務物件,將回傳的結果型別強制轉換為SensorManager型別即可,
在得到SensorManager傳感器管理類的物件后,可以呼叫其getSensorList(int type)方法,引數 type 可以指定為代表所有傳感器型別的Sensor.TYPE_ALL=-1,也可以指定某一類具體的傳感器,這些型別及數值都是在android.hardware.Sensor傳感器類中定義的靜態常量,而該方法的回傳結果,也是List<Sensor>傳感器集合,里邊包含了當前系統所在設備的所有可使用的傳感器資訊,
而如果設備中有多個同一型別的傳感器,可以呼叫getDefaultSensor(int type)方法,引數 type 同樣是指定的某一種傳感器型別,回傳該型別傳感器所使用的默認一個Sensor傳感器物件,如果系統硬體中沒有正常使用該型別的傳感器,則會回傳null,
對于通過傳感器管理類物件找到的Sensor傳感器物件,可以呼叫其getX()系列方法,獲取傳感器的一些基本資訊,方法名中的X包括Id、Name、Version等,
在找到匹配的Sensor傳感器物件后,就可以在合適的時機,開啟實時監測該傳感器獲得的資料,以及在合適的時機,關閉對該傳感器資料的監測活動,通常為了節省資源,在界面Activity的onResume()方法中開啟監測,并在對應的onPause()方法中關閉監測,
開啟監測是呼叫SensorManager物件的registerListener(SensorEventListener listener, Sensor sensor, int samplingPeriodUs, int maxReportLatencyUs, Handler handler)方法,引數 listener 是android.hardware.SensorEventListener傳感器事件監聽器介面所實作的物件,在傳感器發出資料時會回呼該物件所實作的方法;引數 sensor 則是上文所匹配的要檢測的Sensor傳感器物件;引數 samplingPeriodUs 是用int型別標記的監測頻率,其值是SensorManager中定義的靜態常量,包括正常頻率SENSOR_DELAY_NORMAL=3, 稍微快一點以在界面更新時的頻率SENSOR_DELAY_UI=2, 再快一點以在游戲更新時的頻率SENSOR_DELAY_GAME=1, 和最快的頻率SENSOR_DELAY_FASTEST=0;引數 maxReportLatencyUs 為可選引數,是int型別表示傳感器更新資料后回呼上文監聽介面物件的方法時的最大延時,單位是毫秒,且默認值為0;引數 handler 同樣為可選引數,傳感器發出的資料在回呼上文的監聽器介面物件后,也會交付到該Handler型別的物件中處理,默認值為null,
關閉監測是呼叫SensorManager物件的unregisterListener(SensorEventListener listener, Sensor sensor)方法,引數 listener 即在開啟監測方法中傳入的SensorEventListener監聽器介面物件;引數 sensor 是可選引數,為開啟監測方法中傳入的Sensor傳感器物件,當該引數默認值為null時,則會對所有開啟引數 listener 監聽的傳感器物件的監測活動都關閉,
在該SensorEventListener傳感器事件監聽介面的實體化物件中,需要實作兩個方法,包括onAccuracyChanged(Sensor sensor, int accuracy),和onSensorChanged(SensorEvent event)方法,
其中,onAccuracyChanged(Sensor sensor, int accuracy)方法會在傳感器的精確度發生變化時回呼,其引數 sensor 為發生變化的Sensor傳感器物件;引數 accuracy 是int型別的標記,由SensorManager定義的靜態常量,其值包括傳感器資料不允許應用程式訪問的SENSOR_STATUS_NO_CONTACT=-1,傳感器需要校準或無法正常訪問的SENSOR_STATUS_UNRELIABLE=0,低精確度需要校準的SENSOR_STATUS_ACCURACY_LOW=1,普通精確度可以檢測平均值的SENSOR_STATUS_ACCURACY_MEDIUM=2,高精確度非常精準的SENSOR_STATUS_ACCURACY_HIGH=3,
onSensorChanged(SensorEvent event)方法會在傳感器更新資料時回呼,其引數 event 是android.hardware.SensorEvent傳感器事件類,該型別中包含了Sensor傳感器以及更新的float[]資料等資訊,其中的資料陣列長度及內容,則是根據傳感器的不同型別所確定的,
應用場景
類似指南針類應用,計步器類應用,自動調節螢屏亮度等功能,都是依靠傳感器系列硬體實作的,應用程式借助傳感器系列硬體,感知外界環境的動態變化,從而實時展示給用戶查看,而這個資料流向是單向的,
———————————————————————————————轉載請注明出處:白少木丿—————————————————轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/374473.html
標籤:Android
上一篇:將舊的自定義帖子URL重定向到新的WordPressURL
下一篇:CG Kit探索移動端高性能渲染
