前言

App集成三方推送是很常见的快速开发方案,push大多使用umeng或者jpush 二选一,继承工程中即使按照官方文档还是会有这样那样的问题。
这篇blog,主要是记录自己项目中继承umeng问题并分享经验

问题?

继承最新umeng push,出现deviceToken 无法获取 code=-11.

Android umeng推送无法获取DeviceToken_推送

自检方式1

首先,根据提示进入官方文档,检查三个步骤

1.UMENG_APPKEY,UMENG_MESSAGE_SECRET ,是否匹配
2.解压apk文件查看的so文件是否包含,如果是 com.umeng.message_v3.0.5.jar.
3.可以下载全平台so文件导入推送module。

以上三点,前两点不容易出问题,都是copy过来的,第三点需要着重检查生成apk后x86,armeabi,xxxx.几个文件夹是否包含相同的so文件。

Android umeng推送无法获取DeviceToken_推送_02

如图,通过studio可以直接查看的apk包lib文件下so库中包含是否相同。(这里用的推送不是最新版本的push 4.2).

遇到问题:

1.引入新版本push无法获取 device_token
用最简单的对比法,和umeng 官方提供的demo进行对比看哪里不一样。

1.注意检查点

Android umeng推送无法获取DeviceToken_android_03

上图清单文件中有两处需要更改为自己的包名

<provider
android:name="com.umeng.message.provider.MessageProvider"
android:authorities="自己包名.umeng.message"
android:exported="false">
<grant-uri-permission android:pathPattern=".*" />
<receiver
android:name="com.taobao.agoo.AgooCommondReceiver"
android:exported="true">
<intent-filter>
<action android:name="自己包名.intent.action.COMMAND" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.PACKAGE_REMOVED" />
<data android:scheme="package" />
</intent-filter>
</receiver>
【非必须】

当然,如果用 ${applicationId} 这种方式进行去app包名,记得在Application中初始化umeng 推送的时候进行重新赋值,以免获取不到主module包名

// 首先重新设置包名
mPushAgent.setResourcePackageName(R.class.getPackage().getName());

自检方式2

如果demo可以拿到DeviceToken(demo应该是可以拿到),自己app无法拿到。

1.将demo的包名替换为自己app包名,将demo UMENG_APPKEY,UMENG_MESSAGE_SECRET,替换自己a
pp的key,和message_secret,是否能拿到device_token.
2.排除公司将umeng外链禁用问题,为什么这么说?umeng走阿里云,有些域名带taobao字样。

:  enableService,comptName=ComponentInfo{cn.ftoutiao.account.android/com.taobao.accs.ChannelService}

有可能被禁用。

3.方式三上面检查过了,还是无法获取,deviceToken,需要查看umeng push版本号是否有冲突。版本之间是否有不兼容问题。看系统log,是否有相关log。()

说了以上这些检查点,基本上可以覆盖一些错误的配置问题。

我自己app,找问题找了两个版本。最后用老版本的推送。可以获取devicetoken。

问题是so导致:

添加了配置在 build.gradle

ndk {
abiFilter "armeabi"
abiFilter "x86"
}

3.0.5 version 只包含这两个so文件夹。

注意。建议清单文件中写上去,即使你用代码方式进行了注册

<meta-data
android:name="UMENG_APPKEY"
android:value="xxxx" />

<meta-data
android:name="UMENG_MESSAGE_SECRET"
android:value="xxx" />

代码方式注册 umeng push

UMConfigure.init(this, BuildConfig.UMENT_KEY, market, UMConfigure.DEVICE_TYPE_PHONE, BuildConfig.UMENT_MSG);

### BuildConfig.UMENT_KEY,BuildConfig.UMENT_MSG 在
build.gradle中进行了声明,所以这里可以这样调用
debug {
buildConfigField "boolean", "MAIN_DEBUG", "true" // 调试总开关
buildConfigField "String", "UMENT_KEY", "\"5a9134c28f4a9d236100029a\""
buildConfigField "String", "UMENT_MSG", "\"6e65abef92663cadaa526638239fe52b\""
minifyEnabled false //混淆
zipAlignEnabled false //zipalign压缩对齐
shrinkResources false //移除无用的资源
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.releaseConfig //debug签名配置
}

有问题可以发私信