MediaRoute и маршрутизация аудио

У меня есть Samsung Galaxy S3 (в настоящее время незащищенный), и у меня иногда возникает проблема, например, если я подключаю наушники для прослушивания FM-радио и вдруг закрываю приложение и отсоединяю наушники, телефон все еще считает, что подключен, так что звуки (динамики и микрофоны) являются маршрутами к разъему для наушников, поэтому, когда я хочу поговорить с кем-то, нет звука.

Я не знаю, хорошо ли я объясню.

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

Это мой код:

public void route(Context context){
        String outputDeviceName, outputDeviceName2;
        try {
            MediaRouter media_route = (MediaRouter)getBaseContext().getSystemService(Context.MEDIA_ROUTER_SERVICE);
            Class mediaRouterClass = Class.forName("android.media.MediaRouter");
            Method getSystemAudioRouteMethod = mediaRouterClass.getMethod("getSystemAudioRoute");
            RouteInfo route_info = (RouteInfo)getSystemAudioRouteMethod.invoke(media_route);

            Class mediaRouterStaticClass = Class.forName("android.media.MediaRouter$Static");
            Field staticField = mediaRouterClass.getDeclaredField("sStatic");

            Field[] array = mediaRouterStaticClass.getDeclaredFields();
            for(Field one: array){
                Log.i("CLASS_FIELD", "" + one.getName().toString());
            }
            Field normalOutputField = mediaRouterStaticClass.getDeclaredField("mSelectedRoute");
            AccessibleObject.setAccessible(new AccessibleObject[]{staticField}, true);
            AccessibleObject.setAccessible(new AccessibleObject[]{normalOutputField}, true);
            Object speakerRoute = normalOutputField.get(staticField.get(null));
            if (speakerRoute != media_route.getSelectedRoute(MediaRouter.ROUTE_TYPE_LIVE_AUDIO)) {
                // Phone, Headphone, HDMI, etc..
                outputDeviceName = "name: " + route_info.getName().toString();
                media_route.selectRoute(MediaRouter.ROUTE_TYPE_LIVE_AUDIO, route_info);
                media_route.
                outputDeviceName2 = "name: " + route_info.getName().toString();
            } else {
                // Audio is routed to A2DP
                outputDeviceName  = "name: A2DP";
                outputDeviceName2 = "name: " + route_info.getName().toString();
            }
            Log.i("outputDeviceName", ""+ outputDeviceName);
            Log.i("outputDeviceName2", ""+ outputDeviceName2);
        } catch (Exception e) {
            e.printStackTrace();
        }
    } 

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

1 ответ

У меня есть только комментарий, но я должен иметь 50 репутацию за комментарий.

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

Я знаю, как направить звук на динамики, когда кнопка / гарнитура подключена к разъему.

AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
am.setSpeakerphoneOn(true);

НО я не знаю, как они направляют звук на динамик при тех же условиях. Я пытался выяснить это на прошлой неделе.

Пока не повезло, если кто-то из вас тем временем нашел решение, пожалуйста, опубликуйте его.

Суть в том, что это возможно, и это приложение доказывает это.

Другие вопросы по тегам