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
相关产品推荐
相关产品推荐

