Я использую библиотеку поддержки V7 MediaRouter для переключения маршрутов между динамиком телефона и устройством Bluetooth.Поддержка Android v7 MediaRouter иногда не работает должным образом
И иногда это работает странно, например, когда я выключаю Bluetooth, соответствующий маршрут кажется удаленным (воспроизведение переключается на динамик), но мое приложение не получает никакого обратного вызова. И более того, когда я вручную получаю все маршруты через MediaRouter.getRoutes(), он возвращает этот маршрут Bluetooth, но когда я пытаюсь переключиться на него, он кажется выбранным, но на самом деле воспроизведение по-прежнему проходит через динамик.
Я пробовал все флаги CALLBACK_FLAG_FORCE_DISCOVERY, CALLBACK_FLAG_REQUEST_DISCOVERY и т. Д., Без результата. Помогает только перезагрузка телефона. Какие-либо предложения?
Я использовал Android 4.2, 4.4.
UPDATE, пример кода: ....
private MediaRouter mMediaRouter;
private MediaRouter.Callback mMediaRouterCallback = new MediaRouter.Callback(){
@Override
public void onRouteAdded(MediaRouter router, MediaRouter.RouteInfo route) {
super.onRouteAdded(router, route);
refreshRoutes();
Log.i(TAG, "Route added ==> " + route.getName());
}
@Override
public void onRouteRemoved(MediaRouter router, MediaRouter.RouteInfo route) {
super.onRouteRemoved(router, route);
refreshRoutes();
Log.i(TAG, "Route removed ==> " + route.getName());
}
@Override
public void onRouteSelected(MediaRouter router, MediaRouter.RouteInfo route) {
super.onRouteSelected(router, route);
Log.i(TAG, "Route selected ==> " + route.getName());
refreshRoutes();
}
@Override
public void onRouteUnselected(MediaRouter router, MediaRouter.RouteInfo route) {
super.onRouteUnselected(router, route);
Log.i(TAG, "Route UNselected ==> " + route.getName());
refreshRoutes();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRoutesList = (ListView) findViewById(R.id.routesList);
mRoutesList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
String routeName = mRoutesAdapter.getItem(i);
List<MediaRouter.RouteInfo> routes = mMediaRouter.getRoutes();
for (MediaRouter.RouteInfo rout : routes){
if (rout.getName().equals(routeName)){
mMediaRouter.selectRoute(rout);
}
}
}
});
mMediaRouter = MediaRouter.getInstance(this);
mMediaRouter.addCallback(
new MediaRouteSelector.Builder()
.addControlCategory(MediaControlIntent.CATEGORY_LIVE_AUDIO)
.addControlCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK)
.build(),
mMediaRouterCallback,
MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY);
mRoutesAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, 0);
mRoutesList.setAdapter(mRoutesAdapter);
refreshUi();
}
@Override
protected void onDestroy() {
mMediaRouter.removeCallback(mMediaRouterCallback);
super.onDestroy();
}
private void refreshRoutes(){
mRoutesAdapter.clear();
MediaRouter.RouteInfo selectedRoute = mMediaRouter.getSelectedRoute();
List<MediaRouter.RouteInfo> routes = mMediaRouter.getRoutes();
for (MediaRouter.RouteInfo rout : routes){
if (rout == selectedRoute)
mRoutesAdapter.add(rout.getName() + " [selected]");
else
mRoutesAdapter.add(rout.getName());
}
mRoutesAdapter.notifyDataSetChanged();
}
Можем ли мы увидеть какой-либо код, пожалуйста. –
см. Обновление – Denisigo
@Iocrizak Итак, вы делаете всю работу над MediaRouter в «Деятельности»? Сделайте это на переднем плане «Сервис», и я предполагаю, что все ваши проблемы исчезнут ... –