Проблемы Android с виджетом и несколькими ожидающими намерениями

У меня есть виджет, над которым я работаю, который управляет службой медиаплеера. У меня есть 4 кнопки на моем виджете:

  • Предыдущий
  • Воспроизведение/Пауза
  • Останавливаться
  • Вперед

Четырем кнопкам назначено ожидающее намерение, которое отправляет широковещательную рассылку в службу проигрывателя с требуемым действием, содержащимся в нем в качестве дополнительного.

Проблема, с которой я сталкиваюсь, заключается в том, что когда я назначаю ожидающие намерения кнопкам, как показано ниже, все они, похоже, имеют одинаковое значение трансляции. Например, в приведенном ниже коде все 4 кнопки отправляют Globals.PlaybackActions.SKIP_FORWARD. Однако, если я прокомментирую код, который назначает ожидающие намерения, за исключением кнопки «Воспроизвести», тогда нажатие «Воспроизвести» транслирует правильное значение.

Есть ли что-то, о чем я не знаю, используя несколько ожидающих намерений в качестве широковещательных передач на виджете, или я сделал глупую ошибку в своем коде, которую не могу обнаружить? Или секретный вариант С?

Я безнадежно потерян и сбит с толку и был бы очень благодарен за любую помощь. Спасибо.

    public class PlayerWidget extends AppWidgetProvider {

        private boolean serviceIsPlaying = false;

        private PendingIntent pendingIntentPrev = null;
        private PendingIntent pendingIntentNext = null;
        private PendingIntent pendingIntentStop = null;
        private PendingIntent pendingIntentPlay = null;

        public void onReceive(Context context, Intent intent) {
            if (!intent.getAction().equals(Globals.BROADCAST_WIDGET_UPDATE)) {
                return;
            }

            AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
            ComponentName thisAppWidget = new ComponentName(context.getPackageName(), PlayerWidget.class.getName());
            int[] appWidgetIds = appWidgetManager.getAppWidgetIds(thisAppWidget);

            this.updateViews(context, appWidgetManager, appWidgetIds);
        }

        private void updateViews(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds){
            RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_player);

            this.setClickIntents(context);

            if (this.serviceIsPlaying) { 
                remoteViews.setImageViewResource(R.id.btnPlay, R.drawable.ic_action_pause); 
                }
            else { 
                remoteViews.setImageViewResource(R.id.btnPlay, R.drawable.ic_action_play); 
            }

            remoteViews.setTextViewText(R.id.txtArtistName, currentTrack.getArtistName());
            remoteViews.setTextViewText(R.id.txtSongName, currentTrack.getSongTitle());
            remoteViews.setTextViewText(R.id.txtAlbumName, currentTrack.getAlbumName());
            remoteViews.setImageViewBitmap(R.id.imgAlbumArt, BitmapFactory.decodeFile(currentTrack.getAlbumArtPath()));

            remoteViews.setOnClickPendingIntent(R.id.btnPrev, pendingIntentPrev);
            remoteViews.setOnClickPendingIntent(R.id.btnNext, pendingIntentNext);
            remoteViews.setOnClickPendingIntent(R.id.btnStop, pendingIntentStop);
            remoteViews.setOnClickPendingIntent(R.id.btnPlay, pendingIntentPlay);

            appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);
        }

        private void setClickIntents(Context context) {
            Intent intentPrev = new Intent(Globals.BROADCAST_PLAYBACK_ACTION);
            Intent intentNext = new Intent(Globals.BROADCAST_PLAYBACK_ACTION);
            Intent intentStop = new Intent(Globals.BROADCAST_PLAYBACK_ACTION);
            Intent intentPlay = new Intent(Globals.BROADCAST_PLAYBACK_ACTION);

            intentPrev.putExtra(Globals.EXTRA_PLAYBACK_ACTION, Globals.PlaybackActions.SKIP_BACKWARD);
            intentNext.putExtra(Globals.EXTRA_PLAYBACK_ACTION, Globals.PlaybackActions.SKIP_FORWARD);
            intentStop.putExtra(Globals.EXTRA_PLAYBACK_ACTION, Globals.PlaybackActions.STOP);

            if (this.serviceIsPlaying) {
                intentPlay.putExtra(Globals.EXTRA_PLAYBACK_ACTION, Globals.PlaybackActions.PAUSE);
            }
            else {
                intentPlay.putExtra(Globals.EXTRA_PLAYBACK_ACTION, Globals.PlaybackActions.PLAY);
            }

            pendingIntentPrev = PendingIntent.getBroadcast(context, 0, intentPrev, 0);
            pendingIntentNext = PendingIntent.getBroadcast(context, 0, intentNext, 0);
            pendingIntentStop = PendingIntent.getBroadcast(context, 0, intentStop, 0);
            pendingIntentPlay = PendingIntent.getBroadcast(context, 0, intentPlay, 0);
        }
    }

person TheCrimsonSpace    schedule 28.10.2014    source источник


Ответы (1)


Я думаю, что проблема заключается во втором параметре метода PendingIntent.getBroadcast(). Второй параметр — requestCode, и он должен быть разным для всех 4 PendingIntent, которые вы используете. Например:

pendingIntentPrev = PendingIntent.getBroadcast(context, 0, intentPrev, 0);
pendingIntentNext = PendingIntent.getBroadcast(context, 1, intentNext, 0);
pendingIntentStop = PendingIntent.getBroadcast(context, 2, intentStop, 0);
pendingIntentPlay = PendingIntent.getBroadcast(context, 3, intentPlay, 0);

У меня такая же проблема несколько дней назад, и это помогло мне. Надеюсь, это поможет и вам.

person Michał Wołodkiewicz    schedule 28.10.2014
comment
Круто - это решило мою проблему. Я получил концепцию кода из статьи в Интернете, и там были все нули. Понятия не имею, как они ожидали, что их будет работать. Спасибо Михал - я действительно ценю это. - person TheCrimsonSpace; 30.10.2014