當前位置:首頁 » 安卓系統 » android感測器應用

android感測器應用

發布時間: 2022-08-10 04:04:37

⑴ Android 感測器的 數據流和框架 是怎麼樣讓 屏幕旋轉

這篇文章寫的感測器數據從驅動傳遞到應用程序的整個流程,還有數據校正的問題。

應用程序怎麼樣設置可以讓自己隨著設備的傾斜度變化而旋轉方向呢?在AndroidManifest.xml文件中的android:screenOrientation就可以了。這里追蹤一下它的內部機制。
先看一個最關鍵的部件:/frameworks/base/core/java/android/view/WindowOrientationListener.java
這個介面注冊一個accelerator,並負責把accelerator的數據轉化為orientation。這個API對應用程序不公開,我看Android2.3的源碼時發現只有PhoneWindowManager使用到它了。
/frameworks/base/policy/../PhoneWindowManager.java
PhonwWindowManager注冊了一個WindowOrientationListener,就可以非同步獲取當前設備的orientation了。再結合應用程序在AndroidManifest.xml中設置的值來管理著應用程序界面的旋轉方向。以下是PhoneWindowManager.java中相關的兩個代碼片段。

[java] view plain
public void onOrientationChanged(int rotation) {
// Send updates based on orientation value
if (localLOGV) Log.v(TAG, "onOrientationChanged, rotation changed to " +rotation);
try {
mWindowManager.setRotation(rotation, false,
mFancyRotationAnimation);
} catch (RemoteException e) {
// Ignore

}
}
... ...
switch (orientation) {//這個值就是當前設備屏幕的旋轉方向,再結合應用程序設置的android:configChanges屬性值就可以確定應用程序界面的旋轉方向了。應用程序設置值的優先順序大於感測器確定的優先順序。
case ActivityInfo.SCREEN_ORIENTATION_PORTRAIT:
//always return portrait if orientation set to portrait
return mPortraitRotation;
case ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE:
//always return landscape if orientation set to landscape
return mLandscapeRotation;
case ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT:
//always return portrait if orientation set to portrait
return mUpsideDownRotation;
case ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE:
//always return seascape if orientation set to reverse landscape
return mSeascapeRotation;
case ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE:
//return either landscape rotation based on the sensor
mOrientationListener.setAllow180Rotation(
isLandscapeOrSeascape(Surface.ROTATION_180));
return getCurrentLandscapeRotation(lastRotation);
case ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT:
mOrientationListener.setAllow180Rotation(
!isLandscapeOrSeascape(Surface.ROTATION_180));
return getCurrentPortraitRotation(lastRotation);
}

讓應用程序隨屏幕方向自動旋轉的實現原理就這么交待完了。我解決這一步時也沒有費多少力氣,在板子上打開SensorTest,對比一下XYZ三個軸和MileStone上面的數據,修改一下正負值就可以了。但要解決Teeter運行時Z軸反轉的問題,還得深層次挖一挖。

PhoneWindowManager.java中有這么一句:
mWindowManager.setRotation(rotation, false, mFancyRotationAnimation);
當PhonewindowManager通過WindowOrientationListener這個監聽器得知屏幕方向改變時,會通知給WindowManagerService(/frameworks/base/service/../WindowManagerService.java)
WindowManagerService中有這么一個監聽器集合:mRotationWatchers,誰想監聽屏幕方向改變,就會在這里注冊一個監聽器。SensorManager就這么幹了。然後,通過下面這個非同步方法獲知當前的屏幕方向

⑵ android 感測器應用開發 org.openintents.sensorsimulator.hardware.SensorManagerSimulator

沒引用org.openintents.sensorsimulator吧

⑶ Android開發,有兩個fragment,其中一個fragment中是一個感測器應用界面,

第一個要點:首先要有良好的編程習慣
要成為一名優秀的資源管理員;既要運用常識,還要使用公認的演算法和標準的設計模式。在資源使用方面,如果你打開了資源,要記得關閉資源。要盡量晚地獲取,盡量早地釋放。這些由來已久的編程准則同樣適用於你的Android應用程序,如果它們使用底層的設備服務,更是如此。
比如說,假設你編寫的一個應用程序依賴基於位置的服務。除非你絕對有必要,否則不要開始注冊、獲取位置最新信息;而且要確保,一旦你不再需要這些信息,就要取消獲取最新信息的注冊。這將幫助你避免不必要地耗費設備電池電量或佔用系統資源。
第二個要點:讓阻塞操作遠離主用戶界面線程
想確保你的應用程序運行起來很靈活,就要使用AsyncTask、線程、IntentService或自定義後台服務來處理臟活。應使用裝入器來簡化裝入時間長的數據(如游標)的狀態管理。你無法容忍你的應用程序在某個操作正在處理的時候出現滯後或停頓。
如果某個操作很費時間和資源,就要卸載這部分操作、對它進行非同步處理,那樣你的應用程序仍保持響應迅即,用戶可以處理他們的事務。這個原則適用於下列操作:磁碟讀寫,訪問內容提供方、資料庫和互聯網,以及解析和其他長時間的任務。
第三個要點:使用最新的Android軟體開發工具包(SDK)版本、應用編程介面(API)和最佳實踐
確保你開發的應用程序是最新的,因而要使用Android平台提供的最新工具。隨著Android平台不斷發展,它也在不斷改進。一些功能可能已被棄用,或者換成了更好的功能。核心API得到了修正版(bug fix)和性能改進。已經引入了裝入器等新的API,幫助開發者編寫出運行更穩定、響應更迅即的應用程序。
你知道可以啟用Android3.0應用程序中的硬體加速功能嗎趕緊啟用吧!要明白最佳實踐會隨著時間的變化而變化。明智的開發者密切關注Android平台的新功能、哪些功能不再被推薦。
第四個要點:考慮使用限制模式(Strict Mode)
你可以使用名為限制模式(StrictMode)的AndroidAPI,幫助你查明哪裡違反了幾個良好的編程習慣。StrictMode會幫助你確認你的應用程序是不是存在內存泄漏,並且檢測你的應用程序是不是在試圖執行長時間的阻塞操作,這些操作應該被卸載到線程或別的渠道(參閱第二個要點)。
Android2.3裡面引入StrictMode類(android.os.StrictMode)。
第五個要點:在發布應用程序之前,禁用或盡量少用調試和診斷
如果你的Android應用程序開發起來需要一些時間,你可能已將一些日誌和調試代碼嵌入到了應用程序中。寫入到日誌及其他此類輸出系統給性能帶來了影響。確保在發布應用程序之前,盡量少用或完全禁用這些功能。
現在不妨說說如何運用良好的用戶界面設計原則,讓你應用程序的屏幕更快速地裝入:
第六個要點:確保你設計的布局簡單、簡練和淺層
簡單的屏幕有助於閱讀起來最輕松,而簡單的布局裝入起來最快速。你不應該過於深層地嵌套你的布局,或者用不必要的過多視圖(View)控制項塞滿屏幕。花些時間來開發用戶可以高效使用的簡練用戶界面,而不是試圖把太多功能塞入到單單一個屏幕上。這不但有助於提升應用程序的性能,還有助於讓你的應用程序對用戶來說更高效。
有助於在不影響靈活地針對不同類型的設備進行設計的情況下,劃分用戶界面功能。
第七個要點:讓你應用程序的資源適合目標設備
添加適合特定設備配置的資源,那樣它們就能盡可能高效地裝入。我們在談論圖形資源時,這點尤為重要。如果你添加了可利用的龐大圖像資源,需要裝入和調整大小,就無法有效地使用其他的應用程序資源。
另一個要點就是,如果你准備你的應用程序可以在許多設備上運行,為了讓應用程序軟體包文件保持合理的大小,應該最初只添加運行應用程序所需要的核心資源,然後讓應用程序下載適合該設備的內容。
第八個要點:使用Hierarchy Viewer工具
Hierarchy Viewer工具可以幫助你調試你的應用程序布局。它還提供了寶貴的分析信息,以便了解布局裡面的每一個視圖控制項測量、渲染和繪制要花多少時間。只有準確找到了問題的根源,問題解決起來才容易。
第九個要點:使用layoutopt工具
Layoutopt工具是一款簡單的命令行工具,它可以幫助你找到不必要的控制項嵌套以及縮減布局資源的其他方法,以便盡量減少資源的使用。它讓你可以了解哪些布局控制項可能是多餘的或不必要的。控制項越少、布局層次越淺,性能就越好。
最後,你認為你的應用程序做到了最好嗎現在該對它測試一下了。
第十個要點:使用Traceview及其他Android工具進行分析
Android SDK隨帶了許多工具,可用來對你的應用程序進行分析。其中最流行的工具恐怕莫過於Traceview,這款圖形化工具可以幫助你調試和找到應用程序中的性能瓶頸。不妨看看Android說明文檔中介紹的一些調試工具。

⑷ android重力感測器怎麼用

package com.example.example;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.widget.TextView;
public class MainActivity extends Activity {
private TextView grivaty;
private SensorManager sensorMgr = null;
private float x,y,z;
@Override
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initUI();
}
private void initUI() { // TODO
Auto-generated method stub grivaty = (TextView)findViewById(R.id.grivaty); //通過服務得到感測器管理對象
sensorMgr = (SensorManager) getSystemService(SENSOR_SERVICE); //得到重力感測器實例
//TYPE_ACCELEROMETER 加速度感測器(重力感測器)類型。
//TYPE_ALL 描述所有類型的感測器。
//TYPE_GYROSCOPE 陀螺儀感測器類型
//TYPE_LIGHT 光感測器類型
//TYPE_MAGNETIC_FIELD 恆定磁場感測器類型。
//TYPE_ORIENTATION 方向感測器類型。
//TYPE_PRESSURE 描述一個恆定的壓力感測器類型
//TYPE_PROXIMITY 常量描述型接近感測器
//TYPE_TEMPERATURE 溫度感測器類型描述
final Sensor sensor = sensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); SensorEventListener lsn = new SensorEventListener() { @SuppressWarnings("deprecation") //感測器獲取值改變時響應此函數
public void onSensorChanged(SensorEvent e) { x = e.values[SensorManager.DATA_X]; y = e.values[SensorManager.DATA_Y];
z = e.values[SensorManager.DATA_Z];
// getsensor();
grivaty.setText("x=" + x + " y=" + y + " z=" + z );//左右x值,左正右負,前後位y值,前負後正
}
public void onAccuracyChanged(Sensor s, int accuracy) { } };
//注冊listener,第三個參數是檢測的精確度
sensorMgr.registerListener(lsn, sensor, SensorManager.SENSOR_DELAY_GAME); } }

布局文件:main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <TextView android:id="@+id/grivaty" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </RelativeLayout>

這是網上網友分享的,簡單整理了一下,你看是否可以幫到你

⑸ android 方向感測器和電子羅盤

明顯不是一個東西。方向感測器是手機里的一個感應方向並能在方向改變時發出通知的一個裝置。電子羅盤應該是基於感測器的應用軟體。

⑹ android加速度感測器怎麼使用

使用加速度感測器與其他感測器的方法大致相同,通過調用系統API就可以實現。分為以下幾步:
1.獲取SensorManager
2.使用SensorManager獲取加速度感測器
3.創建自定義的感測器監聽函數,並注冊
4.相對應的,在合適位置實現注銷監聽器的調用
簡單的代碼如下:
public class MainActivity extends Activity {

private static final String TAG = "SensorTest";

private SensorManager mSensorManager;
private Sensor mAccelerometer;
private TestSensorListener mSensorListener;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

initViews();

// 初始化感測器
mSensorListener = new TestSensorListener();
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
}

@Override
protected void onResume() {
super.onResume();
// 注冊感測器監聽函數
mSensorManager.registerListener(mSensorListener, mAccelerometer, SensorManager.SENSOR_DELAY_UI);
}

@Override
protected void onPause() {
super.onPause();
// 注銷監聽函數
mSensorManager.unregisterListener(mSensorListener);
}

private void initViews() {
mSensorInfoA = (TextView) findViewById(R.id.sensor_info_a);
}

class TestSensorListener implements SensorEventListener {

@Override
public void onSensorChanged(SensorEvent event) {
// 讀取加速度感測器數值,values數組0,1,2分別對應x,y,z軸的加速度
Log.i(TAG, "onSensorChanged: " + event.values[0] + ", " + event.values[1] + ", " + event.values[2]);

}

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
Log.i(TAG, "onAccuracyChanged");
}

}

}

⑺ Android 中有哪些感測器的數據是可以分享的

著作權歸作者所有。
商業轉載請聯系作者獲得授權,非商業轉載請註明出處。
作者:肥肥魚
來源:知乎

目前 Android 設備支持的感測器類型如下:
TYPE_ACCELEROMETER 加速度感測器又叫 G-sensor,該數值包含地心引力的影響,單位是 m/s2,測量應用於設備 x 、y、z 軸上的加速度。
將手機平放在桌面上,x 軸默認為0,y 軸默認0,z 軸默認9.81。
將手機朝下放在桌面上,z 軸為-9.81。
將手機向左傾斜,x 軸為正值。
將手機向右傾斜,x 軸為負值。
將手機向上傾斜,y 軸為負值。
將手機向下傾斜,y 軸為正值。

TYPE_AMBIENT_TEMPERATURE 溫度感測器,單位是 ℃,返回當前的溫度。
TYPE_GAME_ROTATION_VECTOR 用來探測運動而不必受到電磁干擾的影響,因為它並不依賴於磁北極。
TYPE_GEOMAGNETIC_ROTATION_VECTOR 地磁旋轉矢量感測器,提供手機的旋轉矢量,當手機處於休眠狀態時,仍可以記錄設備的方位。
TYPE_GRAVITY 重力感測器簡稱 GV-sensor,單位是 $m/s^2%,測量應用於設備X、Y、Z軸上的重力。在地球上,重力數值為9.8,
TYPE_GYROSCOPE 陀螺儀感測器叫做Gyro-sensor,返回x、y、z三軸的角加速度數據。單位是 radians/second。
TYPE_GYROSCOPE_UNCALIBRATED 未校準陀螺儀感測器,提供原始的、未校準、補償的陀螺儀數據,用於後期處理和融合定位數據。
TYPE_LIGHT 光線感應感測器檢測實時的光線強度,光強單位是lux,其物理意義是照射到單位面積上的光通量。
TYPE_LINEAR_ACCELERATION 線性加速度感測器簡稱LA-sensor。線性加速度感測器是加速度感測器減去重力影響獲取的數據。單位是 m/s2。
TYPE_MAGNETIC_FIELD 磁力感測器簡稱為M-sensor,返回 x、y、z 三軸的環境磁場數據。該數值的單位是微特斯拉(micro-Tesla),用uT表示。單位也可以是高斯(Gauss),1Tesla=10000Gauss。硬體上一般沒有獨立的磁力感測器,磁力數據由電子羅盤感測器提供(E-compass)。電子羅盤感測器同時提供方向感測器數據。
TYPE_MAGNETIC_FIELD_UNCALIBRATED 未校準磁力感測器,提供原始的、未校準的磁場數據。
TYPE_ORIENTATION 方向感測器簡稱為O-sensor,返回三軸的角度數據,方向數據的單位是角度。為了得到精確的角度數據,E-compass 需要獲取 G-sensor 的數據,經過計算生產 O-sensor 數據,否則只能獲取水平方向的角度。方向感測器提供三個數據,分別為azimuth、pitch和roll:
azimuth: 方位,返回水平時磁北極和 Y 軸的夾角,范圍為0°至360°。0°為北,90°為東,180°為南,270°為西。
pitch: x 軸和水平面的夾角,范圍為-180°至180°。當 z 軸向 y 軸轉動時,角度為正值。
roll: y 軸和水平面的夾角,由於歷史原因,范圍為-90°至90°。當 x 軸向 z 軸移動時,角度為正值。
TYPE_PRESSURE 壓力感測器,單位是hPa(百帕斯卡),返回當前環境下的壓強。
TYPE_PROXIMITY 接近感測器檢測物體與手機的距離,單位是厘米。一些接近感測器只能返回遠和近兩個狀態,因此,接近感測器將最大距離返回遠狀態,小於最大距離返回近狀態。
TYPE_RELATIVE_HUMIDITY 濕度感測器,單位是 %,來測量周圍環境的相對濕度。
TYPE_ROTATION_VECTOR 旋轉矢量感測器簡稱RV-sensor。旋轉矢量代表設備的方向,是一個將坐標軸和角度混合計算得到的數據。RV-sensor輸出三個數據:
x*sin(theta/2)
y*sin(theta/2)
z*sin(theta/2)
sin(theta/2)是 RV 的數量級。RV 的方向與軸旋轉的方向相同。RV 的三個數值,與cos(theta/2)組成一個四元組。
TYPE_SIGNIFICANT_MOTION 特殊動作觸發感測器。
TYPE_STEP_COUNTER 計步感測器,用於記錄激活後的步伐數。
TYPE_STEP_DETECTOR 步行檢測感測器,用戶每走一步就觸發一次事件。
TYPE_TEMPERATURE 溫度感測器,目前已被TYPE_AMBIENT_TEMPERATURE替代。

⑻ android中方向感測器的最新使用時怎麼定義的

參考如下內容:

安卓的感測器又可以分為基於硬體的和基於軟體的。基於硬體的感測器往往是通過物理組件去實現的,他們通常是通過去測量特殊環境的屬性獲取數據,比如:重力加速度、地磁場強度或方位角度的變化。而基於軟體的感測器並不依賴物理設備,盡管它們是模仿基於硬體的感測器的。基於軟體的感測器通常是通過一個或更多的硬體感測器獲取數據,並且有時會調用虛擬感測器或人工感測器等等,線性加速度感測器和重力感測器就是基於軟體感測器的例子。下面通過官方的一張圖看看安卓平台支持的所有感測器類型:

⑼ 開發android應用程序怎麼調用光感測器

Android手機自帶光線感測器,通常我們手機的屏幕自動亮度都是用光線感測器來實現的。該感測器在前置攝像頭附近,此外,還有一個距離感測器。本文主要講解如何使用Android手機的光線感測器。

獲得感應器服務

Android開發中要使用光線感測器,需要先獲得系統感測器服務Context.SENSOR_SERVICE,獲得方法如下:

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

獲得光線感測器

SensorManager是系統感測器服務,是系統所有感測器的管理器。通過它,我們獲得制定類型的感測器,獲得光線感測器的方法如下:

詳細代碼

熱點內容
時長版怎麼用腳本自動掛機 發布:2022-10-05 12:34:31 瀏覽:394
安卓手機通訊錄如何轉word 發布:2022-10-05 12:29:38 瀏覽:168
域在資料庫 發布:2022-10-05 12:28:39 瀏覽:125
sqlinarray 發布:2022-10-05 12:28:25 瀏覽:902
linux下的svn 發布:2022-10-05 12:24:27 瀏覽:13
安卓怎麼刷蘋果系統 發布:2022-10-05 12:24:24 瀏覽:945
安卓手機微信如何清理存儲 發布:2022-10-05 12:23:45 瀏覽:771
c語言史話 發布:2022-10-05 12:22:49 瀏覽:762
安捷倫編程 發布:2022-10-05 12:21:12 瀏覽:640
無注釋編程 發布:2022-10-05 12:11:31 瀏覽:729