drcarter의 DevLog




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 화면에 음악재생의 컨트롤을 활용할 수 있을 것입니다.