2014-09-17 3 views
-1

사용자가 안드로이드 모바일에서 오디오를 재생할 때 귀를 가까이하면 볼륨이 줄어들고 오디오는 줄어들도록 응용 프로그램에서 기능을 구현하고 싶습니다. 이어 피스를 통해 재생해야합니다. (사용자가 음성 메모를 듣고 귀에 가까이 다가 갈 때 응용 프로그램이하는 것과 비슷한 방식입니다.) 다음 코드에서 잘못된 점을 제안하십시오. 도와 주셔서 감사합니다. 다음 코드근접 센서 및 오디오 관리자를 사용하여 안드로이드 장치의 볼륨을 줄이는 방법

public class SensorActivity extends Activity implements SensorEventListener { 
private SensorManager mSensorManager; 
private Sensor mSensor; 
ImageView iv; 
Button b; 
MediaPlayer player; 
private AudioManager mAudioManager; 
public boolean isHeadsetOn; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_sensor); 
    mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 
    mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY); 
    iv = (ImageView) findViewById(R.id.image); 
    b = (Button) findViewById(R.id.audio); 
    mAudioManager = (AudioManager) SensorActivity.this.getSystemService(Context.AUDIO_SERVICE); 
    mAudioManager.setMode(AudioManager.STREAM_MUSIC); 

    b.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      if (player != null && player.isPlaying()) { 
       player.stop(); 
       player.release(); 
      } else { 
       AssetFileDescriptor afd; 
       try { 
        afd = getAssets().openFd("Kraddy Android Porn.mp3"); 
        player = new MediaPlayer(); 
        player.setDataSource(afd.getFileDescriptor()); 
        player.setAudioStreamType(AudioManager.STREAM_VOICE_CALL); 
        player.prepare(); 

        player.start(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 

     } 
    }); 
} 

protected void onResume() { 
    super.onResume(); 
    mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_NORMAL); 

} 

protected void onPause() { 
    super.onPause(); 

    try { 
     // unregisterReceiver(mReciever); 
     mSensorManager.unregisterListener(this); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    if (player != null && player.isPlaying()) { 
     player.stop(); 
     player.release(); 
    } 
} 

public void onAccuracyChanged(Sensor sensor, int accuracy) { 
} 

public void onSensorChanged(SensorEvent event) { 
    Log.e("distance", String.valueOf(event.values[0])); 
    if (event.values[0] == 0) { 
     iv.setImageResource(R.drawable.near); 
     mAudioManager.setSpeakerphoneOn(false); 
    } else { 
     iv.setImageResource(R.drawable.far); 
     mAudioManager.setSpeakerphoneOn(true); 

    } 
} 

}

답변

1

내가 내 게시물에서 언급 한 요구 사항에 완벽하게 잘 작동합니다.

package com.example.proximitysensordemo; 

import java.io.IOException; 

import android.app.Activity; 
import android.content.Context; 
import android.content.res.AssetFileDescriptor; 
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; 
import android.widget.ImageView; 

public class SensorActivity extends Activity implements SensorEventListener { 
    private SensorManager mSensorManager; 
    private Sensor mSensor; 
    ImageView iv; 
    Button b; 
    MediaPlayer player; 
    private AudioManager mAudioManager; 
    public boolean isHeadsetOn; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_sensor); 
    mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 
    mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY); 
    iv = (ImageView) findViewById(R.id.image); 
    b = (Button) findViewById(R.id.audio); 
    mAudioManager=(AudioManager)getSystemService(Context.AUDIO_SERVICE); 

    b.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      if (player != null && player.isPlaying()) { 
       player.pause(); 
      } else { 
       AssetFileDescriptor afd; 
       try { 
        if (player == null) { 
         afd = getAssets().openFd("Kraddy Android Porn.mp3"); 
         player = new MediaPlayer(); 
         player.setDataSource(afd.getFileDescriptor()); 
         player.setAudioStreamType(AudioManager.STREAM_MUSIC); 
         player.prepare(); 
         player.start(); 
        } else { 
         player.start(); 
        } 

       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 

     } 
    }); 
} 

protected void onResume() { 
    super.onResume(); 
    mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_FASTEST); 
    mAudioManager.setMode(AudioManager.MODE_IN_CALL); 
} 

protected void onPause() { 
    super.onPause(); 
    mAudioManager.setMode(AudioManager.MODE_NORMAL); 
    try { 
     // unregisterReceiver(mReciever); 
     mSensorManager.unregisterListener(this); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    if (player != null) { 
     player.stop(); 
     player.release(); 
     player = null; 
    } 
} 

@Override 
protected void onStop() { 
    // TODO Auto-generated method stub 
    super.onStop(); 
} 

public void onAccuracyChanged(Sensor sensor, int accuracy) { 
} 

public void onSensorChanged(SensorEvent event) { 
    Log.e("distance", String.valueOf(event.values[0])); 
    Log.e("MaximumRange", String.valueOf(mSensor.getMaximumRange())); 

    if (event.values[0] < mSensor.getMaximumRange()) { 
     iv.setImageResource(R.drawable.near); 
     mAudioManager.setSpeakerphoneOn(false); 

    } else { 
     iv.setImageResource(R.drawable.far); 
     mAudioManager.setSpeakerphoneOn(true); 
    } 
} 

}이 도움이

희망. 감사.
추 신 : 안드로이드 시스템은 사용 후 센서를 자동으로 해제하지 않으므로 센서 등록을 취소하지 마십시오. 그렇게하지 않으면 음악 플레이어를 사용하는 음악 플레이어 및 기타 응용 프로그램이 이상하게 작동합니다.

+1

고맙습니다. 작동합니다! 이 코드를 사용할 사람 : Manifest에 을 추가하는 것을 기억하고 싶습니다. 아마도 당신은 이미 그것을 알고 있지만, 나는이 부족한 허락 때문에 나의 인생에서 4 시간을 낭비했습니다! 디: – Kurtis92