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

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

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

贴代码:

布局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

	}
}

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

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

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