Мое приложение воспроизводит музыку, и когда пользователи открывают экран уведомлений, проводя пальцем вверху экрана (или, как правило, в правом нижнем углу экрана на планшетах), я хочу представить им кнопку, чтобы остановить воспроизведение текущей музыки и запустить ее снова, если они хотят.
Я не планирую размещать виджет на главном экране пользователя, а только в уведомлениях. Как я могу это сделать?
android
button
widget
notifications
откровенный
источник
источник
Ответы:
Вы можете создать намерение для действия (в этом случае прекратить воспроизведение) и добавить его в качестве кнопки действия в свое уведомление.
Intent snoozeIntent = new Intent(this, MyBroadcastReceiver.class); snoozeIntent.setAction(ACTION_SNOOZE); snoozeIntent.putExtra(EXTRA_NOTIFICATION_ID, 0); PendingIntent snoozePendingIntent = PendingIntent.getBroadcast(this, 0, snoozeIntent, 0); NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.notification_icon) .setContentTitle("My notification") .setContentText("Hello World!") .setPriority(NotificationCompat.PRIORITY_DEFAULT) .setContentIntent(pendingIntent) .addAction(R.drawable.ic_snooze, getString(R.string.snooze), snoozePendingIntent);
См. Документацию Android .
источник
Добавить кнопку действия в уведомление
Intent snoozeIntent = new Intent(this, MyBroadcastReceiver.class); snoozeIntent.setAction(ACTION_SNOOZE); snoozeIntent.putExtra(EXTRA_NOTIFICATION_ID, 0); PendingIntent snoozePendingIntent = PendingIntent.getBroadcast(this, 0, snoozeIntent, 0); NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.notification_icon) .setContentTitle("My notification") .setContentText("Hello World!") .setPriority(NotificationCompat.PRIORITY_DEFAULT) .setContentIntent(pendingIntent) .addAction(R.drawable.ic_snooze, getString(R.string.snooze), snoozePendingIntent);
Для получения дополнительной информации посетите https://developer.android.com/training/notify-user/build-notification.html.
источник
Я постараюсь предоставить решение, которое я использовал, и большинство музыкальных плееров также используют ту же технику для отображения элементов управления плеером на панели уведомлений.
Я запускаю службу, которая используется для управления проигрывателем Media Player и всеми его элементами управления. Действие Пользовательский контроль взаимодействует со службой, например, отправляя намерения службе.
Intent i = new Intent(MainActivity.this, MyRadioService.class); i.setAction(Constants.Player.ACTION_PAUSE); startService(i);
Чтобы получить намерения и выполнить действие в классе обслуживания, я использую следующий код в методе onStartCommand службы
@Override public int onStartCommand(Intent intent, int flags, int startId) { if (intent.getAction().equals(Constants.Player.ACTION_PAUSE)) { if(mediaPlayer.isPlaying()) { pauseAudio(); } }
Теперь точный ответ на ваш вопрос, чтобы показать уведомление с элементами управления воспроизведением. Вы можете вызвать следующие методы, чтобы показать уведомление с элементами управления.
// showNotification private void startAppInForeground() { // Start Service in Foreground // Using RemoteViews to bind custom layouts into Notification RemoteViews views = new RemoteViews(getPackageName(), R.layout.notification_status_bar); // Define play control intent Intent playIntent = new Intent(this, MyRadioService.class); playIntent.setAction(Constants.Player.ACTION_PLAY); // Use the above play intent to set into PendingIntent PendingIntent pplayIntent = PendingIntent.getService(this, 0, playIntent, 0); // binding play button from layout to pending play intent defined above views.setOnClickPendingIntent(R.id.status_bar_play, pplayIntent); views.setImageViewResource(R.id.status_bar_play, R.drawable.status_bg); Notification status = null; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { status = new Notification.Builder(this).build(); } status.flags = Notification.FLAG_ONGOING_EVENT; status.icon = R.mipmap.ic_launcher; status.contentIntent = pendingIntent; startForeground(Constants.FOREGROUND_SERVICE, status);
} Надеюсь, это действительно вам поможет. И вы сможете добиться желаемого. Удачного кодирования :)
источник
complete
ответомfit
на случай пользователя.// It shows buttons on lock screen (notification). Notification notification = new Notification.Builder(context) .setVisibility(Notification.VISIBILITY_PUBLIC) .setSmallIcon(R.drawable.NotIcon) .addAction(R.drawable.ic_prev, "button1",ButtonOneScreen) .addAction(R.drawable.ic_pause, "button2", ButtonTwoScreen) ..... .setStyle(new Notification.MediaStyle() .setShowActionsInCompactView(1) .setMediaSession(mMediaSession.getSessionToken()) .setContentTitle("your choice") .setContentText("Again your choice") .setLargeIcon(buttonIcon) .build();
Пожалуйста, обратитесь к этому для получения более подробной информации Нажмите здесь
источник
Я думаю, что помимо
Ankit Gupta
ответа вы можете использовать MediaSession (API> 21) для добавления собственного представления mediaController :notificationBuilder .setStyle(new Notification.MediaStyle() .setShowActionsInCompactView(new int[]{playPauseButtonPosition}) // show only play/pause in compact view .setMediaSession(mSessionToken)) .setColor(mNotificationColor) .setSmallIcon(R.drawable.ic_notification) .setVisibility(Notification.VISIBILITY_PUBLIC) .setUsesChronometer(true) .setContentIntent(createContentIntent(description)) // Create an intent that would open the UI when user clicks the notification .setContentTitle(description.getTitle()) .setContentText(description.getSubtitle()) .setLargeIcon(art);
Источник: учебник
вы также можете создать собственное представление и отобразить его в области уведомлений, первый ответ здесь отличный.
источник
протестирован, рабочий код с Android Pie. Все они относятся к одному классу обслуживания.
Показать уведомление:
public void setNotification() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { NotificationChannel channel = new NotificationChannel("a", "status", NotificationManager.IMPORTANCE_DEFAULT); channel.setDescription("notifications"); notificationManager = getSystemService(NotificationManager.class); notificationManager.createNotificationChannel(channel); } else notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); Receiver.service = this; Notification.MediaStyle style = new Notification.MediaStyle(); notification = new Notification.Builder(this) .setSmallIcon(R.mipmap.ic_launcher) .setContentTitle("Notification") .addAction(R.drawable.close_icon, "quit_action", makePendingIntent("quit_action")) .setStyle(style); style.setShowActionsInCompactView(0); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { notification.setChannelId("a"); } // notificationManager.notify(123 , notification.build()); // pre-oreo startForeground(126, notification.getNotification()); }
Вспомогательная функция:
public PendingIntent makePendingIntent(String name) { Intent intent = new Intent(this, FloatingViewService.Receiver.class); intent.setAction(name); PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0); return pendingIntent; }
Для обработки действий:
static public class Receiver extends BroadcastReceiver { static FloatingViewService service; @Override public void onReceive(Context context, Intent intent) { String whichAction = intent.getAction(); switch (whichAction) { case "quit_action": service.stopForeground(true); service.stopSelf(); return; } } }
Вам также нужно будет обновить свой манифест:
<receiver android:name=".FloatingViewService$Receiver"> <intent-filter> <action android:name="quit_action" /> </intent-filter> </receiver>
источник
вы можете добавить кнопку, как показано ниже, и выполнить действие с этой кнопкой, также я сделал для себя, как показано ниже, проверьте.
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.drawable.ic_logo) .setAutoCancel(true) .setContentTitle(name) .setContentText(body) .setGroupSummary(true) .addAction(android.R.drawable.ic_menu_directions, "Mark as read", morePendingIntent);
// morePendingIntent (делайте свое дело)
PendingIntent morePendingIntent = PendingIntent.getBroadcast( this, REQUEST_CODE_MORE, new Intent(this, NotificationReceiver.class) .putExtra(KEY_INTENT_MORE, REQUEST_CODE_MORE) .putExtra("bundle", object.toString()), PendingIntent.FLAG_UPDATE_CURRENT );
источник
Не знаю, правильный это путь или нет, но он работает.
BroadCastReceiver
класс для получения данных при нажатии кнопки.public class MyBroadCastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String log = "URI: " + intent.toUri(Intent.URI_INTENT_SCHEME); Log.d("my", "LOG:::::::" + log); } }
Intent intent = new Intent(); intent.setAction("unique_id"); intent.putExtra("key", "any data you want to send when button is pressed"); PendingIntent pendingIntent = PendingIntent.getBroadcast(this, REQUEST_CODE, intent, 0);
BroadcastReceiver br = new MyBroadCastReceiver(); IntentFilter filter = new IntentFilter("unique_id"); registerReceiver(br, filter);
Теперь, если вы хотите делать определенные действия при нажатии кнопки, вы можете сделать это в
onReceive()
методеMyBroadCastReceiver
класса.источник