Андроид. Как определить, является ли устройство планшетным или складным?

Мне нужно определить, является ли устройство планшетом, складным или телефоном. Я использую следующий код для определения планшета:

      public boolean isTablet(Context context) {
        boolean xlarge = ((context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == 4);
        boolean large = ((context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE);
        return (xlarge || large);
    }

Я тестировал этот код на нескольких устройствах, он работал корректно. Но я все же не уверен, что это стопроцентно рабочий вариант.

Но у меня другая проблема. Я не нашел способа определить складные устройства.

Помогите пожалуйста, можно ли определить складной аппарат или нет?

Возможно, кто-то уже нашел работающее решение и может подсказать, как его можно реализовать.

PS Мне нужна только информация об устройстве(телефон,планшет,раскладушка),чтобы потом отправить эти данные в метрику

1 ответ

Чтобы ваше приложение знало о сгибах, используйте Jetpack Window Manager — библиотеку, которая предоставляет общую поверхность API для различных функций окна, таких как сгибы или петли. Когда ваше приложение поддерживает сгибы, содержимое окна можно адаптировать, чтобы избежать сгибов и шарниров или использовать их в своих интересах и использовать их в качестве естественных разделителей.

Теперь он поддерживает складные телефоны через WindowInfoTracker и FoldingFeature. WindowMetricsCalculator, чтобы помочь вычислить текущую WindowMetrics.

Добавьте эту зависимость implementation "androidx.window:window:1.0.0"

      class DisplayFeaturesActivity : AppCompatActivity() {

    private lateinit var binding: ActivityDisplayFeaturesBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = ActivityDisplayFeaturesBinding.inflate(layoutInflater)
        setContentView(binding.root)

        lifecycleScope.launch(Dispatchers.Main) {
            lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
                WindowInfoTracker.getOrCreate(this@DisplayFeaturesActivity)
                    .windowLayoutInfo(this@DisplayFeaturesActivity)
                    .collect { newLayoutInfo ->
                        // Use newLayoutInfo to update the layout.
                    }
            }
        }
    }
}

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