首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >GetTokenTask接收空令牌,请检查HmsMessageService.onNewToken接收结果

GetTokenTask接收空令牌,请检查HmsMessageService.onNewToken接收结果
EN

Stack Overflow用户
提问于 2022-03-30 17:19:30
回答 3查看 477关注 0票数 0

我在华为AppGallery上发布的文字游戏使用的是帐户和推送工具包:

代码语言:javascript
运行
复制
implementation 'com.huawei.hms:hwid:6.4.0.300'
implementation 'com.huawei.hms:push:6.3.0.302'

帐户工具包工作良好,我可以获得开放的id和显示名称的电话用户。

这意味着,- SHA-256证书指纹被正确地配置为,并且不会引起下面描述的Push Kit的问题。

问题:推令牌不能在EMUI9.1手机上获得(见最下面的屏幕截图)。

AndroidManifest.xml:

代码语言:javascript
运行
复制
<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:

代码语言:javascript
运行
复制
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);
    }
}

我的自定义应用程序类:

代码语言:javascript
运行
复制
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);
        }
    });
}

当我在我的华为和LX1手机上调试应用程序时,我在日志中看到:

代码语言:javascript
运行
复制
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()需要一些时间,然后返回一个空令牌(这对于EMUI9.x是预期的)
  • 但是,HmsService方法onNewToken()从未被调用(这是不确定的)

我已经尝试了很多方法来解决我的问题-

  • 尝试将以下元数据添加到AndroidManifest.xml中:
  • 尝试在onCreate中手动获取AAID (获得AAID有效,但令牌仍未交付): HmsInstanceId.getInstance(上下文).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

  • 尝试在HmsService中导出AndroidManifest.xml (根据@shirley!):
  • 尝试在public void onNewToken(String token, Bundle bundle)中重写HmsService.java

我的EMUI 9.1手机是最新的,我位于德国:

更新:

我已经准备好了Github的一个简单测试用例,在那里推送令牌可以很好地传递给onNewToken()方法:

在将onCreate()添加到两个自定义HmsMessageService类后,我注意到在测试应用程序中调用了该方法,但在我的实际应用程序中没有调用该方法。

不幸的是我还没找到原因..。这里是合并的AndroidManifest.xml的屏幕截图:

我尝试通过在我的自定义应用程序类的onCreate()方法中运行以下行来启动服务:

代码语言:javascript
运行
复制
startService(new Intent(this, de.afarber.HmsService.class));

行没有失败,我可以看到正在运行HmsServiceHmsService方法。但是,仍然没有调用onNewToken()方法。我想知道在“手动”启动服务后,HMS代码中是否需要额外的注册。

更新2:

在重新检查所有设置之后,我注意到,我没有在AppGallery连接中启用华为Push Kit

在启用该设置之后,我可以在我的华为手机上接收推送令牌。

在自动更新之后,我甚至在一部非华为手机上收到了推送令牌: Moto。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-03-31 12:39:06

我们正在调查你的问题。你能帮我确认:

  1. 你用第三推平台吗?
  2. 有多少类扩展了HmsMessageService?

不要配置以下项目: android:permission="${applicationId}.permission.PROCESS_PUSH_MSG“android:process=":HmsMessageService”

在以上确认后,您可以将更多日志分享给我。

票数 1
EN

Stack Overflow用户

发布于 2022-04-01 03:00:50

您可以使用以下命令收集日志:"adb logcat -v time > D:\hwpush.log“。此外,您还可以在文件管理器中搜索"push.log“文件,并在这里共享它: wwwjamescom@sina.com。

票数 1
EN

Stack Overflow用户

发布于 2022-04-05 16:31:42

这是一张快速核对单

确保为您的应用程序启用了推送工具包

确保正确的agconnect-services.json复制到app目录。如果你有一个以上的副本

您可以使用Push kit控制台测试向应用程序发送通知以验证您的设置是否正确。

您可以使用自动初始化来测试是否可以接收推送令牌。

这里是指向文档https://developer.huawei.com/consumer/en/doc/development/HMSCore-Guides/android-client-dev-0000001050042041#section13546121751811的链接

下面是我的代码片段,它很好地接收了令牌。

在MainActivity中

代码语言:javascript
运行
复制
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);
        }
    }
}

在响应HMS消息服务的类中。

代码语言:javascript
运行
复制
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();
}

如果您仍然有接收消息的问题,请尝试一个示例代码并从

AGC.developer.huawei.com/consumer/en/doc/development/…

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71681506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档