package com.baina.androidremotecontroller.activity; import android.app.Activity; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.media.MediaMetadataRetriever; import android.media.RemoteController; import android.os.Bundle; import android.os.IBinder; import android.support.v4.app.NotificationManagerCompat; import android.text.TextUtils; import android.util.Log; import android.view.KeyEvent; import android.widget.Toast; import com.baina.androidremotecontroller.model.Music; import com.baina.androidremotecontroller.service.MusicNotificationListenerService; import com.baina.androidremotecontroller.R; import com.baina.androidremotecontroller.utils.Constants; import com.baina.androidremotecontroller.utils.SharedPreferenceUtil; import com.baina.androidremotecontroller.view.MusicControlView; import java.util.Set; /** * Created by baina on 18-1-3. * 远程获取第三方音乐信息及控制第三方音乐 */ public class RemoteControllerActivity extends Activity implements RemoteController.OnClientUpdateListener { private static final String TAG = RemoteControllerActivity.class.getSimpleName(); private MusicNotificationListenerService mNotificationListenerService; private MusicControlView mMusicControlView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_remotecontroller); mMusicControlView = findViewById(R.id.controlView); mMusicControlView.onCreate(new MusicControlView.OnMusicControlClickListener() { @Override public void OnClickMusicCover(int musicControlState) { switch (musicControlState) { case MusicControlView.STATE_NOMUSICPLAYER: startActivity(new Intent("com.baina.allsupportaudioapp")); break; case MusicControlView.STATE_NOMUSICDATA: case MusicControlView.STATE_MUSICDATA: String appPkg = SharedPreferenceUtil.getKeyString(Constants.MUSICPLAYER, null); startApp(appPkg); break; } } @Override public void OnClickPlayPause(int musicControlState) { switch (musicControlState) { case MusicControlView.STATE_NOMUSICPLAYER: startActivity(new Intent("com.baina.allsupportaudioapp")); break; case MusicControlView.STATE_NOMUSICDATA: String appPkg = SharedPreferenceUtil.getKeyString(Constants.MUSICPLAYER, null); startApp(appPkg); break; case MusicControlView.STATE_MUSICDATA: if (mNotificationListenerService != null) { mNotificationListenerService.sendMusicKeyEvent(KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE); } break; } } @Override public void OnClickPrevious(int musicControlState) { switch (musicControlState) { case MusicControlView.STATE_MUSICDATA: if (mNotificationListenerService != null) { mNotificationListenerService.sendMusicKeyEvent(KeyEvent.KEYCODE_MEDIA_PREVIOUS); } break; } } @Override public void OnClickNext(int musicControlState) { switch (musicControlState) { case MusicControlView.STATE_MUSICDATA: if (mNotificationListenerService != null) { mNotificationListenerService.sendMusicKeyEvent(KeyEvent.KEYCODE_MEDIA_NEXT); } break; } } }); } @Override protected void onResume() { super.onResume(); //获取通知相关权限 if (!isNotificationListenerServiceEnabled(this)) { startActivity(new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS")); Toast.makeText(RemoteControllerActivity.this, "请授予通知使用权限", Toast.LENGTH_SHORT).show(); } else { bindService(new Intent(RemoteControllerActivity.this, MusicNotificationListenerService.class), new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { MusicNotificationListenerService.RCBinder rcBinder = (MusicNotificationListenerService.RCBinder) service; mNotificationListenerService = rcBinder.getService(); mNotificationListenerService.registerRemoteController(); mNotificationListenerService.setExternalClientUpdateListener(RemoteControllerActivity.this); } @Override public void onServiceDisconnected(ComponentName name) { } }, Context.BIND_AUTO_CREATE); } //初始化MusicControlView相关 String appPkg = SharedPreferenceUtil.getKeyString(Constants.MUSICPLAYER, null); if (TextUtils.isEmpty(appPkg)) { mMusicControlView.onNoMusicPlayer(); } else { ApplicationInfo info = null; try { info = getPackageManager().getApplicationInfo(appPkg, 0); mMusicControlView.onNoMusicData(info); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } } } @Override public void onClientChange(boolean clearing) { } @Override public void onClientPlaybackStateUpdate(int state) { } @Override public void onClientPlaybackStateUpdate(int state, long stateChangeTimeMs, long currentPosMs, float speed) { mMusicControlView.onClientPlaybackStateUpdate(state); } @Override public void onClientTransportControlUpdate(int transportControlFlags) { } @Override public void onClientMetadataUpdate(RemoteController.MetadataEditor metadataEditor) { String artist = metadataEditor.getString(MediaMetadataRetriever.METADATA_KEY_ARTIST, "null"); String album = metadataEditor.getString(MediaMetadataRetriever.METADATA_KEY_ALBUM, "null"); String title = metadataEditor.getString(MediaMetadataRetriever.METADATA_KEY_TITLE, "null"); Long duration = metadataEditor.getLong(MediaMetadataRetriever.METADATA_KEY_DURATION, -1); Bitmap defaultCover = BitmapFactory.decodeResource(getResources(), android.R.drawable.ic_menu_compass); Bitmap bitmap = metadataEditor.getBitmap(RemoteController.MetadataEditor.BITMAP_KEY_ARTWORK, defaultCover); Log.e(TAG, "artist:" + artist + "album:" + album + "title:" + title + "duration:" + duration); Music music = new Music(); music.setCover(bitmap); music.setTitle(title); music.setArtist(artist); mMusicControlView.onClientMetadataUpdate(music); } private void startApp(String appPkg) { try { Intent intent = this.getPackageManager().getLaunchIntentForPackage(appPkg); startActivity(intent); } catch (Exception e) { Toast.makeText(this, "应用未安装,启动失败", Toast.LENGTH_LONG).show(); } } /** * 是否已经授予通知相关权限 * * @param context,上下文对象 * @return */ private boolean isNotificationListenerServiceEnabled(Context context) { Set<String> packageNames = NotificationManagerCompat.getEnabledListenerPackages(context); if (packageNames.contains(context.getPackageName())) { return true; } return false; } }