Dans mon activité, je crée un Bitmap
objet puis je dois en lancer un autre Activity
, comment passer cet Bitmap
objet depuis la sous-activité (celle qui va être lancée)?
java
android
bitmap
parcelable
Michael
la source
la source
URI
ouResourceID
du bitmap et non le bitmap lui-même. Passer le bitmap entier nécessite beaucoup de mémoire. La transmission de l'URL nécessite très peu de mémoire et permet à chaque activité de charger et de mettre à l'échelle le bitmap selon ses besoins.En fait, passer un bitmap en tant que Parcelable entraînera une erreur "JAVA BINDER FAILURE". Essayez de transmettre le bitmap sous forme de tableau d'octets et de le construire pour l'afficher dans l'activité suivante.
J'ai partagé ma solution ici:
comment passer des images (bitmaps) entre les activités Android à l'aide de bundles?
la source
Passer le bitmap comme parceable dans le bundle entre les activités n'est pas une bonne idée en raison de la limitation de taille de Parceable (1mb). Vous pouvez stocker le bitmap dans un fichier dans la mémoire interne et récupérer le bitmap stocké dans plusieurs activités. Voici un exemple de code.
Pour stocker le bitmap dans un fichier myImage dans la mémoire interne:
Ensuite, dans l'activité suivante, vous pouvez décoder ce fichier myImage en un bitmap en utilisant le code suivant:
Remarque Une grande partie de la vérification des bitmap nuls et de mise à l'échelle est omise.
la source
openFileOutput
.Si l'image est trop grande et que vous ne pouvez pas l'enregistrer et la charger dans le stockage, vous devriez envisager d'utiliser simplement une référence statique globale au bitmap (à l'intérieur de l'activité de réception), qui sera réinitialisée à null sur onDestory, uniquement si "isChangingConfigurations" renvoie vrai.
la source
Parce que l'intention a une limite de taille. J'utilise un objet statique public pour passer le bitmap d'un service à l'autre ...
passer à mon service
Mon récepteur de diffusion
la source
Compresser et envoyer
Bitmap
La réponse acceptée plantera lorsque le
Bitmap
est trop grand. Je pense que c'est une limite de 1 Mo. LeBitmap
doit être compressé dans un format de fichier différent tel qu'un JPG représenté par unByteArray
, puis il peut être transmis en toute sécurité via un fichierIntent
.la mise en oeuvre
La fonction est contenue dans un thread séparé à l'aide de Kotlin Coroutines car la
Bitmap
compression est chaînée après laBitmap
création de l'URLString
. LaBitmap
création nécessite un thread distinct afin d'éviter les erreurs ANR (Application Not Responding) .Concepts utilisés
toBitmap()
une fonction d'extension Kotlin nécessite que cette bibliothèque soit ajoutée aux dépendances de l'application.Code
1. Compresser
Bitmap
en JPGByteArray
après sa création.Repository.kt
ViewModel.kt
2. Transmettez l'image comme
ByteArray
via unIntent
.Dans cet exemple, il est passé d'un fragment à un service . C'est le même concept s'il est partagé entre deux activités .
Fragment.kt
3. Reconvertissez
ByteArray
enBitmap
.Utils.kt
la source
Il peut être tard mais peut aider. Sur le premier fragment ou activité déclarez une classe ... par exemple
Ensuite, sur la deuxième classe / fragment, faites ceci.
J'espère que ça aide.
la source
Toutes les solutions ci-dessus ne fonctionnent pas pour moi, l'envoi de bitmap
parceableByteArray
génère également une erreurandroid.os.TransactionTooLargeException: data parcel size
.Solution
putExtra(String)
commela source
Vous pouvez créer un transfert bitmap. essaye ça....
Dans la première classe:
1) Créez:
2) Créer un getter et un setter
3) Réglez l'image:
Puis, en deuxième classe:
la source
Dans mon cas, la manière mentionnée ci-dessus n'a pas fonctionné pour moi. Chaque fois que je mets le bitmap dans l'intention, la deuxième activité ne démarre pas. La même chose s'est produite lorsque j'ai passé le bitmap en tant que byte [].
J'ai suivi ce lien et cela a fonctionné comme un charme et très vite:
dans ma 1ère activité:
et voici le onCreate () de ma 2ème activité:
la source
CommonResources.photoFinishBitmap
place deConstants.photoFinishBitmap
.