Android getParcelableExtra en desuso

4 minutos de lectura

Avatar de usuario de Rabindra Khadka
Rabindra Jadka

Estoy pasando datos a través de la intención con Parcelable y recibo usando getParcelableExtra. Sin embargo, getParcelableExtra parece estar en desuso. ¿Cómo soluciono la advertencia de desuso en este código? Alternativamente, ¿hay alguna otra opción para hacer esto? . Estoy usando compileSdkVersion 33.

Fragmento de código:

 var data = intent.getParcelableExtra("data")

  • Hola, querido @RabindraKhadka, deberías considerar agregar más details como muestra code para ayudarnos a entender completamente su problema.

    – Ged Flod

    18 de julio de 2022 a las 8:15

  • Hola, @GedFlod, agregué un fragmento de código.

    – Rabindra Khadka

    18 de julio de 2022 a las 8:23

Avatar de usuario de Niklas
Niklas

Aquí hay dos métodos de extensión que uso para Bundle & Intent:

inline fun <reified T : Parcelable> Intent.parcelable(key: String): T? = when {
  SDK_INT >= 33 -> getParcelableExtra(key, T::class.java)
  else -> @Suppress("DEPRECATION") getParcelableExtra(key) as? T
}

inline fun <reified T : Parcelable> Bundle.parcelable(key: String): T? = when {
  SDK_INT >= 33 -> getParcelable(key, T::class.java)
  else -> @Suppress("DEPRECATION") getParcelable(key) as? T
}

Yo también solicitó que esto se agregue a la biblioteca de soporte

Y si necesita el soporte de ArrayList, hay:

inline fun <reified T : Parcelable> Bundle.parcelableArrayList(key: String): ArrayList<T>? = when {
  SDK_INT >= 33 -> getParcelableArrayList(key, T::class.java)
  else -> @Suppress("DEPRECATION") getParcelableArrayList(key)
}

inline fun <reified T : Parcelable> Intent.parcelableArrayList(key: String): ArrayList<T>? = when {
  SDK_INT >= 33 -> getParcelableArrayListExtra(key, T::class.java)
  else -> @Suppress("DEPRECATION") getParcelableArrayListExtra(key)
}

  • Buena solución. Solicitado aquí para ser parte de android-x: tematracker.google.com/issues/243986223

    – desarrollador de Android

    27 de agosto de 2022 a las 20:17

  • He pedido esto yo mismo. He actualizado la descripción para incluir el ticket: tematracker.google.com/issues/242048899

    – Niklas

    28 de agosto de 2022 a las 17:48

  • Buen punto. Ya existe una pregunta para eso, así que respondí allí: stackoverflow.com/a/73543350/1979703

    – Niklas

    30 de agosto de 2022 a las 13:33

  • @androiddeveloper buena llamada. Ahora esta actualizado 🙂

    – Niklas

    7 sep 2022 a las 22:10

  • Parece que hay un error en Android 13 relacionado con esta API. Google dice que lo arreglarán en la próxima versión y también proporcionarán algo. Entonces, por ahora, creo que es mejor usar > VERSION_CODES.TIRAMISU en lugar de >= VERSION_CODES.TIRAMISU . Enlace: issuetracker.google.com/issues/240585930#comment6

    – desarrollador de Android

    13 oct 2022 a las 6:51

Avatar de usuario de AskNilesh
Pregúntale a Nilesh

Ahora tenemos que usar getParcelableExtra() con la clase de tipo más seguro agregada a API 33

CÓDIGO DE MUESTRA Para kotlin

val userData = if (VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
  intent.getParcelableExtra("DATA", User::class.java)
} else {
  intent.getParcelableExtra<User>("DATA")
}

CÓDIGO DE MUESTRA Para JAVA

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
  user = getIntent().getParcelableExtra("data", User.class);
} else {
  user = getIntent().getParcelableExtra("data");
}

  • No puedo hacer que esto funcione en Java … ¿Podría indicarme qué debo poner en lugar de User::class.java? mi codigo es mediaButtonEvent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);

    – Luis A. Florit

    10 de septiembre de 2022 a las 16:13

  • @LuisA.Florit he actualizado mi respuesta por favor revisa

    – Pregúntale a Nilesh

    10/09/2022 a las 16:34

  • Gracias @AskNilesh. En el segundo, quiso decir “CÓDIGO DE MUESTRA para Java”. en mi caso seria KeyEvent.class en lugar de User.class.

    – Luis A. Florit

    10/09/2022 a las 17:23

Avatar de usuario de Ged Flod
Ged Flod

Como se describe en el documentación oficial, getParcelableExtra quedó en desuso en el nivel de API 33.

Así que comprueba si el NIVEL API es >= 33 o cambia el método,

...

if (Build.VERSION.SDK_INT >= 33) { // TIRAMISU
    data = intent.getParcelableExtra (String name, Class<T> clazz)
}else{
    data = intent.getParcelableExtra("")
}

Aquí hay un ejemplo usando android.bluetooth.BluetoothDevice

...
val device = if (Build.VERSION.SDK_INT >= 33){ // TIRAMISU
    intent.getParcelableArrayExtra(
        BluetoothDevice.EXTRA_NAME,
        BluetoothDevice::class.java
    )
}else{
    intent.getParcelableExtra(BluetoothDevice.EXTRA_NAME)
}

  • No entiendo qué quisiste decir aquí. getParcelableExtra (String name, Class<T> clazz) no tiene sentido.

    – Luis A. Florit

    9 sep 2022 a las 20:33

  • Vea el código de muestra que agregué.

    – Ged Flod

    18 abr a las 11:06

  • Sí, gracias, hice algo así: KeyEvent event = (Build.VERSION.SDK_INT < 33) ? mediaButtonEvent.getParcelableExtra(Intent.EXTRA_KEY_EVENT) : mediaButtonEvent.getParcelableExtra(Intent.EXTRA_KEY_EVENT, KeyEvent.class);

    – Luis A. Florit

    18 abr a las 20:16

Avatar de usuario de Martin Zeitler
Martín Zeitler

Por ejemplo, en Java:

UsbDevice device;
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.S_V2) { // TIRAMISU onwards
    device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE, UsbDevice.class);
} else {
    device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
}

Esto todavía requiere @SuppressWarnings({"deprecation", "RedundantSuppression"}).

androidx.core:core-ktx:1.10.0-rc01 proporciona IntentCompat y BundleCompat

Ejemplo para recuperar un objeto de android.bluetooth.BluetoothDevice:

IntentCompat.getParcelableExtra(intent, BluetoothDevice.EXTRA_DEVICE, BluetoothDevice::class.java) 

  • Usar las clases de compatibilidad parece ser la respuesta correcta aquí.

    – perdido en la traducción

    12 abr a las 15:59

  • Usar las clases de compatibilidad parece ser la respuesta correcta aquí.

    – perdido en la traducción

    12 abr a las 15:59

¿Ha sido útil esta solución?