編輯:關於Android編程
隨著手機的發展,現在各大手機支持的傳感器類型也越來越多,在開發中利用傳感器進行某些操作令人們有一種耳目一新的感覺,例如微信中的搖一搖,以及手機音樂播放器中的搖一搖切歌。今天來簡單介紹下Android中傳感器的使用以及一些常用的傳感器。
一、傳感器的使用
1.首先我們需要獲得傳感器管理對象:通過 mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
2.為SensorManager對象添加監聽事件,通過SensorManage的registerListener方法可以為我們的傳感器添加監聽事件,該方法有多種重載形式,一般我們必須要提供一個listener對象並實現SensorEventListener接口,然後是傳感器的類型(int類型值),或一個傳感器Sensor對象(通過getDefaultSensor可以得到一個sensor對象)。
在SensorEventListener接口中有兩個重要的方法,
1)public void onAccuracyChanged(Sensor sensor, int degree),當傳感器的精准度發生改變時被調用,degree為新的傳感器精度。
2)public void onSensorChanged(SensorEvent event),傳感器信息改變時執行該方法,其中event對象中的values成員中包含了我們所需要的傳感器的重要信息,這是一個float數組值,一般根據傳感器類型不同,該值也會不同,下面我會來介紹一下一些常用的傳感器類型的values值得含義。一般我們在該方法中根據所獲得的傳感器信息來處理自己的事情。
3.當我們不需要監聽傳感器時,通過一個unregisterListener方法來銷毀注冊。
二、常用傳感器類型介紹
在前面我們已經知道SensorEvent中的values是一個獲取傳感器信息的重要變量,接下來就來介紹一些常用傳感器的values含義。
沿手機屏幕橫向為x軸,向右為正;沿手機屏幕豎向為y軸,向上為正;垂直手機屏幕方向為z軸,向外為正。
1.Sensor.TYPE_ACCELEROMETER:加速度感應傳感器
values[0]:x軸方向的重力加速度。
values[1]:y軸方向的重力加速度。
values[2]:z軸方向的重力加速度。
2.Sensor.TYPE_GYROSCOPE: 陀螺儀傳感器
values[0]:沿x軸旋轉的角速度。
values[1]:沿y軸旋轉的角速度。
values[2]:沿z軸旋轉的角速度。
3.Sensor.TYPE_ORIENTATION:方向傳感器
旋轉向量代表設備的結合的方向角和軸的設備通過一個角θ繞軸旋轉< x,y,z >。
values[0]:手機繞著z軸旋轉的角度。0表示北(North);90表示東(East);180表示南(South);270表示西(West)。如果手機是水平放置,表示手機的正前方與正北方向的夾角就是該值。
values[1]:手機繞著x軸旋轉的角度。取值范圍是-180到+180度之間。
values[2]:手機繞著y軸旋轉的角度。取值范圍是-90到+90度之間。
4.Sensor.TYPE_LIGHT:光線傳感器
values[0]:環境光水平勒克斯單位值。
5.Sensor.TYPE_PRESSURE:壓力傳感器
values[0]:大氣壓力值,單位帕。
6.Sensor.TYPE_PROXIMITY: 近程感應器
values[0]:以厘米為單位的距離值。
7.Sensor.TYPE_RELATIVE_HUMIDITY:濕度傳感器
values[0]: 周圍空氣相對濕度百分比。
8.Sensor.TYPE_TEMPERATURE: 溫度傳感器
values[0]: 周圍環境溫度的攝氏度值。
Android API中共定義了十幾種傳感器的類型,每一部手機不可能支持所有的傳感器類型,當通過getDefaultSensor方法返回值為null時表示該手機不支持這種類型的傳感器,當我們為不支持的傳感器注冊了監聽事件,並不會引發異常,只是不能得到任何有效的數據。 三、實踐加速度傳感器實現搖一搖功能
接下來,我們通過代碼來模擬一個搖一搖的功能,主要是通過加速度感應器來實現,當觸發事件時,我們調用手機振動器,並一個Toast顯示。調用手機震動提示時需要為我們的app添加權限。
接下來是我們的代碼部分
package com.example.shaketest; import android.app.Activity; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Bundle; import android.os.Vibrator; import android.util.Log; import android.view.Menu; import android.widget.Toast; public class MainActivity extends Activity { private SensorManager mSensorManager;// 傳感器管理類 private Vibrator mVibrator;// 振動器 private static final String TAG = "MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); mVibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);// 獲得手機振動器 } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); if (mSensorManager != null) { mSensorManager.unregisterListener(mySensorListener); } } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); if (mSensorManager != null) { // 第一個參數是Listener,第二個參數是所得傳感器類型,第三個參數值獲取傳感器信息的頻率 mSensorManager.registerListener(mySensorListener, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL); // SensorManager.SENSOR_DELAY_NORMAL:默認的獲得傳感器數據的速度。 // SensorManager.SENSOR_DELAY_GAME:如果利用傳感器開發游戲,建議使用該值。 // SensorManager.SENSOR_DELAY_UI:如果使用傳感器更新UI中的數據,建議使用該值。 } } private SensorEventListener mySensorListener = new SensorEventListener() { @Override public void onAccuracyChanged(Sensor sensor, int degree) { // TODO Auto-generated method stub // 當傳感器的精准度發生改變時被調用,int為新的傳感器精度 } @Override public void onSensorChanged(SensorEvent event) { // TODO Auto-generated method stub // 傳感器信息改變時執行該方法 float[] values = event.values; // 該變量最多只有3個元素,而且根據傳感器的不同,values變量中元素所代表的含義也不同。 float x = values[0]; // x軸方向的重力加速度 float y = values[1]; // y軸方向的重力加速度 float z = values[2]; // z軸方向的重力加速度 // 設定重力加速度值,當搖晃到達該值時觸發震動,並相應自己的事件 int medumValue = 19; if (Math.abs(x) > medumValue) { mVibrator.vibrate(500); Log.w(TAG, "x_shake"); Log.w(TAG, "x軸::" + x + ";y軸::" + y + ";z軸::" + z); Toast.makeText(MainActivity.this, "Shaking!!!!", Toast.LENGTH_SHORT).show(); } if (Math.abs(y) > medumValue) { mVibrator.vibrate(500); Log.w(TAG, "y_shake"); Log.w(TAG, "x軸::" + x + ";y軸::" + y + ";z軸::" + z); Toast.makeText(MainActivity.this, "Shaking!!!!", Toast.LENGTH_SHORT).show(); } if (Math.abs(z) > medumValue) { mVibrator.vibrate(500); Log.w(TAG, "z_shake"); Log.w(TAG, "x軸::" + x + ";y軸::" + y + ";z軸::" + z); Toast.makeText(MainActivity.this, "Shaking!!!!", Toast.LENGTH_SHORT).show(); } } }; @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
一、 實現拍照、選擇圖片並裁剪圖片效果按照之前博客的風格,首先看下實現效果。 二、 uCrop項目應用想起之前看到的Yalantis/
語法: . . .包含它的文件:可包含:說明:聲明一個實現應用的部分可視化用戶界面的 Activity(一個 Activity子類)。 所有 Activity
Android jni開發資料--NDK環境搭建 android開發人員注意了 谷歌改良了ndk的開發流程,對於Windows環境下NDK的開發,如果
大家好,由於最近會有對智能硬件相關的開發需求,所以最近這些天分享的博文也就大致掛鉤智能硬件了,像上一篇的藍牙分享,相信很多讀者已經看過了,那麼今天我為大家帶來Androi