Android 4.0 ICS 이상 부터 음악을 듣다보면 기본 런처의 lock  화면에서 이와 같이 음악을 컨트롤 할 수 있는 기능을 확인할 수 있을 것입니다. 이 기능을 활용하기 위해서는 

RemoteControlClient(http://developer.android.com/reference/android/media/RemoteControlClient.html) 를 이용하여 사용할 수 있습니다. Added in API level 14 라는건 확인하셔야 하구요.

Developer 페이지 설명을 보아도 사용 할 수 있도록 잘 설명이 되어 있습니다. 주의사항도 적혀 있구요.

A remote control client object is associated with a media button event receiver. This event receiver must have been previously registered withregisterMediaButtonEventReceiver(ComponentName) before the RemoteControlClient can be registered throughregisterRemoteControlClient(RemoteControlClient).

이와 같은 내용도 있지만. 이외 별도로 AudioFocus를 가지고 있어야 합니다.

AudioManager의 requestAudioFocus()메소드를 통해서 현재 플레이어에 AudioFocus가 있어야지 기본 런처의 lock화면에 이와 같은 음악 컨트롤 할 수 있는 화면이 나오게 됩니다.

등록하는 부분.

private void registerRemoteClient()
	{
		if (Build.VERSION.SDK_INT >= 14)
		{
			try
			{
				if (mAudioManager == null)
				{
					mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
				}
				Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);
				mRemoteComponent = new ComponentName(this, AudioPlayerRemoteEventReceiver.class.getName());
				mAudioManager.registerMediaButtonEventReceiver(mRemoteComponent);
				mediaButtonIntent.setComponent(mRemoteComponent);
				mediaButtonIntent.setComponent(mRemoteControlResponder);
				PendingIntent mediaPendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, mediaButtonIntent, 0);

				myRemoteControlClient = new RemoteControlClient(mediaPendingIntent);
				mAudioManager.registerRemoteControlClient(myRemoteControlClient);

				myRemoteControlClient.setTransportControlFlags(RemoteControlClient.FLAG_KEY_MEDIA_PLAY_PAUSE
						| RemoteControlClient.FLAG_KEY_MEDIA_STOP
						| RemoteControlClient.FLAG_KEY_MEDIA_NEXT
						| RemoteControlClient.FLAG_KEY_MEDIA_PREVIOUS
						| RemoteControlClient.FLAG_KEY_MEDIA_PLAY
						| RemoteControlClient.FLAG_KEY_MEDIA_PAUSE);
			}
			catch (Exception e)
			{
				if(CNCronosLog.isDebugLevel())
				{
					e.printStackTrace();
				}
			}
		}
	}

unregister

	private void unregisterRemoteClient()
	{
		try
		{
			if (Build.VERSION.SDK_INT >= 14)
			{
				if(mRemoteComponent != null)
				{
					mAudioManager.unregisterMediaButtonEventReceiver(mRemoteComponent);
					mRemoteComponent = null;;
				}
				if (myRemoteControlClient != null)
				{
					mAudioManager.unregisterRemoteControlClient(myRemoteControlClient);
				}
			}
		}
		catch (Exception e)
		{
			if(CNCronosLog.isDebugLevel())
			{
				e.printStackTrace();
			}
		}
	}

기본 lock 화면에다가 정보 보내는 부분.

					MetadataEditor metaEdit = myRemoteControlClient.editMetadata(true);
					
					metaEdit.putString(MediaMetadataRetriever.METADATA_KEY_TITLE, "title");
					metaEdit.putString(MediaMetadataRetriever.METADATA_KEY_ARTIST, "artist");
					metaEdit.putString(MediaMetadataRetriever.METADATA_KEY_ALBUM, "album");
					metaEdit.putBitmap(MetadataEditor.BITMAP_KEY_ARTWORK, bitmap);
					metaEdit.apply();


현재 player 상태 보내는 부분.

						myRemoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_PLAYING);
						myRemoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_STOPPED);
						myRemoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_PAUSED);
						myRemoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_STOPPED);
						myRemoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_STOPPED);


이와 같이 사용하면 원하는 상태로 기본 런처의 lock 화면에 음악재생의 컨트롤을 활용할 수 있을 것입니다.



음악을 스트리밍 하다가..볼륨을 조절 할 일이 생기게 되었을 경우.
안드로이드에 볼륨 조절하는 버튼이 있지만...
스트리밍 중에 화면에서 SeekBar를 통해서 조절을 하는 방법도 있다.
AudioManager 클래스에 있는 메소드를 이용하면 가능.

1. 볼륨 조절 버튼으로 조절 하기.

public boolean onKeyDown(int keyCode, KeyEvent event) {                  
        AudioManager mAudioManager = 
            (AudioManager)getSystemService(AUDIO_SERVICE);
        switch (keyCode) {
        case KeyEvent.KEYCODE_VOLUME_UP :
            mAudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,
                                             AudioManager.ADJUST_RAISE, 
                                             AudioManager.FLAG_SHOW_UI);
                return true;
        case KeyEvent.KEYCODE_VOLUME_DOWN:
            mAudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, 
                                             AudioManager.ADJUST_LOWER, 
                                             AudioManager.FLAG_SHOW_UI);
                return true;
        case KeyEvent.KEYCODE_BACK:
            return true;
        }

        return false;
   }

    public boolean onKeyUp(int keyCode, KeyEvent event) {
        AudioManager mAudioManager = 
           (AudioManager)getSystemService(AUDIO_SERVICE);
        switch (keyCode) {
        case KeyEvent.KEYCODE_VOLUME_UP :
            mAudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, 
                                             AudioManager.ADJUST_SAME, 
                                             AudioManager.FLAG_SHOW_UI);
                return true;
        case KeyEvent.KEYCODE_VOLUME_DOWN:
            mAudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, 
                                             AudioManager.ADJUST_SAME, 
                                             AudioManager.FLAG_SHOW_UI);
                return true;
        case KeyEvent.KEYCODE_BACK:
            this.finish();
            return true;
        }
        return false;
    }
2. 화면에서 SeekBar를 통해서 조절하기
seekVolumn = (SeekBar) findViewById(R.id.SeekBar_Volumn);
		final AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
		int nMax = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
		int nCurrentVolumn = audioManager
				.getStreamVolume(AudioManager.STREAM_MUSIC);

		seekVolumn.setMax(nMax);
		seekVolumn.setProgress(nCurrentVolumn);

		seekVolumn.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

			@Override
			public void onStopTrackingTouch(SeekBar seekBar) {
				// TODO Auto-generated method stub

			}

			@Override
			public void onStartTrackingTouch(SeekBar seekBar) {
				// TODO Auto-generated method stub

			}

			@Override
			public void onProgressChanged(SeekBar seekBar, int progress,
					boolean fromUser) {
				// TODO Auto-generated method stub
				audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,
						progress, 0);
			}
		});

+ Recent posts