转自:http://blog.youkuaiyun.com/kazeik/article/details/8630111
我们在使用微信听声音时,当手机贴近耳朵,声音就由手机听筒里发出来,当我们将手机离开耳朵时,扬声器里则发出声音。还有,我们在通电话时,当手机贴近耳朵时,屏幕就自动关闭,离开时,屏幕就自动打开了。
这里利用到了手机的距离传感器功能;下面我们来实现此功能;
贴代码:
布局XML(四个按钮,实则只用到了两个):
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical"
- tools:context=".SensorTestActivity" >
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal" >
- <Button
- android:id="@+id/btn_start"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:text="播放" />
- <Button
- android:id="@+id/btn_stop"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:text="停止" />
- <Button
- android:id="@+id/btn_open"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:text="打开扬声器" />
- <Button
- android:id="@+id/btn_close"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:text="关闭扬声器" />
- </LinearLayout>
- </LinearLayout>
实现的代码:
- package sensor.kazeik;
- import java.io.IOException;
- 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.media.AudioManager;
- import android.media.MediaPlayer;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- public class SensorTestActivity extends Activity implements OnClickListener,
- SensorEventListener {// 这里实现传感器监听
- /** Called when the activity is first created. */
- Button btn_start = null;
- Button btn_stop = null;
- Button btn_close = null;
- Button btn_open = null;
- // /mediaplaer
- MediaPlayer _mediaPlayer = null; // 音乐播放管理器
- AudioManager audioManager = null; // 声音管理器
- SensorManager _sensorManager = null; // 传感器管理器
- Sensor mProximiny = null; // 传感器实例
- float f_proximiny; // 当前传感器距离
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- btn_start = (Button) findViewById(R.id.btn_start);
- btn_start.setOnClickListener(this);
- btn_stop = (Button) findViewById(R.id.btn_stop);
- btn_stop.setOnClickListener(this);
- btn_close = (Button) findViewById(R.id.btn_close);
- btn_close.setOnClickListener(this);
- btn_open = (Button) findViewById(R.id.btn_open);
- btn_open.setOnClickListener(this);
- _mediaPlayer = new MediaPlayer();
- audioManager = (AudioManager) this
- .getSystemService(Context.AUDIO_SERVICE);
- _sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
- mProximiny = _sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
- }
- @Override
- protected void onResume() {
- // TODO Auto-generated method stub
- super.onResume();
- // 注册传感器
- _sensorManager.registerListener(this, mProximiny,
- SensorManager.SENSOR_DELAY_NORMAL);
- }
- @Override
- protected void onPause() {
- // TODO Auto-generated method stub
- super.onPause();
- // 取消注册传感器
- _sensorManager.unregisterListener(this);
- }
- private void playerMusic(String path) {
- // 重置播放器
- _mediaPlayer.reset();
- try {
- // 设置播放路径
- _mediaPlayer.setDataSource(path);
- // 准备播放
- _mediaPlayer.prepare();
- // 开始播放
- _mediaPlayer.start();
- } catch (IllegalArgumentException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IllegalStateException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- private void stopPlayerMusic() {
- // 停止播放
- if (_mediaPlayer.isPlaying()) {
- _mediaPlayer.reset();
- }
- }
- /*
- * (non-Javadoc)
- *
- * @see android.view.View.OnClickListener#onClick(android.view.View)
- */
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- switch (v.getId()) {
- case R.id.btn_close:
- audioManager.setMode(AudioManager.MODE_NORMAL);
- break;
- case R.id.btn_open:
- audioManager.setMode(AudioManager.MODE_IN_CALL);
- break;
- case R.id.btn_start:// 音乐取自于Sd卡上的音乐
- playerMusic("/mnt/sdcard/mp3/我很快乐.mp3");
- break;
- case R.id.btn_stop:
- stopPlayerMusic();
- break;
- }
- }
- /*
- * 实现SensorEventListener需要实现的两个方法。
- */
- @Override
- public void onSensorChanged(SensorEvent event) {
- // TODO Auto-generated method stub
- f_proximiny = event.values[0];
- Log.v("tag",
- "--> " + f_proximiny + " | " + mProximiny.getMaximumRange());
- if (f_proximiny == mProximiny.getMaximumRange()) {
- audioManager.setMode(AudioManager.MODE_NORMAL);
- } else {
- audioManager.setMode(AudioManager.MODE_IN_CALL);
- }
- }
- /*
- */
- @Override
- public void onAccuracyChanged(Sensor sensor, int accuracy) {
- // TODO Auto-generated method stub
- }
- }
到此项目完成,当我们点击播放时,则播放音乐。点击停止时,停止播放音乐。点击打开扬声器时,这里切换到用听筒听声音,点击关闭扬声器时,这里用扬声器来听声音。
同时,当我们把手机贴近耳朵时,会从听筒里听到声音,当手机离开耳朵时,切用扬声器来听声音;