我们在使用微信听声音时,当手机贴近耳朵,声音就由手机听筒里发出来,当我们将手机离开耳朵时,扬声器里则发出声音。还有,我们在通电话时,当手机贴近耳朵时,屏幕就自动关闭,离开时,屏幕就自动打开了。
这里利用到了手机的距离传感器功能;下面我们来实现此功能;
贴代码:
布局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
}
}
到此项目完成,当我们点击播放时,则播放音乐。点击停止时,停止播放音乐。点击打开扬声器时,这里切换到用听筒听声音,点击关闭扬声器时,这里用扬声器来听声音。
同时,当我们把手机贴近耳朵时,会从听筒里听到声音,当手机离开耳朵时,切用扬声器来听声音;