¿Por qué aparecen burbujas como notificaciones normales?

AndroidDev:

He estado experimentando con la nueva Burbujas API recientemente. No importa lo que hago, las notificaciones que esperan para aparecer como una burbuja siempre aparece en la bandeja del sistema como una notificación normal.

He escrito mi propia aplicación de juguetes, que voy a añadir aquí. También he tirado hacia abajo un par de otras aplicaciones de tutoriales ( aquí y aquí ) que he estudiado. En todos los casos, ninguna burbuja, sólo una notificación de la bandeja del sistema.

Dado que las aplicaciones de la muestra afirman que pueden presentar burbujas, supongo que el problema debe estar en algún lugar de mi entorno emulador. Estoy corriendo un emulador que usos Android API R. Y he permitido burbujas en las opciones de desarrollador:

introducir descripción de la imagen aquí

Aquí está el código correspondiente de la aplicación que he desarrollado:

AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.bubbles">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".BubbleActivity"
            android:allowEmbedded="true"
            android:documentLaunchMode="always"
            android:resizeableActivity="true" />
        <activity
            android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

MainActivity.kt

import android.os.Bundle
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.ViewModelProvider

class MainActivity : AppCompatActivity() {

    private lateinit var bubbleViewModel: BubbleViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        bubbleViewModel = ViewModelProvider(
            this, BubbleViewModelFactory(this.application))
            .get(BubbleViewModel::class.java)
    }

    fun blowBubble(view: View) {
        bubbleViewModel.showBubble()
    }
}

BubbleViewModel.kt

class BubbleViewModel(application: Application): AndroidViewModel(application) {

    private val notificationHelper = NotificationHelper(getApplication())

    init {
        notificationHelper.createNotificationChannels()
    }

    fun showBubble() {
        viewModelScope.launch{
            withContext(Dispatchers.Main) {
                with (notificationHelper) {
                    if (canBubble())
                        showNotification()
                }
            }
        }
    }
}

NotificationHelper.kt

class NotificationHelper(private val context: Context) {

    private val notificationManager = context.getSystemService(NotificationManager::class.java)
    private lateinit var channel: NotificationChannel

    fun createNotificationChannels() {

        channel = NotificationChannel(
            CHANNEL_NEW_MESSAGES,
            context.getString(R.string.channel_name),
            NotificationManager.IMPORTANCE_HIGH)

        with(channel) {
            enableVibration(true)
            lockscreenVisibility = NotificationCompat.VISIBILITY_PUBLIC
            description = context.getString(R.string.channel_description)
            setAllowBubbles(true)
        }

        Log.d("bubble", "Can Bubble: $channel.canBubble()")
        notificationManager?.let {
            it.createNotificationChannel(channel)
        }
    }

    @WorkerThread
    fun showNotification() {

        val bubbleIntent = PendingIntent.getActivity(
            context,
            REQUEST_BUBBLE,
            Intent(context, BubbleActivity::class.java).setAction(Intent.ACTION_VIEW),
            PendingIntent.FLAG_UPDATE_CURRENT)

        val bubbleMetaData = Notification.BubbleMetadata.Builder()
            .setDesiredHeight(600)
            .createIntentBubble(bubbleIntent, Icon.createWithResource(context, R.drawable.baseball))
            .setAutoExpandBubble(false)
            .setSuppressNotification(false)
            .build()

        val person = Person.Builder()
            .setIcon(Icon.createWithResource(context, R.drawable.baseball))
            .setName("Bubbles...")
            .setImportant(true)
            .build()

        val style = Notification.MessagingStyle(person)
            .addMessage("...are the Best!", System.currentTimeMillis(), person)

        val builder = Notification.Builder(context, CHANNEL_NEW_MESSAGES)
            .setBubbleMetadata(bubbleMetaData)
            .setContentIntent(bubbleIntent)
//            .setContentTitle("Title")
//            .setContentText("Hello this is a notification")
            .setSmallIcon(R.drawable.baseball)
            .setShowWhen(true)
            .setAutoCancel(true)
            .setStyle(style)
//            .addPerson(person.uri)


        notificationManager?.notify(0, builder.build())
    }

    fun canBubble(): Boolean {
        notificationManager?.let {
            val channel = it.getNotificationChannel(CHANNEL_NEW_MESSAGES)
            return it.areBubblesAllowed() && channel.canBubble()
        }
        return false
    }

    companion object {
        private const val CHANNEL_NEW_MESSAGES = "new_messages"
        const val REQUEST_BUBBLE = 2
    }
}

Y, por último, la actividad de destino, que no creo que realmente importa demasiado ya que sólo se dispara si la burbuja estaban disponibles para hacer clic: BubbleActivity.kt

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity

class BubbleActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_bubble)
    }
}

Y eso es realmente todo lo que hay a esto. Sin embargo, cuando se ejecuta este y haga clic en el botón para mostrar una burbuja, me da este resultado:

introducir descripción de la imagen aquí

Niladree:

@AndroidDev su código funciona bien en el nivel de la API 29 y muestra las notificaciones como burbujas pero no funciona en Android R. supongo que no debe preocuparse de que a medida que se está en la etapa de vista previa y definitivamente no es estable.

Así que si se ejecuta el código en un emulador con el nivel de la API 29, que debería funcionar bien.

Este problema es una regresión desde Android 10 y se informó aquí

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=339479&siteId=1
Recomendado
Clasificación