Definindo papel de parede através do código
-
27-09-2019 - |
Pergunta
Eu estava tentando fazer um aplicativo que também tinha a instalação para deixar o usuário selecionar papel de parede que ele gostaria de definir. Eu consegui isso chamando a galeria de intenção. Depois que o usuário selecionar uma imagem específica, o caminho dos dados da imagem é retornado para mim, que eu visualizo para o usuário, configurando a imagem em um ImageView.
O problema surge quando o tamanho da imagem (e/ou resolução) é maior do que o Android espera. Isso resulta em falha do meu módulo.
E como se isso não bastasse, o usuário tenta selecionar algum outro papel de parede (e no meu caso de teste o "outro" papel de parede também era de tamanho> 700kb), o aplicativo trava com a "outOfMemoryException" ...
Helppp me aqui pessoal !!!
Para a intenção da galeria, eu uso:
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Picture"),SELECT_IMAGE);
Para definir o papel de parede que eu uso:
InputStream is = getContentResolver().openInputStream(Uri.parse(uri_returned_from_intent));
Bitmap bgImage = BitmapFactory.decodeStream(is);//OutOfMemory error thrown here
setWallpaper(bgImage);
Então, eu tenho 2 problemas para lidar:
- Como cortar a imagem antes de defini -la como papel de parede ...
- Não consigo entender y outofMemoryException é jogado, porque nenhum dos tamanhos de imagem excede mesmo 1 MB ... e acho que o orçamento da VM no caso de N1 é 24 MB se m não é enganado ...
Solução
Você deve decodificar com a opção Insamplesize para reduzir o consumo de memória.
Outra opção InjustDecodeBounds pode ajudá -lo a encontrar valor correto de insampleamento