您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“在android中手機傳感器如何調用”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“在android中手機傳感器如何調用”這篇文章吧。
源碼:
package com.bobo.study.study_5_1; 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.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import java.util.List; //1,獲得SensorManager對象 //2,獲得想要的Sensor對象 //3,綁定監聽器 public class MainActivity extends Activity implements View.OnClickListener{ Button findBut,accelerationBut,lightBut,orientationBut,proximityBut; SensorManager sensorManager; TextView text,accText,luxText; float gravity[]=new float[3]; float linear_acceleration[]=new float[3]; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findBut=(Button)findViewById(R.id.findBut); findBut.setOnClickListener(this); lightBut=(Button)findViewById(R.id.lightBut); lightBut.setOnClickListener(this); accelerationBut=(Button)findViewById(R.id.accelerationBut); accelerationBut.setOnClickListener(this); orientationBut=(Button)findViewById(R.id.orientationBut); orientationBut.setOnClickListener(this); proximityBut=(Button)findViewById(R.id.proximityBut); proximityBut.setOnClickListener(this); text=(TextView)findViewById(R.id.text); accText=(TextView)findViewById(R.id.accText); luxText=(TextView)findViewById(R.id.luxText); //獲得傳感器管理器對象 sensorManager=(SensorManager)getSystemService(Context.SENSOR_SERVICE); } @Override public void onClick(View v) { if(v==findBut){ //獲取手機上所有傳感器的列表 List<Sensor> sensors=sensorManager.getSensorList(Sensor.TYPE_ALL); for(Sensor sensor:sensors){ System.out.println(sensor.getName()); } }else if(v==lightBut){ //得到默認的加速度傳感器 Sensor lightSensor=sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); //綁定監聽器(上下文接口,要監聽的傳感器,傳感器采樣率<時間間隔>),返回結果 Boolean res=sensorManager.registerListener(new LightSensorListener(),lightSensor,SensorManager.SENSOR_DELAY_NORMAL); Toast.makeText(this,"綁定光線傳感器:"+res,Toast.LENGTH_LONG).show(); } else if(v==accelerationBut){ Sensor accelerometerSensor=sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); Boolean res=sensorManager.registerListener(new AccerationSensorListener(),accelerometerSensor,SensorManager.SENSOR_DELAY_NORMAL); Toast.makeText(this,"綁定加速度傳感器:"+res,Toast.LENGTH_LONG).show(); }else if(v==orientationBut){ Sensor orientationSensor=sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION); Boolean res=sensorManager.registerListener(new OrientaationListener(),orientationSensor,SensorManager.SENSOR_DELAY_NORMAL); Toast.makeText(this,"綁定方向傳感器:"+res,Toast.LENGTH_LONG).show(); } else if(v==proximityBut){ Sensor proximitySensor=sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY); Boolean res=sensorManager.registerListener(new ProximityListener(),proximitySensor,SensorManager.SENSOR_DELAY_NORMAL); Toast.makeText(this,"綁定距離傳感器:"+res,Toast.LENGTH_LONG).show(); } } public class LightSensorListener implements SensorEventListener{ @Override //傳感器的數據被打包成event,主要的檢測數據放在enent.values[]數組中 public void onSensorChanged(SensorEvent event) { System.out.println(event.timestamp);//時間戳 System.out.println(event.sensor.getResolution());//分辨率(能識別出最小數值) System.out.println(event.accuracy);//精度(等級) System.out.println(event.values[0]);//光線強度 } @Override //傳感器精度變化時調用這個函數 public void onAccuracyChanged(Sensor sensor, int accuracy) {} } public class AccerationSensorListener implements SensorEventListener{ @Override public void onSensorChanged(SensorEvent event) { final float alpha=0.8f; //event.values[0]X軸加速度,負方向為正 //event.values[1]Y軸加速度,負方向為正 //event.values[2]Z軸加速度,負方向為正 gravity[0]=alpha*gravity[0]+(1-alpha)*event.values[0]; gravity[1]=alpha*gravity[1]+(1-alpha)*event.values[1]; gravity[2]=alpha*gravity[2]+(1-alpha)*event.values[2]; linear_acceleration[0]=event.values[0]-gravity[0]; linear_acceleration[1]=event.values[1]-gravity[1]; linear_acceleration[2]=event.values[2]-gravity[2]; //通過以上公式可以拋去三個方向上的重力加速度,只剩下純加速度 text.setText(linear_acceleration[0] + ""); accText.setText(linear_acceleration[1] + ""); luxText.setText(linear_acceleration[2] + ""); } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) {} } public class OrientaationListener implements SensorEventListener{ @Override public void onSensorChanged(SensorEvent event) { //(需要手機屏幕向上,向下的話南北會反掉)設備繞Z軸旋轉,Y軸正方向與地磁北極方向的夾角,順時針方向為正,范圍【0,180】 float azimuth=event.values[0]; //設備繞X軸旋轉的角度,當Z軸向Y軸正方向旋轉時為正,反之為負,范圍【-180,180】 float pitch=event.values[1]; //設備繞Y軸旋轉的角度,當Z軸向X軸正方向旋轉時為負,反之為正,范圍【-90,90】 float roll=event.values[2]; text.setText(azimuth+""); accText.setText(pitch +""); luxText.setText(roll+""); } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) {} } public class ProximityListener implements SensorEventListener{ @Override public void onSensorChanged(SensorEvent event) { //距離傳感器測試手機屏幕距離別的物體的記錄,只有兩個值:0和5 //距離很近時為0,否則為5 System.out.println(event.values[0]+""); } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) {} } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }
以上是“在android中手機傳感器如何調用”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。