您的位置:首页 > 其它

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

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

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

贴代码:

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

[html] view
plain

<?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>  

实现的代码:

[java] view
plain

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  

  

    }  

}  

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

同时,当我们把手机贴近耳朵时,会从听筒里听到声音,当手机离开耳朵时,切用扬声器来听声音;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: