我在华为AppGallery上发布的文字游戏使用的是帐户和推送工具包:
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:
<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);
}
}
我的自定义应用程序类:
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手机上调试应用程序时,我在日志中看到:
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,我看到:
我已经尝试了很多方法来解决我的问题-
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
public void onNewToken(String token, Bundle bundle)
中重写HmsService.java我的EMUI 9.1手机是最新的,我位于德国:
更新:
我已经准备好了Github的一个简单测试用例,在那里推送令牌可以很好地传递给onNewToken()
方法:
在将onCreate()
添加到两个自定义HmsMessageService类后,我注意到在测试应用程序中调用了该方法,但在我的实际应用程序中没有调用该方法。
不幸的是我还没找到原因..。这里是合并的AndroidManifest.xml的屏幕截图:
我尝试通过在我的自定义应用程序类的onCreate()方法中运行以下行来启动服务:
startService(new Intent(this, de.afarber.HmsService.class));
行没有失败,我可以看到正在运行HmsService
的HmsService
方法。但是,仍然没有调用onNewToken()
方法。我想知道在“手动”启动服务后,HMS代码中是否需要额外的注册。
更新2:
在重新检查所有设置之后,我注意到,我没有在AppGallery连接中启用华为Push Kit
在启用该设置之后,我可以在我的华为手机上接收推送令牌。
在自动更新之后,我甚至在一部非华为手机上收到了推送令牌: Moto。
发布于 2022-03-31 12:39:06
我们正在调查你的问题。你能帮我确认:
不要配置以下项目: android:permission="${applicationId}.permission.PROCESS_PUSH_MSG“android:process=":HmsMessageService”
在以上确认后,您可以将更多日志分享给我。
发布于 2022-04-01 03:00:50
您可以使用以下命令收集日志:"adb logcat -v time > D:\hwpush.log“。此外,您还可以在文件管理器中搜索"push.log“文件,并在这里共享它: wwwjamescom@sina.com。
发布于 2022-04-05 16:31:42
这是一张快速核对单
确保为您的应用程序启用了推送工具包
确保正确的agconnect-services.json复制到app目录。如果你有一个以上的副本
您可以使用Push kit控制台测试向应用程序发送通知以验证您的设置是否正确。
您可以使用自动初始化来测试是否可以接收推送令牌。
下面是我的代码片段,它很好地接收了令牌。
在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);
}
}
}
在响应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();
}
如果您仍然有接收消息的问题,请尝试一个示例代码并从
https://stackoverflow.com/questions/71681506
复制相似问题