In meiner Aktivität erstelle ich ein Bitmap
Objekt und muss dann ein anderes starten Activity
. Wie kann ich dieses Bitmap
Objekt aus der Unteraktivität (der zu startenden) übergeben?
java
android
bitmap
parcelable
Michael
quelle
quelle
URI
oderResourceID
der Bitmap und nicht die Bitmap selbst zu übergeben. Das Übergeben der gesamten Bitmap erfordert viel Speicher. Das Übergeben der URL erfordert sehr wenig Speicher und ermöglicht es jeder Aktivität, die Bitmap nach Bedarf zu laden und zu skalieren.Wenn Sie eine Bitmap als Paket übergeben, wird der Fehler "JAVA BINDER FAILURE" angezeigt. Übergeben Sie die Bitmap als Byte-Array und erstellen Sie sie für die Anzeige in der nächsten Aktivität.
Ich habe meine Lösung hier geteilt:
Wie können Sie Bilder (Bitmaps) zwischen Android-Aktivitäten mithilfe von Bundles übertragen?
quelle
Das Übergeben einer Bitmap als parcelbar im Paket zwischen Aktivitäten ist aufgrund der Größenbeschränkung von parceable (1 MB) keine gute Idee. Sie können die Bitmap in einer Datei im internen Speicher speichern und die gespeicherte Bitmap in mehreren Aktivitäten abrufen. Hier ist ein Beispielcode.
So speichern Sie Bitmap in einer Datei myImage im internen Speicher:
In der nächsten Aktivität können Sie diese Datei myImage mit folgendem Code in eine Bitmap dekodieren:
Hinweis Viele Überprüfungen auf Null- und Skalierungs-Bitmaps werden nicht durchgeführt.
quelle
openFileOutput
.Wenn das Bild zu groß ist und Sie es nicht speichern und in den Speicher laden können, sollten Sie nur einen globalen statischen Verweis auf die Bitmap (innerhalb der empfangenden Aktivität) verwenden, der bei onDestory auf null zurückgesetzt wird, nur wenn "isChangingConfigurations" gibt true zurück.
quelle
Weil Intent eine Größenbeschränkung hat. Ich verwende ein öffentliches statisches Objekt, um die Bitmap vom Dienst an die Übertragung zu übergeben.
in meinem Dienst übergeben
Mein BroadcastReceiver
quelle
Komprimieren und senden
Bitmap
Die akzeptierte Antwort stürzt ab, wenn die
Bitmap
zu groß ist. Ich glaube, es ist ein Limit von 1 MB . DasBitmap
muss in ein anderes Dateiformat wie ein durch a dargestelltes JPG komprimiert werdenByteArray
, dann kann es sicher über ein übergeben werdenIntent
.Implementierung
Die Funktion ist in einem separaten Thread mit Kotlin Coroutines enthalten, da die
Bitmap
Komprimierung verkettet wird, nachdem dieBitmap
aus einer URL erstellt wurdeString
. Für dieBitmap
Erstellung ist ein separater Thread erforderlich, um ANR- Fehler (Application Not Responding) zu vermeiden.Verwendete Konzepte
toBitmap()
ist eine Kotlin Erweiterungsfunktion der Bibliothek erfordert zur App Abhängigkeit hinzugefügt werden.Code
1. Nach der Erstellung
Bitmap
in JPG komprimierenByteArray
.Repository.kt
ViewModel.kt
2. Bild wie
ByteArray
über übergebenIntent
.In diesem Beispiel wird es von einem Fragment an einen Dienst übergeben . Es ist das gleiche Konzept, wenn es zwischen zwei Aktivitäten geteilt wird .
Fragment.kt
3. Konvertieren Sie
ByteArray
zurück zuBitmap
.Utils.kt
quelle
Es könnte spät sein, kann aber helfen. Deklarieren Sie auf dem ersten Fragment oder der ersten Aktivität eine Klasse ... zum Beispiel
Dann machen Sie dies auf der zweiten Klasse / Fragment.
Ich hoffe es hilft.
quelle
Alle oben genannten Lösungen funktionieren bei mir nicht. Das Senden einer Bitmap führt
parceableByteArray
ebenfalls zu Fehlernandroid.os.TransactionTooLargeException: data parcel size
.Lösung
putExtra(String)
alsquelle
Sie können eine Bitmap-Übertragung erstellen. Versuche dies....
In der ersten Klasse:
1) Erstellen:
2) Erstellen Sie Getter und Setter
3) Stellen Sie das Bild ein:
Dann in der zweiten Klasse:
quelle
In meinem Fall hat der oben erwähnte Weg bei mir nicht funktioniert. Jedes Mal, wenn ich die Bitmap in die Absicht einfügte, wurde die zweite Aktivität nicht gestartet. Das gleiche passierte, als ich die Bitmap als Byte [] übergab.
Ich folgte diesem Link und es funktionierte wie ein Charme und sehr schnell:
in meiner 1. Tätigkeit:
und hier ist das onCreate () meiner 2. Aktivität:
quelle
CommonResources.photoFinishBitmap
anstelle von verwendet haben solltenConstants.photoFinishBitmap
.