W swoim działaniu tworzę Bitmap
obiekt, a następnie potrzebuję uruchomić kolejny Activity
, Jak mogę przekazać ten Bitmap
obiekt z poddziałania (tego, które ma zostać uruchomione)?
java
android
bitmap
parcelable
Michael
źródło
źródło
URI
lubResourceID
mapy bitowej, a nie samą bitmapę. Przekazanie całej bitmapy wymaga dużej ilości pamięci. Przekazywanie adresu URL wymaga bardzo małej ilości pamięci i umożliwia każdemu działaniu załadowanie i skalowanie mapy bitowej zgodnie z potrzebami.W rzeczywistości przekazanie mapy bitowej jako Parcelable spowoduje błąd „JAVA BINDER FAILURE”. Spróbuj przekazać mapę bitową jako tablicę bajtów i zbudować ją do wyświetlenia w następnym działaniu.
Udostępniłem tutaj moje rozwiązanie:
jak przesyłać obrazy (mapy bitowe) między działaniami Androida przy użyciu pakietów?
źródło
Przekazywanie mapy bitowej jako możliwej do przetworzenia w pakiecie między działaniami nie jest dobrym pomysłem ze względu na ograniczenie rozmiaru Parceable (1 MB). Możesz przechowywać mapę bitową w pliku w pamięci wewnętrznej i odzyskać przechowywaną mapę bitową w kilku działaniach. Oto przykładowy kod.
Aby przechowywać mapę bitową w pliku myImage w pamięci wewnętrznej:
Następnie w kolejnym ćwiczeniu możesz zdekodować ten plik myImage do bitmapy za pomocą następującego kodu:
Uwaga Wiele sprawdzania wartości null i skalowania bitmap jest pomijanych.
źródło
openFileOutput
.Jeśli obraz jest zbyt duży i nie możesz go zapisać i załadować do magazynu, powinieneś rozważyć użycie globalnego statycznego odniesienia do mapy bitowej (wewnątrz działania odbierającego), które zostanie zresetowane do wartości null w onDestory, tylko jeśli „isChangingConfigurations” zwraca prawdę.
źródło
Ponieważ zamiar ma limit rozmiaru. Używam publicznego obiektu statycznego do przekazywania bitmapy z usługi do transmisji ....
przekazać moje usługi
My BroadcastReceiver
źródło
Kompresuj i wysyłaj
Bitmap
Zaakceptowana odpowiedź ulegnie awarii, gdy rozmiar
Bitmap
jest za duży. Uważam, że jest to limit 1 MB .Bitmap
Musi być skompresowane w innym formacie, takich jak JPG reprezentowany przezByteArray
, to może być bezpiecznie przekazywane za pośrednictwemIntent
.Realizacja
Funkcja jest zawarta w osobnym wątku przy użyciu Kotlin Coroutines, ponieważ
Bitmap
kompresja jest powiązana poBitmap
utworzeniu pliku z adresu URLString
.Bitmap
Stworzenie wymaga oddzielnego wątku w celu uniknięcia Aplikacja nie odpowiada (ANR) błędów.Zastosowane koncepcje
toBitmap()
jest Kotlin Funkcja rozszerzeń wymaga tej biblioteki być dodawane do zależności aplikacji.Kod
1. Kompresuj
Bitmap
do JPGByteArray
po utworzeniu.Repository.kt
ViewModel.kt
2. Przekaż obraz jak
ByteArray
za pośrednictwem plikuIntent
.W tym przykładzie jest on przekazywany z fragmentu do usługi . Ta sama koncepcja dotyczy dwóch działań .
Fragment.kt
3. Konwertuj z
ByteArray
powrotem naBitmap
.Utils.kt
źródło
Może być późno, ale może pomóc. Na pierwszym fragmencie lub czynności zadeklaruj klasę ... na przykład
Następnie na drugiej klasie / fragmencie zrób to ..
Mam nadzieję, że to pomoże.
źródło
Wszystkie powyższe rozwiązania nie działają dla mnie, wysyłanie bitmapy
parceableByteArray
również generuje błądandroid.os.TransactionTooLargeException: data parcel size
.Rozwiązanie
putExtra(String)
jakoźródło
Możesz utworzyć transfer bitmapowy. Spróbuj tego....
W pierwszej klasie:
1) Utwórz:
2) Utwórz getter i setter
3) Ustaw obraz:
Następnie w drugiej klasie:
źródło
W moim przypadku powyższy sposób nie zadziałał. Za każdym razem, gdy umieszczałem bitmapę w intencji, drugie działanie się nie rozpoczynało. To samo stało się, gdy przekazałem bitmapę jako bajt [].
Poszedłem za tym linkiem i zadziałało jak urok i bardzo szybko:
w mojej 1 czynności:
a oto onCreate () mojej drugiej aktywności:
źródło
CommonResources.photoFinishBitmap
zamiastConstants.photoFinishBitmap
.