Flutter para Android

É possível configurar apps móveis para trabalhar com a Contact Center AI Platform (CCAI) de várias maneiras, incluindo com o Flutter. Nesta página, mostramos como integrar o SDK do Android a um app Android usando o Flutter.

Antes de começar

Antes de seguir as instruções nesta página, siga as instruções em Integrar usando o Flutter.

Integrar o SDK a um app Android

Para integrar o SDK a um app Android, siga estas etapas:

  1. No arquivo android/build.gradle do diretório de exemplo do Flutter, atualize minSdkVersion para 21 ou mais recente.

  2. No arquivo android/src/main/AndroidManifest.xml, adicione o seguinte:

    <application>
      <activity
        android:name="co.ujet.android.activity.UjetActivity"
        android:exported="true">
        <intent-filter>
          <action android:name="android.intent.action.VIEW"/>
          <category android:name="android.intent.category.DEFAULT"/>
          <category android:name="android.intent.category.BROWSABLE"/>
          <!-- TODO: Change to your custom URL scheme. Config from Portal > Developer Settings > Mobile App > Enable Send SMS to Download App > Android App > URL -->
          <data
            android:host="co.ujet.flutter_example_app"
            android:path="/smartchannel"
            android:scheme="ujet" />
        </intent-filter>
      </activity>
    
      <meta-data
            android:name="co.ujet.android.companyKey"
            android:value="@string/ujet_company_key"/>
      <meta-data
          android:name="co.ujet.android.companyName"
          android:value="@string/ujet_company_name"/>
      <meta-data
          android:name="co.ujet.android.subdomain"
          android:value="@string/ujet_subdomain"/>
      <meta-data
          android:name="co.ujet.android.companyUrl"
          android:value="@string/ujet_company_url"/>
    </application>
    
  3. Na tag <application>, atualize o valor android:name para .Application, como neste exemplo de código:

    <!--Change the value of android:name to .Application -->
    <application
      android:name=".Application"
      android:label="Demo Application"
      android:icon="@mipmap/ic_launcher">
    
  4. Atualize android/build.gradle, como no exemplo de código a seguir:

    allprojects {
      repositories {
        google()
        mavenCentral()
        maven {
          url "https://sdk.ujet.co/android/"
        }
      }
    }
    
  5. Atualize android/app/build.gradle, como no exemplo de código a seguir:

    dependencies {
      // Use UJET SDK version 2.6.0 or latest to support recent push notification changes.
      def ujetSdkVersion = "x.y.z"
      implementation "co.ujet.android:ujet-android:$ujetSdkVersion"
      implementation "co.ujet.android:cobrowse:$ujetSdkVersion"
    }
    
  6. Atualize res/values/strings.xml, como no exemplo de código a seguir. Crie se ele não existir.

    <resources>
      <string name="ujet_company_key">YOUR_COMPANY_KEY</string>
      <string name="ujet_company_name">YOUR_COMPANY_NAME</string>
    
      <!-- If your tenant / portal url ends with "ujet.co" then set ujet_subdomain string only (ignore
          ujet_company_url), otherwise set ujet_company_url only (ignore ujet_subdomain) following below instructions. -->
      <!-- To get subdomain, extract string content between 'https://' and first '.' of your tenant/portal URL.
          Example, If your tenant url is https://XXX.YYY.ZZZ/ then subdomain will be XXX -->
      <string name="ujet_subdomain">YOUR_SUBDOMAIN</string>
    
      <!-- Use tenant url as company url here, it should be in format of https://XXX.YYY.ZZZ/api/v2
          (here XXX should match with your subdomain) -->
      <string name="ujet_company_url">YOUR_COMPANY_URL</string>
    </resources>
    
  7. Crie um projeto do Firebase ou, se já tiver um, registre este app. Baixe o arquivo google-service.json e coloque-o no seu projeto no seguinte diretório: example/android/app/.

Registrar o módulo

Para registrar o módulo, abra MainActivity.kt e inicialize UJETModule, como no exemplo de código a seguir:

class MainActivity : FlutterActivity() {
    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)

        //Register and Initialize UJETModule
        UJETModule.init(flutterEngine.dartExecutor.binaryMessenger, applicationContext)
    }
}

Configurar notificações push do Android

Siga estas etapas se quiser integrar notificações push de forma nativa. Verifique se você copiou e colou o diretório do Firebase no seu projeto Android, conforme indicado em Integrar o SDK a um app Android.

Para configurar notificações push do Android, siga estas etapas:

  1. Adicione uma dependência do Firebase para notificações push no arquivo build.gradle no nível do app, como no exemplo de código a seguir:

    dependencies {
      implementation platform("com.google.firebase:firebase-bom:32.8.0")
      implementation 'com.google.firebase:firebase-messaging'
    }
    
  2. Atualize AndroidManifest.xml, como no exemplo de código a seguir:

    <application>
      <service
        android:name=".firebase.MyFirebaseMessagingService"
        android:exported="false">
        <intent-filter>
          <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
      </service>
    </application>
    
  3. Adicione um plug-in google-services no nível raiz do projeto em build.gradle, como no exemplo de código a seguir:

    plugins {
      id 'com.google.gms.google-services' version '4.3.8' apply false
    }
    
  4. Adicione um plug-in google-services no nível do app do projeto em build.gradle, como no exemplo de código a seguir:

    plugins {
      id "com.android.application"
      id "kotlin-android"
      id "dev.flutter.flutter-gradle-plugin"
      id 'com.google.gms.google-services'  // google-services plugin
    }
    
  5. Crie MyFirebaseMessagingService que implementa FirebaseMessagingService, como no exemplo de código a seguir:

    class MyFirebaseMessagingService: FirebaseMessagingService() {
          private var firebaseTokenManager: FirebaseTokenManager? = null
    
          override fun onCreate() {
              super.onCreate()
              firebaseTokenManager = FirebaseTokenManager(this)
          }
    
          override fun onNewToken(token: String) {
              firebaseTokenManager?.updateToken(token)
          }
    
          override fun onMessageReceived(message: RemoteMessage) {
              if (Ujet.canHandlePush(message.data)) {
                  Log.d("Firebase", "Handle the push message by UJET")
              } else {
                  // Handle your notifications
              }
          }
      }
    
  6. Crie FirebaseTokenManager, como no exemplo de código a seguir:

      class FirebaseTokenManager(context: Context) {
          private val sharedPreferences = context.getSharedPreferences("${context.packageName}_preferences", Context.MODE_PRIVATE)
          private var token: String? = null
    
          fun getToken(): String? {
              token = sharedPreferences.getString("firebaseToken", null)
              if (token == null) {
                  FirebaseMessaging.getInstance().token.addOnCompleteListener { task: Task<String?> ->
                      if (!task.isSuccessful || task.result == null) {
                          return@addOnCompleteListener
                      }
                      token = task.result
                      updateToken(token)
                  }
              }
              return token
          }
    
          fun updateToken(token: String?) {
              sharedPreferences
                  .edit()
                  .putString("firebaseToken", token)
                  .apply()
          }
      }