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")
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
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 esmediaButtonEvent.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 deUser.class
.– Luis A. Florit
10/09/2022 a las 17:23
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
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
Hola, querido @RabindraKhadka, deberías considerar agregar más
details
como muestracode
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