#flutter #dart
#флаттер #dart
Вопрос:
Я хочу знать, является ли используемое устройство телевизором или нет..Я использую пакет flutter_device_type, но он обнаруживает только планшет и рассматривает любое другое устройство как телефон
Ответ №1:
Вы можете использовать пакет device_info_plus для обнаружения Android TV.
Класс AndroidDeviceInfo содержит список всех функций системы, как описано в Android PackageManager
Для обнаружения телевизора вы можете использовать, например:
DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo;
bool isTV = androidInfo.systemFeatures.contains('android.software.leanback')
Комментарии:
1. это работает, большое спасибо за этот ответ. IMO ShortestSide от MediaQuery даст тот же результат, если устройство является планшетом или Smart TV.
2. Это не работает для Amazon Fire TV stick.
android.software.leanback
следует использовать вместо
Ответ №2:
По умолчанию flutter определяет устройство на основе его минимального размера (экраны больше минимальной ширины, рассматриваемой как планшет), что-то вроде этого кода:
String getDeviceType() {
final data = MediaQueryData.fromWindow(WidgetsBinding.instance.window);
return data.size.shortestSide < 600 ? 'phone' :'tablet';
}
В другой руке с Java / Kotlin и на основе этой документации вы можете определить, является ли устройство Android Tv с помощью этого кода:
val uiModeManager = getSystemService(UI_MODE_SERVICE) as UiModeManager
if (uiModeManager.currentModeType == Configuration.UI_MODE_TYPE_TELEVISION) {
Log.d(TAG, "Running on a TV Device")
} else {
Log.d(TAG, "Running on a non-TV Device")
}
Таким образом, правильным вариантом было бы использовать собственный код и подключить его к flutter с помощью платформенных каналов
Ответ №3:
Для обнаружения Android TV вы можете определить наличие leanback Launcher без дополнительных пакетов.
Сначала измените androidappsrcmainkotlinMainActivity.kt
вот так:
package [your package here]
import androidx.annotation.NonNull;
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugins.GeneratedPluginRegistrant
import io.flutter.plugin.common.MethodChannel
class MainActivity: FlutterActivity() {
private val CHANNEL = "android.tv"
override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine);
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler {
call, result ->
if(!isLeanbackLauncherDevice()) {
result.success(false)
} else {
result.success(true)
}
}
}
fun isLeanbackLauncherDevice(): Boolean {
val pm = this.getPackageManager()
if (pm.hasSystemFeature("PackageManager.FEATURE_LEANBACK")) {
return true
} else {
return false
}
}
}
Затем вызовите его из своего приложения следующим образом:
import 'package:flutter/services.dart';
const platform = MethodChannel('android.tv');
Future<bool> isAndroidTv() async {
final bool isTv = await platform.invokeMethod('isLeanbackLauncherDevice');
return isTv;
}