Na minha atividade, eu crio um Bitmap
objeto e, em seguida, preciso iniciar outro Activity
. Como posso passar esse Bitmap
objeto da subatividade (a que será lançada)?
java
android
bitmap
parcelable
Michael
fonte
fonte
URI
ouResourceID
do bitmap e não o próprio bitmap. Passar o bitmap inteiro requer muita memória. Passar a URL requer muito pouca memória e permite que cada atividade carregue e dimensione o bitmap conforme necessário.Na verdade, passar um bitmap como Parcelable resultará em um erro "JAVA BINDER FAILURE". Tente passar o bitmap como uma matriz de bytes e construí-lo para exibição na próxima atividade.
Compartilhei minha solução aqui:
como você transmite imagens (bitmaps) entre atividades do Android usando bundles?
fonte
Passar o bitmap como parcelável no pacote entre atividades não é uma boa ideia devido à limitação de tamanho de Parceable (1mb). Você pode armazenar o bitmap em um arquivo no armazenamento interno e recuperar o bitmap armazenado em várias atividades. Aqui está um código de exemplo.
Para armazenar bitmap em um arquivo myImage no armazenamento interno:
Na próxima atividade, você pode decodificar esse arquivo myImage em um bitmap usando o seguinte código:
Nota Muita verificação de bitmap nulo e de escala é omitida.
fonte
openFileOutput
.Se a imagem for muito grande e você não puder salvá-la e carregá-la no armazenamento, considere apenas usar uma referência estática global para o bitmap (dentro da atividade de recebimento), que será redefinida para nula no onDestory, apenas se "isChangingConfigurations" retorna verdadeiro.
fonte
Porque Intent tem limite de tamanho. Eu uso o objeto estático público para passar o bitmap do serviço à transmissão ....
passar em meu serviço
My BroadcastReceiver
fonte
Compactar e enviar
Bitmap
A resposta aceita falhará quando
Bitmap
for muito grande. Eu acredito que é um limite de 1 MB . EleBitmap
deve ser compactado em um formato de arquivo diferente, como um JPG representado por aByteArray
, para que possa ser transmitido com segurança por meio de umIntent
.Implementação
A função está contida em um thread separado usando Kotlin Coroutines porque a
Bitmap
compactação é encadeada após aBitmap
criação de um URLString
. ABitmap
criação requer um thread separado para evitar erros de ANR (Aplicativo Não Respondendo) .Conceitos Utilizados
toBitmap()
é uma função de extensão Kotlin que exige que a biblioteca seja adicionada às dependências do aplicativo.Código
1. Comprima
Bitmap
em JPGByteArray
depois de ter sido criado.Repository.kt
ViewModel.kt
2. Passe a imagem como
ByteArray
através de umIntent
.Nesta amostra, ele é passado de um fragmento para um serviço . É o mesmo conceito se estiver sendo compartilhado entre duas atividades .
Fragment.kt
3. Converta de
ByteArray
volta paraBitmap
.Utils.kt
fonte
Pode ser tarde, mas pode ajudar. No primeiro fragmento ou atividade, declare uma classe ... por exemplo
Então, na segunda classe / fragmento, faça isso.
Espero que ajude.
fonte
Todas as soluções acima não funcionam para mim; o envio de bitmap
parceableByteArray
também gera erroandroid.os.TransactionTooLargeException: data parcel size
.Solução
putExtra(String)
comofonte
Você pode criar uma transferência de bitmap. tente isso ....
Na primeira aula:
1) Criar:
2) Criar getter e setter
3) Defina a imagem:
Então, na segunda classe:
fonte
No meu caso, a maneira mencionada acima não funcionou para mim. Toda vez que coloco o bitmap na intenção, a segunda atividade não é iniciada. O mesmo aconteceu quando passei o bitmap como byte [].
Eu segui este link e funcionou como um charme e muito rápido:
na minha primeira atividade:
e aqui está o onCreate () da minha segunda atividade:
fonte
CommonResources.photoFinishBitmap
vez deConstants.photoFinishBitmap
.