GetTokenTask 收到空令牌,请检查 HmsMessageService.onNewToken 接收结果
GetTokenTask receive a empty token, please check HmsMessageService.onNewToken receive result
我在 Huawei AppGallery 上发布的文字游戏使用了帐户和推送工具包:
implementation 'com.huawei.hms:hwid:6.4.0.300'
implementation 'com.huawei.hms:push:6.3.0.302'
Account Kit 运行良好,我能够获取 phone 用户的开放 ID 和显示名称。
这意味着,SHA-256 证书指纹配置正确,不会导致下述推送套件出现问题。
问题:推送令牌在EMUI 9.1上无法获取phone(见最底部的截图)
AndroidManifest.xml:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<application>
<service
android:name="de.afarber.HmsService"
android:exported="false">
<intent-filter>
<action android:name="com.huawei.push.action.MESSAGING_EVENT" />
</intent-filter>
</service>
</application>
HmsService.java:
public class HmsService extends HmsMessageService {
@Override
public void onNewToken(String token) { // THIS IS NEVER CALLED !!!
super.onNewToken(token);
Log.d(Utils.TAG,"onNewToken token=" + token);
}
}
我的自定义应用程序class:
private final ScheduledExecutorService mExecutor = Executors.newSingleThreadScheduledExecutor();
@Override
public void onCreate(@NonNull Context context) {
HmsMessaging.getInstance(this).setAutoInitEnabled(true);
mExecutor.execute(() -> {
try {
String appId = context.getString(R.string.huawei_app_id); // VALUE IN DEBUGGER: "102776361"
String token = HmsInstanceId.getInstance(context).getToken(appId, "HCM"); // ALWAYS EMPTY
if (!TextUtils.isEmpty(token)) {
// this only supposed to work for EMUI 10 or newer
Log.d(Utils.TAG,"getToken token=" + token);
}
} catch (Exception ex) {
Log.w(TAG,"getToken failed", ex);
}
});
}
当我在我的华为 ANE-LX1 phone 上调试应用程序时,我在 logcat 中看到:
I/HMSSDK_HMSPackageManager: <initHmsPackageInfoForMultiService> Succeed to find HMS apk: com.huawei.hwid version: 60400311
...
I/HMSSDK_PendingResultImpl: init uri:push.gettoken
...
I/HMSSDK_HmsClient: post msg api_name:push.gettoken, app_id:102776361|, pkg_name:com.wordsbyfarber.huawei, sdk_version:60400300, session_id:*, transaction_id:102776361ttoken20220330184241694787985, kitSdkVersion:60300301, apiLevel:1
I/HMSSDK_BaseAdapter: In constructor, activityWeakReference is java.lang.ref.WeakReference@343238b, activity is de.afarber.MainActivity@50109d0
I/HMSSDK_BaseAdapter: in baseRequest + uri is :push.gettoken, transactionId is : 102776361ttoken20220330184241694787985
I/HMSSDK_PendingResultImpl: init uri:push.gettoken
I/HMSSDK_PendingResultImpl: setResultCallback
I/HMSSDK_PendingResultImpl: setResult:0
...
I/HMSSDK_BaseAdapter: baseCallBack.onComplete
I/HMSSDK_HmsClient: receive msg status_code:0, error_code:0, api_name:push.gettoken, app_id:102776361|, pkg_name:com.wordsbyfarber.huawei, session_id:*, transaction_id:102776361ttoken20220330184241642989857, resolution:null
I/HMSSDK_TaskApiCall: doExecute, uri:push.gettoken, errorCode:0, transactionId:102776361ttoken20220330184241642989857
I/HMSSDK_HmsInstanceId: GetTokenTask receive a empty token, please check HmsMessageService.onNewToken receive result.
I/HMSSDK_HMSPackageManager: Enter getHMSPackageNameForMultiService
I/HMSSDK_RequestManager: removeReqByTransId
I/HMSSDK_BaseAdapter: api is: push.gettoken, resolution: null, status_code: 0
I/HMSSDK_BaseAdapter: baseCallBack.onComplete
I/HMSSDK_HmsClient: receive msg status_code:0, error_code:0, api_name:push.gettoken, app_id:102776361|, pkg_name:com.wordsbyfarber.huawei, session_id:*, transaction_id:102776361ttoken20220330184241694787985, resolution:null
I/HMSSDK_TaskApiCall: doExecute, uri:push.gettoken, errorCode:0, transactionId:102776361ttoken20220330184241694787985
I/HMSSDK_HmsInstanceId: GetTokenTask receive a empty token, please check HmsMessageService.onNewToken receive result.
I/HMSSDK_HMSPackageManager: Enter getHMSPackageNameForMultiService
I/HMSSDK_RequestManager: removeReqByTransId
I/HMSSDK_AutoInit: Push init succeed
通过设置调试器断点并检查 logcat 我的日志,我看到:
- 我调用 getToken() 并将其传递给我的应用程序 ID“102776361”
- getToken() 需要一些时间,然后 returns 一个空令牌(EMUI 预期 9.x)
- 但是 HmsService 方法 onNewToken() 从未被调用(这是不正确的)
我已尝试多种 方法来解决我的问题,但均未成功 -
尝试将以下元数据添加到 AndroidManifest.xml:
尝试在 onCreate 中手动获取 AAID(获取 AAID 正常,但令牌仍未交付):
HmsInstanceId.getInstance(context).getAAID()
.addOnSuccessListener(aaidResult -> Log.d(TAG, "getAAID aaid=" + aaidResult.getId()))
.addOnFailureListener(ex -> Log.w(TAG, "getAAID failed", ex));
尝试向 AndroidManifest.xml 添加更多权限:
android.permission.READ_PHONE_STATE
android.permission.ACCESS_NETWORK_STATE
android.permission.ACCESS_WIFI_STATE
android.permission.WRITE_EXTERNAL_STORAGE
android.permission.REQUEST_INSTALL_PACKAGES
尝试在 AndroidManifest.xml 中导出 HmsService(根据@shirley 不推荐这样做!):
<service
android:name="de.afarber.HmsService"
android:enabled="true"
android:exported="true"
android:permission="${applicationId}.permission.PROCESS_PUSH_MSG"
android:process=":HmsMessageService">
<intent-filter>
<action android:name="com.huawei.push.action.MESSAGING_EVENT" />
</intent-filter>
</service>
尝试覆盖 HmsService.java
中的 public void onNewToken(String token, Bundle bundle)
我的 EMUI 9.1 phone 是最新的,我位于德国:
更新:
我已经准备好 a simple test case at Github 并且推送令牌被传送到 onNewToken()
方法就好了:
在将 onCreate()
添加到两个自定义 HmsMessageService classes 之后,我注意到该方法在测试应用程序中被调用,但在我的真实应用程序中没有被调用。
不幸的是,我还没有找到原因...这是合并后的屏幕截图 AndroidManifest.xml:
我已尝试通过 运行在我的自定义应用程序 class 的 onCreate() 方法中使用以下行来启动服务 class:
startService(new Intent(this, de.afarber.HmsService.class));
并且该行没有失败,我可以看到 HmsService
的 onCreate()
方法是 运行。但是 onNewToken()
方法仍然没有被调用。我想知道在“手动”启动服务后是否需要在HMS Core Android代码中进行一些额外的注册。
更新 2:
重新检查所有设置后,我注意到,我没有在 AppGallery Connect:
中启用 HUAWEI Push Kit
启用该设置后,我可以在我的华为上接收推送令牌 Phone。
自动更新后,我什至在非华为 phone 上收到推送令牌:Moto G Play。
我们正在检查您的问题。能否帮忙确认一下:
- 你用的是三推平台吗?
- 你有多少个 类 扩展了 HmsMessageService?
不要配置以下项目:
android:permission="${applicationId}.permission.PROCESS_PUSH_MSG"
android:process=":HmsMessageService"
以上确认后,您可以分享更多日志给我。
您可以使用此命令收集日志:“adb logcat -v time > D:\hwpush.log”。
另外,您可以在文件管理器中搜索文件“push.log”,并分享到这里:wwwjamescom@sina.com .
这是一个快速检查清单
确保为您的应用启用了推送工具包
确保将正确的 agconnect-services.json 复制到应用程序目录。如果你有不止一份
您可以使用推送套件控制台测试向您的应用发送通知以验证您的设置是否正确
您可以使用自动初始化来测试您是否可以收到推送令牌。
这是我收到令牌的代码片段。
在 MainActivity
public class MainActivity extends AppCompatActivity implements OSSubscriptionObserver {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setAutoInitEnabled(true);
}
private void setAutoInitEnabled(final boolean isEnable) {
if(isEnable){
// Enable automatic initialization.
HmsMessaging.getInstance(this).setAutoInitEnabled(true);
} else {
// Disable automatic initialization.
HmsMessaging.getInstance(this).setAutoInitEnabled(false);
}
}
}
在class那个响应HMS消息服务
public class MyHMSService extends HmsMessageService {
/\*\*
\* When an app calls the getToken method to apply for a token from the server,
\* if the server does not return the token during current method calling,
\* the server can return the token through this method later.
\* This method callback must be completed in 10 seconds.
\* Otherwise, you need to start a new Job for callback processing.
\*
\* @param token token
\* @param bundle bundle
\*/
@Override
public void onNewToken(String token, Bundle bundle) {
Toast.makeText(getApplicationContext(), "token value is: " + token, Toast.LENGTH_SHORT).show();
}
如果您仍然无法接收消息,请尝试示例代码并从
发送消息
我在 Huawei AppGallery 上发布的文字游戏使用了帐户和推送工具包:
implementation 'com.huawei.hms:hwid:6.4.0.300'
implementation 'com.huawei.hms:push:6.3.0.302'
Account Kit 运行良好,我能够获取 phone 用户的开放 ID 和显示名称。
这意味着,SHA-256 证书指纹配置正确,不会导致下述推送套件出现问题。
问题:推送令牌在EMUI 9.1上无法获取phone(见最底部的截图)
AndroidManifest.xml:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<application>
<service
android:name="de.afarber.HmsService"
android:exported="false">
<intent-filter>
<action android:name="com.huawei.push.action.MESSAGING_EVENT" />
</intent-filter>
</service>
</application>
HmsService.java:
public class HmsService extends HmsMessageService {
@Override
public void onNewToken(String token) { // THIS IS NEVER CALLED !!!
super.onNewToken(token);
Log.d(Utils.TAG,"onNewToken token=" + token);
}
}
我的自定义应用程序class:
private final ScheduledExecutorService mExecutor = Executors.newSingleThreadScheduledExecutor();
@Override
public void onCreate(@NonNull Context context) {
HmsMessaging.getInstance(this).setAutoInitEnabled(true);
mExecutor.execute(() -> {
try {
String appId = context.getString(R.string.huawei_app_id); // VALUE IN DEBUGGER: "102776361"
String token = HmsInstanceId.getInstance(context).getToken(appId, "HCM"); // ALWAYS EMPTY
if (!TextUtils.isEmpty(token)) {
// this only supposed to work for EMUI 10 or newer
Log.d(Utils.TAG,"getToken token=" + token);
}
} catch (Exception ex) {
Log.w(TAG,"getToken failed", ex);
}
});
}
当我在我的华为 ANE-LX1 phone 上调试应用程序时,我在 logcat 中看到:
I/HMSSDK_HMSPackageManager: <initHmsPackageInfoForMultiService> Succeed to find HMS apk: com.huawei.hwid version: 60400311
...
I/HMSSDK_PendingResultImpl: init uri:push.gettoken
...
I/HMSSDK_HmsClient: post msg api_name:push.gettoken, app_id:102776361|, pkg_name:com.wordsbyfarber.huawei, sdk_version:60400300, session_id:*, transaction_id:102776361ttoken20220330184241694787985, kitSdkVersion:60300301, apiLevel:1
I/HMSSDK_BaseAdapter: In constructor, activityWeakReference is java.lang.ref.WeakReference@343238b, activity is de.afarber.MainActivity@50109d0
I/HMSSDK_BaseAdapter: in baseRequest + uri is :push.gettoken, transactionId is : 102776361ttoken20220330184241694787985
I/HMSSDK_PendingResultImpl: init uri:push.gettoken
I/HMSSDK_PendingResultImpl: setResultCallback
I/HMSSDK_PendingResultImpl: setResult:0
...
I/HMSSDK_BaseAdapter: baseCallBack.onComplete
I/HMSSDK_HmsClient: receive msg status_code:0, error_code:0, api_name:push.gettoken, app_id:102776361|, pkg_name:com.wordsbyfarber.huawei, session_id:*, transaction_id:102776361ttoken20220330184241642989857, resolution:null
I/HMSSDK_TaskApiCall: doExecute, uri:push.gettoken, errorCode:0, transactionId:102776361ttoken20220330184241642989857
I/HMSSDK_HmsInstanceId: GetTokenTask receive a empty token, please check HmsMessageService.onNewToken receive result.
I/HMSSDK_HMSPackageManager: Enter getHMSPackageNameForMultiService
I/HMSSDK_RequestManager: removeReqByTransId
I/HMSSDK_BaseAdapter: api is: push.gettoken, resolution: null, status_code: 0
I/HMSSDK_BaseAdapter: baseCallBack.onComplete
I/HMSSDK_HmsClient: receive msg status_code:0, error_code:0, api_name:push.gettoken, app_id:102776361|, pkg_name:com.wordsbyfarber.huawei, session_id:*, transaction_id:102776361ttoken20220330184241694787985, resolution:null
I/HMSSDK_TaskApiCall: doExecute, uri:push.gettoken, errorCode:0, transactionId:102776361ttoken20220330184241694787985
I/HMSSDK_HmsInstanceId: GetTokenTask receive a empty token, please check HmsMessageService.onNewToken receive result.
I/HMSSDK_HMSPackageManager: Enter getHMSPackageNameForMultiService
I/HMSSDK_RequestManager: removeReqByTransId
I/HMSSDK_AutoInit: Push init succeed
通过设置调试器断点并检查 logcat 我的日志,我看到:
- 我调用 getToken() 并将其传递给我的应用程序 ID“102776361”
- getToken() 需要一些时间,然后 returns 一个空令牌(EMUI 预期 9.x)
- 但是 HmsService 方法 onNewToken() 从未被调用(这是不正确的)
我已尝试多种 方法来解决我的问题,但均未成功 -
尝试将以下元数据添加到 AndroidManifest.xml:
尝试在 onCreate 中手动获取 AAID(获取 AAID 正常,但令牌仍未交付):
HmsInstanceId.getInstance(context).getAAID() .addOnSuccessListener(aaidResult -> Log.d(TAG, "getAAID aaid=" + aaidResult.getId())) .addOnFailureListener(ex -> Log.w(TAG, "getAAID failed", ex));
尝试向 AndroidManifest.xml 添加更多权限:
android.permission.READ_PHONE_STATE android.permission.ACCESS_NETWORK_STATE android.permission.ACCESS_WIFI_STATE android.permission.WRITE_EXTERNAL_STORAGE android.permission.REQUEST_INSTALL_PACKAGES
尝试在 AndroidManifest.xml 中导出 HmsService(根据@shirley 不推荐这样做!):
<service android:name="de.afarber.HmsService" android:enabled="true" android:exported="true" android:permission="${applicationId}.permission.PROCESS_PUSH_MSG" android:process=":HmsMessageService"> <intent-filter> <action android:name="com.huawei.push.action.MESSAGING_EVENT" /> </intent-filter> </service>
尝试覆盖 HmsService.java
中的public void onNewToken(String token, Bundle bundle)
我的 EMUI 9.1 phone 是最新的,我位于德国:
更新:
我已经准备好 a simple test case at Github 并且推送令牌被传送到 onNewToken()
方法就好了:
在将 onCreate()
添加到两个自定义 HmsMessageService classes 之后,我注意到该方法在测试应用程序中被调用,但在我的真实应用程序中没有被调用。
不幸的是,我还没有找到原因...这是合并后的屏幕截图 AndroidManifest.xml:
我已尝试通过 运行在我的自定义应用程序 class 的 onCreate() 方法中使用以下行来启动服务 class:
startService(new Intent(this, de.afarber.HmsService.class));
并且该行没有失败,我可以看到 HmsService
的 onCreate()
方法是 运行。但是 onNewToken()
方法仍然没有被调用。我想知道在“手动”启动服务后是否需要在HMS Core Android代码中进行一些额外的注册。
更新 2:
重新检查所有设置后,我注意到,我没有在 AppGallery Connect:
中启用 HUAWEI Push Kit启用该设置后,我可以在我的华为上接收推送令牌 Phone。
自动更新后,我什至在非华为 phone 上收到推送令牌:Moto G Play。
我们正在检查您的问题。能否帮忙确认一下:
- 你用的是三推平台吗?
- 你有多少个 类 扩展了 HmsMessageService?
不要配置以下项目: android:permission="${applicationId}.permission.PROCESS_PUSH_MSG" android:process=":HmsMessageService"
以上确认后,您可以分享更多日志给我。
您可以使用此命令收集日志:“adb logcat -v time > D:\hwpush.log”。 另外,您可以在文件管理器中搜索文件“push.log”,并分享到这里:wwwjamescom@sina.com .
这是一个快速检查清单
确保为您的应用启用了推送工具包
确保将正确的 agconnect-services.json 复制到应用程序目录。如果你有不止一份
您可以使用推送套件控制台测试向您的应用发送通知以验证您的设置是否正确
您可以使用自动初始化来测试您是否可以收到推送令牌。
这是我收到令牌的代码片段。
在 MainActivity
public class MainActivity extends AppCompatActivity implements OSSubscriptionObserver {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setAutoInitEnabled(true);
}
private void setAutoInitEnabled(final boolean isEnable) {
if(isEnable){
// Enable automatic initialization.
HmsMessaging.getInstance(this).setAutoInitEnabled(true);
} else {
// Disable automatic initialization.
HmsMessaging.getInstance(this).setAutoInitEnabled(false);
}
}
}
在class那个响应HMS消息服务
public class MyHMSService extends HmsMessageService {
/\*\*
\* When an app calls the getToken method to apply for a token from the server,
\* if the server does not return the token during current method calling,
\* the server can return the token through this method later.
\* This method callback must be completed in 10 seconds.
\* Otherwise, you need to start a new Job for callback processing.
\*
\* @param token token
\* @param bundle bundle
\*/
@Override
public void onNewToken(String token, Bundle bundle) {
Toast.makeText(getApplicationContext(), "token value is: " + token, Toast.LENGTH_SHORT).show();
}
如果您仍然无法接收消息,请尝试示例代码并从
发送消息