利用手机距离感应器来切换是用扬声器听音乐还是听筒听音乐

转自:http://blog.csdn.net/kazeik/article/details/8630111 


我们在使用微信听声音时,当手机贴近耳朵,声音就由手机听筒里发出来,当我们将手机离开耳朵时,扬声器里则发出声音。还有,我们在通电话时,当手机贴近耳朵时,屏幕就自动关闭,离开时,屏幕就自动打开了。

这里利用到了手机的距离传感器功能;下面我们来实现此功能;

贴代码:

布局XML(四个按钮,实则只用到了两个):

[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     xmlns:tools="http://schemas.android.com/tools"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     android:orientation="vertical"  
  7.     tools:context=".SensorTestActivity" >  
  8.     <LinearLayout  
  9.         android:layout_width="fill_parent"  
  10.         android:layout_height="wrap_content"  
  11.         android:orientation="horizontal" >  
  12.         <Button  
  13.             android:id="@+id/btn_start"  
  14.             android:layout_width="fill_parent"  
  15.             android:layout_height="wrap_content"  
  16.             android:layout_weight="1"  
  17.             android:text="播放" />  
  18.         <Button  
  19.             android:id="@+id/btn_stop"  
  20.             android:layout_width="fill_parent"  
  21.             android:layout_height="wrap_content"  
  22.             android:layout_weight="1"  
  23.             android:text="停止" />  
  24.         <Button  
  25.             android:id="@+id/btn_open"  
  26.             android:layout_width="fill_parent"  
  27.             android:layout_height="wrap_content"  
  28.             android:layout_weight="1"  
  29.             android:text="打开扬声器" />  
  30.         <Button  
  31.             android:id="@+id/btn_close"  
  32.             android:layout_width="fill_parent"  
  33.             android:layout_height="wrap_content"  
  34.             android:layout_weight="1"  
  35.             android:text="关闭扬声器" />  
  36.     </LinearLayout>  
  37. </LinearLayout>  

实现的代码:

[java]  view plain copy
  1. package sensor.kazeik;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import android.app.Activity;  
  6. import android.content.Context;  
  7. import android.hardware.Sensor;  
  8. import android.hardware.SensorEvent;  
  9. import android.hardware.SensorEventListener;  
  10. import android.hardware.SensorManager;  
  11. import android.media.AudioManager;  
  12. import android.media.MediaPlayer;  
  13. import android.os.Bundle;  
  14. import android.util.Log;  
  15. import android.view.View;  
  16. import android.view.View.OnClickListener;  
  17. import android.widget.Button;  
  18.   
  19. public class SensorTestActivity extends Activity implements OnClickListener,  
  20.         SensorEventListener {// 这里实现传感器监听  
  21.     /** Called when the activity is first created. */  
  22.     Button btn_start = null;  
  23.     Button btn_stop = null;  
  24.     Button btn_close = null;  
  25.     Button btn_open = null;  
  26.   
  27.     // /mediaplaer  
  28.     MediaPlayer _mediaPlayer = null// 音乐播放管理器  
  29.     AudioManager audioManager = null// 声音管理器  
  30.   
  31.     SensorManager _sensorManager = null// 传感器管理器  
  32.     Sensor mProximiny = null// 传感器实例  
  33.   
  34.     float f_proximiny; // 当前传感器距离  
  35.   
  36.     @Override  
  37.     public void onCreate(Bundle savedInstanceState) {  
  38.         super.onCreate(savedInstanceState);  
  39.         setContentView(R.layout.main);  
  40.   
  41.         btn_start = (Button) findViewById(R.id.btn_start);  
  42.         btn_start.setOnClickListener(this);  
  43.   
  44.         btn_stop = (Button) findViewById(R.id.btn_stop);  
  45.         btn_stop.setOnClickListener(this);  
  46.   
  47.         btn_close = (Button) findViewById(R.id.btn_close);  
  48.         btn_close.setOnClickListener(this);  
  49.   
  50.         btn_open = (Button) findViewById(R.id.btn_open);  
  51.         btn_open.setOnClickListener(this);  
  52.   
  53.         _mediaPlayer = new MediaPlayer();  
  54.   
  55.         audioManager = (AudioManager) this  
  56.                 .getSystemService(Context.AUDIO_SERVICE);  
  57.   
  58.         _sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);  
  59.         mProximiny = _sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);  
  60.     }  
  61.   
  62.     @Override  
  63.     protected void onResume() {  
  64.         // TODO Auto-generated method stub  
  65.         super.onResume();  
  66.         // 注册传感器  
  67.         _sensorManager.registerListener(this, mProximiny,  
  68.                 SensorManager.SENSOR_DELAY_NORMAL);  
  69.     }  
  70.   
  71.     @Override  
  72.     protected void onPause() {  
  73.         // TODO Auto-generated method stub  
  74.         super.onPause();  
  75.         // 取消注册传感器  
  76.         _sensorManager.unregisterListener(this);  
  77.     }  
  78.   
  79.     private void playerMusic(String path) {  
  80.         // 重置播放器  
  81.         _mediaPlayer.reset();  
  82.         try {  
  83.             // 设置播放路径  
  84.             _mediaPlayer.setDataSource(path);  
  85.             // 准备播放  
  86.             _mediaPlayer.prepare();  
  87.             // 开始播放  
  88.             _mediaPlayer.start();  
  89.         } catch (IllegalArgumentException e) {  
  90.             // TODO Auto-generated catch block  
  91.             e.printStackTrace();  
  92.         } catch (IllegalStateException e) {  
  93.             // TODO Auto-generated catch block  
  94.             e.printStackTrace();  
  95.         } catch (IOException e) {  
  96.             // TODO Auto-generated catch block  
  97.             e.printStackTrace();  
  98.         }  
  99.     }  
  100.   
  101.     private void stopPlayerMusic() {  
  102.         // 停止播放  
  103.         if (_mediaPlayer.isPlaying()) {  
  104.             _mediaPlayer.reset();  
  105.         }  
  106.     }  
  107.   
  108.     /* 
  109.      * (non-Javadoc) 
  110.      *  
  111.      * @see android.view.View.OnClickListener#onClick(android.view.View) 
  112.      */  
  113.     @Override  
  114.     public void onClick(View v) {  
  115.         // TODO Auto-generated method stub  
  116.         switch (v.getId()) {  
  117.         case R.id.btn_close:  
  118.             audioManager.setMode(AudioManager.MODE_NORMAL);  
  119.             break;  
  120.         case R.id.btn_open:  
  121.             audioManager.setMode(AudioManager.MODE_IN_CALL);  
  122.             break;  
  123.         case R.id.btn_start:// 音乐取自于Sd卡上的音乐  
  124.             playerMusic("/mnt/sdcard/mp3/我很快乐.mp3");  
  125.             break;  
  126.         case R.id.btn_stop:  
  127.             stopPlayerMusic();  
  128.             break;  
  129.         }  
  130.     }  
  131.   
  132.     /* 
  133.      * 实现SensorEventListener需要实现的两个方法。 
  134.      */  
  135.     @Override  
  136.     public void onSensorChanged(SensorEvent event) {  
  137.         // TODO Auto-generated method stub  
  138.         f_proximiny = event.values[0];  
  139.         Log.v("tag",  
  140.                 "-->  " + f_proximiny + "  |  " + mProximiny.getMaximumRange());  
  141.   
  142.         if (f_proximiny == mProximiny.getMaximumRange()) {  
  143.             audioManager.setMode(AudioManager.MODE_NORMAL);  
  144.         } else {  
  145.             audioManager.setMode(AudioManager.MODE_IN_CALL);  
  146.         }  
  147.     }  
  148.   
  149.     /* 
  150.      */  
  151.     @Override  
  152.     public void onAccuracyChanged(Sensor sensor, int accuracy) {  
  153.         // TODO Auto-generated method stub  
  154.   
  155.     }  
  156. }  

到此项目完成,当我们点击播放时,则播放音乐。点击停止时,停止播放音乐。点击打开扬声器时,这里切换到用听筒听声音,点击关闭扬声器时,这里用扬声器来听声音。

同时,当我们把手机贴近耳朵时,会从听筒里听到声音,当手机离开耳朵时,切用扬声器来听声音;


你可能感兴趣的:(利用手机距离感应器来切换是用扬声器听音乐还是听筒听音乐)