已注释推送相关代码仍出现GCM配置错误弹窗,如何消除该弹窗并定位其来源?
首先,这个弹窗的触发来源很明确:你的应用里还残留着尝试调用GCM推送注册的代码逻辑,哪怕你注释了Manifest、JS和HTML里的相关部分,Native Android代码(或是集成的第三方库)仍在后台执行GCM注册请求,请求失败后就触发了这个错误提示框。
下面是一步步排查和解决的方案:
排查Native Android代码中的注册逻辑
检查你的主Activity、自定义Application类(如果有),还有任何后台服务类里,有没有以下旧GCM注册相关的代码:// 旧GCM注册的典型代码 GCMRegistrar.checkDevice(this); GCMRegistrar.checkManifest(this); String regId = GCMRegistrar.getRegistrationId(this); if (regId.equals("")) { GCMRegistrar.register(this, YOUR_SENDER_ID); }或者是使用
GoogleCloudMessaging类的注册调用:GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this); String regId = gcm.register(YOUR_SENDER_ID);找到这些代码后直接删除或注释掉,它们就是触发注册请求的源头。
清理Manifest中遗漏的GCM配置
除了GCMIntentService,还要检查并移除这些相关项:- GCM相关权限:
com.google.android.c2dm.permission.RECEIVE、android.permission.GET_ACCOUNTS、com.your.app.package.permission.C2D_MESSAGE - GCM广播接收器:
<receiver>标签里的com.google.android.gcm.GCMBroadcastReceiver
这些配置残留可能会让某些代码认为GCM功能仍需启用。
- GCM相关权限:
移除GCM相关的编译依赖
打开Module级的build.gradle文件,查找并删除GCM相关的依赖,比如:implementation 'com.google.android.gms:play-services-gcm:xx.x.x'依赖没移除的话,即使代码里没调用,某些初始化逻辑也可能自动触发。
全局搜索错误文本定位弹窗代码
如果上面的步骤还没解决,直接在整个项目里全局搜索错误提示的关键词Failed registering for push notifications,找到弹出这个AlertDialog的代码位置,把这段弹窗代码直接删掉就行。比如可能是在注册失败的回调方法里写了:new AlertDialog.Builder(context) .setMessage("Failed registering for push notifications...") .setPositiveButton("Ok", null) .show();找到这段代码移除,弹窗就不会再出现了。
清理缓存并重新编译
最后记得执行Android Studio的Clean Project和Rebuild Project,然后卸载设备上的旧版本应用,重新安装新版本,确保所有修改都生效。
内容的提问来源于stack exchange,提问作者SudiptoS

