android - 将HMS Pushkit和FCM集成到Flutter应用程序中

标签 android flutter firebase-cloud-messaging huawei-mobile-services huawei-developers

我在将此插件 (4.0.4+300) 集成到我现有的 flutter 应用程序中时遇到问题。在这段代码中初始化插件时,我总是收到以下错误:

TokenEventChannel.receiveBroadcastStream()
        .listen(_onTokenEvent, onError: _onTokenError);

在 channel 上激活平台流时抛出以下 MissingPluginException com.huawei.flutter.push/token: MissingPluginException(没有找到方法监听 channel 的实现 com.huawei.flutter.push/token)

I/flutter (7674): 抛出异常时,这是堆栈: I/flutter (7674): #0 MethodChannel._invokeMethod (包:flutter/src/services/platform_channel.dart:154:7) 我/flutter (7674): I/flutter (7674): #1 MethodChannel.invokeMethod (包:flutter/src/services/platform_channel.dart:329:12) 我/flutter (7674):#2 EventChannel.receiveBroadcastStream。 (包:flutter/src/services/platform_channel.dart:519:29) 我/flutter (7674):#3 EventChannel.receiveBroadcastStream。

我已经遵循了这个教程: https://medium.com/huawei-developers/sending-push-notifications-on-flutter-with-huawei-push-kit-plugin-534787862b4d

我的应用程序已经包含 FCM 推送通知服务,所以我不知道这是否会出现问题?我希望在受支持的设备上同时支持 FCM 和 Push Kit。

如果您能帮助解决此问题,我将不胜感激。

Flutter doctor 输出如下: [✓] Flutter( channel 稳定,v1.17.5,在 Mac OS X 10.15.6 19G2021 上,区域设置 en-ZA) • Flutter 版本 1.17.5,位于/Users/user/Developer/flutter • 框架修订8af6b2f038(9周前),2020-06-30 12:53:55 -0700 • 发动机版本 ee76268252 • Dart 版本 2.8.4

[✓] Android 工具链 - 为 Android 设备开发(Android SDK 版本 29.0.3) • Android SDK 位于/Users/user/Library/Android/sdk • 平台 android-30,构建工具 29.0.3 • ANDROID_HOME =/Users/samuel/Library/Android/sdk • Java 二进制文件位于:/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java • Java 版本 OpenJDK 运行时环境(内部版本 1.8.0_212-release-1586-b4-5784211) • 接受所有Android 许可证。

[✓] Xcode - 为 iOS 和 macOS 开发 (Xcode 11.6) • Xcode 位于/Applications/Xcode.app/Contents/Developer • Xcode 11.6,内部版本 11E708 • CocoaPods 版本 1.9.2

[✓] Android Studio(版本 3.6) • Android Studio 位于/Applications/Android Studio.app/Contents • Flutter插件版本45.1.1 • Dart 插件版本 192.8052 • Java 版本 OpenJDK 运行时环境(内部版本 1.8.0_212-release-1586-b4-5784211)

[✓] VS Code(版本 1.48.2) • VS Code 位于/Applications/Visual Studio Code.app/Contents • Flutter 扩展版本 3.13.2

[✓] 连接的设备(1 个可用) • 专为 x86 64 构建的 Android SDK • emulator-5554 • android-x64 • Android 9 (API 28)(模拟器)

• 未发现问题! 进程已完成,退出代码为 0

app/build.gradle 中我的 Gradle 依赖项和插件:

dependencies {
        testImplementation 'junit:junit:4.12'
        androidTestImplementation 'androidx.test:runner:1.1.1'
        androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
        implementation 'com.google.firebase:firebase-core:17.4.4'
        implementation 'com.google.firebase:firebase-messaging:20.2.3'
        implementation 'com.google.firebase:firebase-analytics:17.4.4'
        implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    
    }
    
    apply plugin: 'io.fabric'
    apply plugin: 'com.google.gms.google-services'
    apply plugin: 'kotlin-android'
    apply plugin: 'com.huawei.agconnect'

在 android/build.gradle 中:

dependencies {
    // Example existing classpath
    classpath 'com.android.tools.build:gradle:3.5.3'
    // Add the google services classpath
    classpath 'com.google.gms:google-services:4.3.2'
    classpath 'io.fabric.tools:gradle:1.26.1'
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    classpath 'com.huawei.agconnect:agcp:1.3.1.300'
}

最佳答案

我们发现此错误发生在使用 Android 嵌入 v1 的较旧 Flutter 项目上。我们已经提供了修复程序,并将在下一个版本中提供。如果您的项目已经支持 v2 Embedding,请回复告知我们,我们可以进一步调查。感谢您指出这个问题。

要暂时解决此错误(在下一个版本之前),您必须将 Android Embedding v2 支持添加到您的项目中。我留下了一些步骤供您遵循,希望这些步骤能够解决您的问题。

  1. 如果您的 Flutter 项目尚未迁移,请将其迁移到 AndroidX。您可以按照 The official AndroidX migration guide for Flutter. 中的简单步骤操作

  2. 将 Flutter Embedding v2 元数据添加到您的 AndroidManifest.xml 文件中 在 AndroidManifest 文件的 application 标签下添加以下 flutterEmbedding 元数据,如下所示

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.huawei.hms.flutter.push_example">
<application
android:name="io.flutter.app.FlutterApplication"
android:icon="@mipmap/ic_launcher"
android:label="HMS Push Demo">
<activity
<!— 
Other configurations 
-->
</activity>
<!— Add the meta-data below. For supporting Android v2 Embedding
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
<meta-data
android:name="flutterEmbedding"
android:value="2" />
</application>
</manifest>
  • 编辑MainActivity.java 转到 /android/app/src/java/your_package_name/MainActivity.java 并编辑 MainActivity,如下所示。这里的关键部分是从 io.flutter.embedding.android.FlutterActivity 库导入 FlutterActivity 类。
  • package <your_package_name>;
    import io.flutter.embedding.android.FlutterActivity;
    
    public class MainActivity extends FlutterActivity {}
    

    完成这些配置后,您可以运行 flutter cleanflutter run 以使您的项目支持 android v2 嵌入。运行命令后,Flutter将自动创建新的GeneratedPluginRegistrant.java文件。

  • 检查 generatedPluginRegistrant.java 文件以确保您使用 v2 嵌入。 转到:/android/app/src/java/io/flutter/plugins/GeneeratedPluginRegistrant.java 并检查此文件以确保它与下面显示的文件类似。如果不相似,可以按如下方式编辑该文件,或者删除并运行 flutter run 命令让 Flutter 自动重新生成。 (备份文件,以防万一您要删除它)。
  • package io.flutter.plugins;
    
    import androidx.annotation.Keep;
    import androidx.annotation.NonNull;
    
    import io.flutter.embedding.engine.FlutterEngine;
    
    /**
    * Generated file. Do not edit.
    * This file is generated by the Flutter tool based on the
    * plugins that support the Android platform.
    */
    @Keep
    public final class GeneratedPluginRegistrant {
    public static void registerWith(@NonNull FlutterEngine flutterEngine) {
    flutterEngine.getPlugins().add(new com.huawei.hms.flutter.push.PushPlugin());
    }
    }
    

    现在您已经支持 Android Embedding v2,并且您应该能够从流中获取 token 。

    关于android - 将HMS Pushkit和FCM集成到Flutter应用程序中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63684721/

    相关文章:

    java - Android 数学不起作用

    flutter - Flutter中如何实现ListView平滑滚动

    android - 所有 firebase 库必须高于或低于 14.0.0

    android - 如何在布局中显示 firebase 通知消息

    android - Firebase 云消息传递 + Android : Priority of silent notifications

    android - android中的双向可滚动gridview

    android - ListView 的 Layout_width

    android - 我在 FirebaseRecyclerAdapter 类中找不到 populateViewHolder 方法

    dart - Dart 中的 async 和 async* 有什么区别?

    android - FloatingActionButton onpressed()无法正常工作