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

Flutter Method Channel中eSIM EUICC原生代码执行异常排查求助

Flutter集成原生eSIM功能时BroadcastReceiver初始化异常退出问题排查

问题描述

我采用Flutter作为UI层,通过原生Java调用EUICC API实现eSIM功能。调试发现代码执行到new BroadcastReceiver()行时直接退出,跳至代码块末尾并输出日志"I am downloading",无异常或崩溃提示,最后输出的日志为"stt3"。已知该代码在纯原生Android项目中可正常运行,且已通过相同的Method Channel成功完成eSIM兼容性检测与电池电量获取功能。

相关代码

@RequiresApi(api = Build.VERSION_CODES.P)
private void downloadSubscription(){
//        Context context = getApplicationContext();
        Log.d("init", "ASKJDGAKJHSDHFGKJASF");
        EuiccManager mgr = (EuiccManager) context.getSystemService(Context.EUICC_SERVICE);
        Log.d("stt2", "ASKJDGAKJHSDHFGKJASF");
        // Register receiver.
        try {
            Log.d("stt3", "stt3");
            BroadcastReceiver receiver =
                    new BroadcastReceiver() {

                        @Override
                        public void onReceive(Context context, Intent intent) {
                            Log.d("stt4", "stt4");

                            if (!ACTION_DOWNLOAD_SUBSCRIPTION.equals(intent.getAction())) {
                                return;
                            }
                            Intent resultIntent = new Intent();
                            int resultCode = getResultCode();
                            Log.d("result code", "result code" + resultCode);
                            int detailedCode = intent.getIntExtra(
                                    EuiccManager.EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE,
                                    0 /* defaultValue*/);

                            // If the result code is a resolvable error, call startResolutionActivity
                            if (resultCode == EuiccManager.EMBEDDED_SUBSCRIPTION_RESULT_RESOLVABLE_ERROR) {
                                PendingIntent callbackIntent = PendingIntent.getBroadcast(
                                        context , 0 /* requestCode */, intent,
                                        PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
                                try {
                                    mgr.startResolutionActivity(
                                            activity,
                                            0 /* requestCode */,
                                            intent,
                                            callbackIntent);
                                } catch (Exception e) {

                                    throw new RuntimeException(e);
                                }
                            }

                            resultIntent = intent;
                            Log.d("HALO result code", "result code is " + resultCode);
                        }

                    };
            context.registerReceiver(receiver,
                    new IntentFilter(ACTION_DOWNLOAD_SUBSCRIPTION),
                    LPA_DECLARED_PERMISSION, null /* broadcastPermission*/);
                    // Download subscription asynchronously.
        Log.d("I am downloading ", "I am downloading");
        DownloadableSubscription sub = DownloadableSubscription
                .forActivationCode("2378462378wjgdjghiw" /* encodedActivationCode*/);
        Intent intent = new Intent(ACTION_DOWNLOAD_SUBSCRIPTION).setPackage(context.getPackageName());
        PendingIntent callbackIntent = PendingIntent.getBroadcast(
                context, 0 /* requestCode */, intent,
                PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
        mgr.downloadSubscription(sub, true /* switchAfterDownload */,
                callbackIntent);

        } catch (Exception e){
            Log.d("lblblblblb", "lblblblblb I AM EXCEPTION " + e);
            throw new RuntimeException(e);
        }


    }

可能的问题及解决方案

  • 匿名内部类的引用持有问题:Flutter插件的生命周期与原生组件不同,匿名BroadcastReceiver持有外部类引用可能导致上下文状态异常,触发隐式异常(未进入自定义catch块)。建议将BroadcastReceiver改为静态内部类,显式传入Context和EuiccManager实例,避免持有外部类引用。
  • 权限声明差异:检查Flutter项目的AndroidManifest.xml,确认LPA_DECLARED_PERMISSION对应的权限(如com.android.euicc.permission.EUICC_PRIVILEGED)是否正确声明,且权限的保护级别、声明位置与纯原生项目一致。
  • PendingIntent FLAG兼容性:PendingIntent.FLAG_MUTABLE是Android 12(API 31)新增的FLAG,若测试设备系统版本低于31,会导致初始化失败。可根据系统版本动态选择FLAG:API 31及以上用FLAG_MUTABLE,以下用FLAG_UPDATE_CURRENT,或尝试替换为FLAG_IMMUTABLE(无需修改Intent时)。
  • 线程限制问题:Flutter Method Channel回调默认在主线程,但部分设备或场景下,BroadcastReceiver的初始化可能要求严格在主线程执行。可将BroadcastReceiver的初始化及注册代码包裹在activity.runOnUiThread()中执行。
  • 上下文有效性问题:当前使用的context可能是Flutter插件的ApplicationContext,而BroadcastReceiver注册可能需要Activity上下文。尝试替换为Flutter插件绑定的Activity上下文(如flutterPluginBinding.getActivity())进行Receiver注册。

内容的提问来源于stack exchange,提问作者Abdullah Rashed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 21:55:59