You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Flutter应用中编程选择切换Android设备的桌面launcher应用

Flutter 安卓端指定默认启动器实现方案

注意:Android 10(API 29)及以上系统为了安全限制,禁止第三方应用直接静默修改默认启动器,仅能通过唤起系统自带的默认应用选择弹窗,引导用户手动确认完成设置,无合法绕过方案。

实现逻辑

  • Flutter 层通过 MethodChannel 调用安卓原生层 API
  • 原生层构造匹配桌面启动器的 Intent,唤起系统选择界面,可预选指定包名的启动器应用
  • 用户在弹窗中确认后即可完成默认启动器的设置

步骤1:Flutter 层实现

先声明方法通道,调用原生能力:

import 'package:flutter/services.dart';

// 自定义通道名,需和安卓原生层保持一致
const _channel = MethodChannel('com.your_app/custom_channel');

// 调用该方法传入目标启动器的包名,唤起设置流程
Future<void> selectDefaultLauncher(String targetLauncherPackage) async {
  try {
    await _channel.invokeMethod(
      'setDefaultLauncher',
      {'target_package': targetLauncherPackage},
    );
  } on PlatformException catch (e) {
    print('设置失败:${e.message}');
  }
}

步骤2:安卓原生层实现

打开安卓项目下的 MainActivity,添加方法通道的处理逻辑:

import android.content.Intent
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel

class MainActivity : FlutterActivity() {
    // 和Flutter层保持一致的通道名
    private val CHANNEL = "com.your_app/custom_channel"

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
            if (call.method == "setDefaultLauncher") {
                val targetPkg = call.argument<String>("target_package")
                if (targetPkg.isNullOrEmpty()) {
                    result.error("PARAM_ERROR", "目标启动器包名不能为空", null)
                    return@setMethodCallHandler
                }
                // 唤起系统默认启动器选择弹窗
                val homeIntent = Intent(Intent.ACTION_MAIN).apply {
                    addCategory(Intent.CATEGORY_HOME)
                    addCategory(Intent.CATEGORY_DEFAULT)
                    `package` = targetPkg
                }
                startActivity(Intent.createChooser(homeIntent, "设置默认桌面"))
                result.success("SUCCESS")
            } else {
                result.notImplemented()
            }
        }
    }
}

补充说明

  • 若需要展示可选的启动器列表供用户选择,可以在原生层新增方法查询所有符合桌面启动器规则的应用信息(包名、名称、图标),回传给 Flutter 层渲染列表即可
  • Android 9(API 28)及以下版本可申请 android.permission.SET_PREFERRED_APPLICATIONS 权限,通过 PackageManager 直接修改默认启动器,无需用户手动确认,但该权限在高版本系统已被废弃
  • 设置完成后可新增原生查询逻辑,获取当前系统默认启动器的包名,校验是否设置成功

内容的提问来源于stack exchange,提问作者Sakibul Haque

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 10:09:08