Android - другое приложение, крадущее мой приемник? - PullRequest
2 голосов
/ 29 июня 2011

У меня есть приложение, которое использует намерение ACTION_MEDIA_BUTTON с BroadcastReceiver для управления музыкальным проигрывателем.Пользователь нажимает кнопку на внешнем оборудовании, и он управляет музыкальным проигрывателем в приложении.Пользователь также может УДЕРЖИВАТЬ кнопку и изменить громкость.

Недавно я загрузил другое приложение, в котором используется кнопка гарнитуры, и оно перехватывает назначение кнопки мультимедиа из моего приложения!Поэтому, когда это другое приложение открыто и я нажимаю кнопку, другое приложение запустится, но мое приложение будет думать, что кнопка все еще нажата, поэтому она будет переключать громкость.

Подводя итог,

  • мое приложение открыто, предполагается, что он является единственным слушателем намерений кнопок мультимедиа
  • открывается другое приложение, оно также хочет быть единственным слушателемнамерений мультимедийной кнопки
  • кнопка нажимается при открытых обоих приложениях, управление переходит к другому приложению
  • мое приложение считает, что кнопка удерживается нажатой, поскольку оно потеряло управление при нажатии кнопки внизрежим (я думаю).Затем он запускает функции, которые я не хочу запускать, потому что он думает, что пользователь нажал кнопку.

Можно ли каким-то образом убедиться, что, пока мое приложение открыто, оно является единственным получателем этой кнопки мультимедиа?Могу ли я хотя бы проверить, не занял ли другое приложение, чтобы я мог предотвратить непредвиденное поведение?

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

Ответы [ 2 ]

1 голос
/ 29 июня 2011

Вы можете изменить приоритет вашего BroadcastReceiver (сделать его большим, например, 10000): сначала он должен получить Intent, а затем передать его другому приложению.

0 голосов
/ 17 апреля 2012

У меня похожая проблема. Я полагаю, что за пределами «гонки вооружений» из-за упомянутых приоритетов единственное реальное решение - закрыть другое приложение. Если вы выпускаете это приложение для других пользователей, вы можете отправить им сообщение с просьбой закрыть другие приложения и службы медиаплеера.

В вашем манифесте вы можете установить приоритет намерения равным максимальному значению целого числа, которое равно: 2147483647.

Однако вы не должны устанавливать приоритет IntentFilter более 1000, как указано в документах API. Вы можете установить приоритет IntentFilter следующим образом:

myIntentFilter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);

Полагаю, вам следует вычесть единицу из константы SYSTEM_HIGH_PRIORITY, поскольку в документах указано, что значение должно быть меньше, чем SYSTEM_HIGH_PRIORITY.

Цитата из документации о IntentFilter.setPriority (int):

Приложения должны использовать значение, которое больше чем SYSTEM_LOW_PRIORITY и меньше чем SYSTEM_HIGH_PRIORITY.

...