在Flutter上检测设备是手机、平板还是电视

3

我想知道使用的设备是不是电视。我正在使用flutter_device_type包,但它只能检测平板电脑,并将任何其他设备视为手机。

3个回答

4

非常感谢你的回答,这个方法很有效。在我看来,如果设备是平板电脑或智能电视,使用MediaQuery中的ShortestSide属性将得到相同的结果。 - Abdur Rohman
这对亚马逊Fire TV棒不起作用。应该使用android.software.leanback - Tien Do Nam

1
默认情况下,Flutter会根据设备的最小尺寸来检测设备类型(宽度大于最小宽度的屏幕被视为平板电脑),类似于以下代码:
  String getDeviceType() {
    final data = MediaQueryData.fromWindow(WidgetsBinding.instance.window);
    return data.size.shortestSide < 600 ? 'phone' :'tablet';
  }

另一方面,使用Java/Kotlin并基于此文档,您可以使用以下代码检测设备是否为Android电视:
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。


0
要检测 Android TV,您可以检测是否存在 Leanback Launcher 而无需其他包。
首先请修改 `android\app\src\main\kotlin\MainActivity.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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接