Ошибка «Устройство не поддерживает режим «картинка в картинке»» вход в режим PIP (картинка в картинке) на Samsung Mobile

#android #samsung-mobile #android-picture-in-picture

#Android #samsung-мобильный #android-картинка в картинке

Вопрос:

Я использую режим PIP на телефоне Android O (различные версии Samsung), и он работает нормально. Однако, если я включу режим специальных возможностей, я получу

 java.lang.IllegalStateException·enterPictureInPictureMode: Device doesn't support picture-in-picture mode
  

при входе в режим PIP. Перед вводом PIP я проверяю PackageManager.FEATURE_PICTURE_IN_PICTURE и, если AppOpsManager.OPSTR_PICTURE_IN_PICTURE включен (оба возвращают true). Сообщение «Устройство не поддерживает режим «картинка в картинке»», очевидно, вводит в заблуждение и неверно, но есть ли какой-либо способ проверить, доступен ли PIP в этом случае?
Обратите внимание, что, похоже, это проблема только Samsung, поскольку я пробовал различные телефоны Samsung и планшеты (S8, Note 8, Tab S3, Tab S4), и все они вышли из строя. У телефона Google Pixel 3 этой проблемы не было.

Комментарии:

1. Привет, смогли ли вы выяснить основную причину и получить какое-либо решение?

2. Нет, к сожалению, все то же самое.

3. Пожалуйста, смотрите ниже мое решение. Есть идеи получше?

Ответ №1:

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

 /**
 * Trying to enter Picture In Picture mode on a Samsung device while an accessibility service
 * that provides spoken feedback would result in an IllegalStateException.
 */

public static boolean isScreenReaderActiveAndTroublesome(Activity activity) {
    final String affectedManufacturer = "samsung";
    final String deviceManufacturer = android.os.Build.MANUFACTURER.toLowerCase();

    if (affectedManufacturer.equals(deviceManufacturer)) {
        final AccessibilityManager am =
                (AccessibilityManager) activity.getSystemService(Context.ACCESSIBILITY_SERVICE);
        final List<AccessibilityServiceInfo> enabledScreenReaderServices =
                am.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_SPOKEN);

        final boolean isScreenReaderServiceActive = !enabledScreenReaderServices.isEmpty();

        if (isScreenReaderServiceActive) {
            Log.e(TAG, "Screen reader is active on this Samsung device, PIP would be disabled");
        }

        return isScreenReaderServiceActive;
    }

    return false;
}
  

Комментарии:

1. Спасибо за ответ. Я думаю, что лучшим решением является установка try / catch вокруг enterPictureInPictureMode в onUserLeaveHint. Он охватывает все возможные случаи, включая конкретный случай Samsung, и если Samsung исправит ошибку, он просто будет работать без внесения каких-либо изменений в код. Однако он по-прежнему не отвечает на главный вопрос о том, как заставить его работать на устройствах Samsung.