Cómo mostrar la imagen (matriz de bytes) de JSON en imageView … Factory devuelve null
Estoy luchando con este problema de 2 días ya … Estaba publicando antes, pero no de las respuestas estaban bien.
Mi problema es: estoy intentando convertir el byte [] en imagen. El byte [] viene de JSON y está en este formato:
- JSONObject no funciona para Android 2.3, pero funciona bien con Android 4.2, ¿por qué?
- Analizar el código de error de respuesta incorrecto del servidor json 100
- Cómo actualizar el PNR Capcha añadido en el Indian Railways Site
- Prueba de objetos JSON nulos en Java / Android
- Parse ~ 1 MB JSON en Android muy lento
"4oCwUE5HDQoaCgAAAAA1JSERSAAAAfwAAAFAIBgAAADBHwqrDsAAAAFAIBgAAADBHwqrDsAAAAAAWSFlzAAAAJwAAACcBKgnigJhPAAAgAElEQVR4xZPCrMK9ecWSZcOZfcOfw7c5w5vCvW / CqXp …" va para otras 100 líneas.
Clase para mostrar las imágenes:
public class PlayersListActivity extends Activity { // URL to make request private static String URL = "url goes here"; private static int userID; ArrayList<HashMap<String, Object>> playersList; ListView playerView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.list_view); Bundle extras = getIntent().getExtras(); userID = extras.getInt("id"); initLayout(); } private void initLayout() { playerView = (ListView) findViewById(R.id.list); playersList = new ArrayList<HashMap<String, Object>>(); playerView.setAdapter(new SimpleAdapter(PlayersListActivity.this, playersList, R.layout.activity_players_list, null, null)); playerView.setDividerHeight(0); } @Override protected void onResume() { if (!ConnectivityStatus.isNetworkAvailable(getApplicationContext())) { Toast.makeText(PlayersListActivity.this, R.string.network_failed, Toast.LENGTH_SHORT).show(); } else { playerView.setAdapter(null); new PlayersLoadTask().execute(); } super.onResume(); } ProgressDialog pDialog; class PlayersLoadTask extends AsyncTask<String, String, String> { @Override protected void onPreExecute() { super.onPreExecute(); pDialog = new ProgressDialog(PlayersListActivity.this); pDialog.setMessage("Reading data"); pDialog.setIndeterminate(false); pDialog.setCancelable(true); pDialog.show(); playersList.clear(); } @Override protected String doInBackground(String... arg0) { try { ArrayList<BasicNameValuePair> parameters = new ArrayList<BasicNameValuePair>(); parameters.add(new BasicNameValuePair("request", "getPlayers")); parameters.add(new BasicNameValuePair("clubid", Integer.toString(userID))); // TODO: you'll need to change this to the Id from the user DefaultHttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(PlayersListActivity.URL); httpPost.setEntity(new UrlEncodedFormEntity(parameters, "UTF-8")); HttpResponse httpResponse = httpClient.execute(httpPost); HttpEntity httpEntity = httpResponse.getEntity(); // if this is null the web service returned an empty page if(httpEntity == null) // response is empty so exit out return null; String jsonString = EntityUtils.toString(httpEntity); // again some simple validation around the returned string if(jsonString != null && jsonString.length() != 0) // checking string returned from service to grab id { JSONArray jsonArray = new JSONArray(jsonString); for(int i=0; i< jsonArray.length(); i++) { HashMap<String, Object> map = new HashMap<String, Object>(); JSONObject jsonObject = (JSONObject) jsonArray.get(i); int id = jsonObject.getInt("id"); String name = jsonObject.getString("name"); byte[] image = jsonObject.getString("image").getBytes(); String base64 = jsonObject.getString("image"); try { BitmapFactory.Options op=new BitmapFactory.Options(); op.inSampleSize=8; Bitmap yourSelectedImage = BitmapFactory.decodeByteArray(image,0,image.length); ByteArrayOutputStream baos = new ByteArrayOutputStream(); yourSelectedImage.compress(Bitmap.CompressFormat.PNG, 100, baos); //this will convert image to byte[] byte[] byteArrayImage = baos.toByteArray(); // this will convert byte[] to string String encodedImage = Base64.encodeToString(byteArrayImage, Base64.DEFAULT); if (encodedImage != null) { ImageView imgView = (ImageView) findViewById(R.id.image); imgView.setImageBitmap(yourSelectedImage); } } catch (Exception e) { Log.d("Exception", e.toString()); } //map.put("id", id); map.put("image", base64.toString()); map.put("name", name); //Log.d("JSON OBJECTS:", jsonObject.toString()); //Log.d("WHATS IN MAP:", map.toString()); playersList.add(map); } } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (JSONException e) { e.printStackTrace(); } catch (Exception e) { Log.e("ERROR SOMEWHERE!!!! " , e.toString()); } return null; } protected void onPostExecute(String file_url) { if(playersList.size() == 0 ) { Toast.makeText(PlayersListActivity.this, "No players in a list" , Toast.LENGTH_SHORT).show(); } else { playerView.setAdapter(new PlayerListAdapter (PlayersListActivity.this, playersList, R.layout.activity_players_list, new String[] {"id", "image", "name"}, new int[] {R.id.player_list_id, R.id.image, R.id.name, })); } pDialog.dismiss(); } }
}
Y el LogCat:
D/skia(3513): --- SkImageDecoder::Factory returned null D/skia(3513): --- SkImageDecoder::Factory returned null E/BitmapFactory(4399): Unable to decode stream: java.io.FileNotFoundException: /4oCwUE5HDQoaCgAAAA1JSERSAAAAfwAAAFAIBgAAADBHwqrDsAAAAAlwSFlzAAAAJwAAACcBKgnigJhPAAAgAElEQVR4xZPCrMK9ecWSZcOZfcOfw7c5w5vCvW/CqXpLV...
No tengo ni idea de por qué mi bitmap devolver null. He intentado muchas maneras diferentes pero nada trabaja.
¡Es por eso que necesito ayuda mal! ¡¡¡Gracias!!!
- Cómo recuperar array multidimensional usando json en android
- POST cuerpo JSON utilizando Retrofit
- ¿Cómo obtener una cadena de respuesta de Retrofit sin procesar?
- Credenciales de la cuenta de servicio de Firebase Permiso de lectura de Json leído
- Escribir archivo .json y leer ese archivo en Android
- Quitar objeto de JSONArray
- Acceso a la aplicación laravel desde la aplicación android con el token csrf
- Android JSONArrays dentro de JSONArray
Para futura referencia
JSONArray jsonArray = new JSONArray(jsonString); for (int i = 0; i < jsonArray.length(); i++) { HashMap<String, Object> map = new HashMap<String, Object>(); JSONObject jsonObject = (JSONObject) jsonArray.get(i); int id = jsonObject.getInt("id"); String name = jsonObject.getString("name"); byte[] byteArray = Base64.decode(jsonObject.getString("image"), Base64.DEFAULT) ; Bitmap bmp1 = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length); //Bitmap bitmap = Bitmap.createScaledBitmap(bmp1, 120, 120, false); map.put("id", id); map.put("name", name); map.put("image", bmp1); playersList.add(map); //Log.d("SHOW PLAYER LIST: " ,playersList.toString()); }
Convertir mapa de bits en matriz de bytes: –
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); ByteArrayOutputStream stream = new ByteArrayOutputStream(); bmp.compress(Bitmap.CompressFormat.PNG, 100, stream); byte[] byteArray = stream.toByteArray();
Convertir matriz de bytes a mapa de bits: `Bitmap bmp = BitmapFactory.decodeByteArray (byteArray, 0, byteArray.length); ImageView image = (ImageView) findViewById (R.id.imageView1);
Image.setImageBitmap (bmp); `
Bitmap bitmap = BitmapFactory.decodeByteArray(byteArray , 0, byteArray .length); iv.setImageBitmap(bitmap );
Este código simplemente decodificará la imagen de la matriz de bytes.
- OnCreate () llamado mientras se detiene la actividad (pero no se destruye). Sólo después de la instalación
- ¿Está creando lo siguiente para loop bad para Garbage Collection?