Crear Bitmap NullPointerException
Tengo un bloqueo en una aplicación que no puedo resolver.
Obtengo un mapa de bits del recurso así.
- Android Native crash en /system/lib/libskia.so (procesamiento de mapas de bits)
- Android: BitmapDrawable.Draw (lienzo) no parece funcionar
- Escala de Android zoom zoomout mapa de bits en lienzo
- Cómo crear ImageView redimensionable en Android
- Bitmap.compress devuelve false para la imagen dibujada
Bitmap bmp1 = BitmapFactory.decodeResource(getResources(), R.drawable.map_distance_tag);
Ahora esto parece tener problemas en una pequeña minoría de dispositivos cuando se trata de crear un mapa de bits de este mapa de bits. Por ejemplo…
Bitmap bmOverlay = Bitmap.createBitmap(bmp1.getWidth(), bmp1.getHeight(), bmp1.getConfig());
Obtengo una NullPointerException
cuando se crea el Bitmap
de Bitmap
en la línea 468 de la clase Bitmap
, que he tenido una mirada y su cuando se establece la escala de densidad del nuevo mapa de bits de su mapa de bits de origen.
// The new bitmap was created from a known bitmap source so assume that 467 // they use the same density scale 468 bitmap.setDensityScale(source.getDensityScale());
Ahora no puedo parecer recrear el problema pero el hecho que no consigo una excepción cuando getWidth () se llama en el Bitmap original me dice que la fuente no es null.
Aquí está el rastro de la pila entera.
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.my.app/com.my.app.recording.TrackingActivity}: java.lang.NullPointerException at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) at android.app.ActivityThread.access$2300(ActivityThread.java:125) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:123) at android.app.ActivityThread.main(ActivityThread.java:4627) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:521) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.NullPointerException at android.graphics.Bitmap.createBitmap(Bitmap.java:468) at com.my.app.maps.MapFragment.createTabOverlay(MapFragment.java:663) at com.my.app.maps.MapFragment.addMarkersForToolType(MapFragment.java:474) at com.my.app.maps.MapFragment.onActivityCreated(MapFragment.java:405) at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1468) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:931) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088) at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444) at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:551) at com.my.app.recording.TrackingActivity.onStart(TrackingActivity.java:272) at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1129) at android.app.Activity.performStart(Activity.java:3781) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2636) ... 11 more
Mi idea
¿Podría ser algo que ver con mí, no incluyendo diferentes mapas de bits para diferentes densidades de pantalla? Todos los Bitmaps suministrados son para pantallas mdpi.
Noto que también hay un BackStackRecord. ¿Podría ocurrir esto cuando el usuario presiona hacia atrás?
Gracias por adelantado
- Cómo guardar un mapa de bits en el almacenamiento interno
- Envío de imagen por correo electrónico, Android?
- BitmapFactory.decodeStream devuelve siempre null y decodificador skia muestra decodificar devuelto falso
- Cómo adjuntar un mapa de bits al iniciar ACTION_SEND
- Android procesamiento de imágenes de alta resolución
- Cómo enmascarar Bitmap con el sombreado LinearGradient correctamente?
- Convertir archivo de mapa de bits inmutable a mutable Bitmap
- Android: los mapas de bits cargados desde la galería se giran en ImageView
La fuente a la que Bitmap.java:468
en Bitmap.java:468
es de Android 1.5, y probablemente no es tu problema.
v1.5 Bitmap.java:468
bitmap.setDensityScale(source.getDensityScale());
v1.6-v2.2 Bitmap.java:468
Bitmap bm = nativeCreate(null, 0, width, width, height, config.nativeInt, true);
Línea 468 en cualquier cosa más reciente que 2.2 es parte de un bloque javadoc o una función no relacionada, así que supongo que estás viendo la versión 1.6-2.2, no la que estás intentando solucionar.
Lo único en esa línea veo que realmente podría terminar null es config
. En su código, utilice getConfig()
para capturar el objeto de mapa de bits actual. Los documentos para ello muestran:
public final Bitmap.Config getConfig ()
Añadido en API nivel 1
Si la configuración interna del mapa de bits está en uno de los formatos públicos, devuelva esa configuración, de lo contrario devolverá null.
Por lo tanto, es probablemente no encontrar un formato "público", y devolver null, que pasa a createBitmap()
, y sopla su código.
Puede utilizar una configuración estática todo el tiempo, como Bitmap.Config.ARGB_8888
, o hacer el getConfig()
en una línea anterior y null-comprobarlo. Si es nulo, entonces vaya a una configuración de fallback como se acaba de mencionar.
yourSelectedImageBitmap = BitmapFactory.decodeFile (filePath, opciones);
if (yourSelectedImageBitmap != null) { // ----------resize for set in imageView------------ int width = yourSelectedImageBitmap.getWidth(); int height = yourSelectedImageBitmap.getHeight(); int newWidth = 140; int newHeight = 140; // calculate the scale - in this case = 0.4f float scaleWidth = ((float) newWidth) / width; float scaleHeight = ((float) newHeight) / height; Matrix matrix = new Matrix(); // resize the bit map matrix.postScale(scaleWidth, scaleHeight); if (exifOrientation.equals("6")) { matrix.postRotate(90); } Bitmap resizedBitmap = Bitmap.createBitmap(yourSelectedImageBitmap, 0, 0, width, height, matrix, true); image.setImageBitmap(resizedBitmap); // Toast.makeText(getApplicationContext(), // "in the select image loop", 2000).show(); // ----------resize for upload------------ int width1 = yourSelectedImageBitmap.getWidth(); int height1 = yourSelectedImageBitmap.getHeight();
Usted puede dar un intento por esta manera. Después de conseguir la imagen de la fuente de archivo o de la cámara.
y luego haciendo esto.
Matrix matrix1 = new Matrix(); // resize the bit map matrix.postScale(width1, height1); if (exifOrientation.equals("6")) { matrix1.postRotate(90); } Bitmap resizedBitmap1 = Bitmap.createBitmap( yourSelectedImageBitmap, 0, 0, width1, height1, matrix1, true); ByteArrayOutputStream baos = new ByteArrayOutputStream(); resizedBitmap1.compress(Bitmap.CompressFormat.JPEG, 100, baos); byte[] image_bytes = baos.toByteArray(); try { baos.flush(); baos.close(); } catch (IOException e) { e.printStackTrace(); Log.e("~~~~~~~~IOException~~~~~~~~~eeeeee~~~~", "~~~~~~IOException~~~~~~~~~eeeee~~~~" + e.getMessage()); } image_string = Base64.encodeToString(image_bytes, 0);
Espero que esto te ayudará
Usted puede hacer esto:
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.icon); Bitmap bmpCompressed = Bitmap.createScaledBitmap(bitmap, 600, 400, true); ByteArrayOutputStream bos = new ByteArrayOutputStream(); // CompressFormat set up to JPG, you can change to PNG bmpCompressed.compress(CompressFormat.JPEG, 90, bos); imageByteArray = bos.toByteArray();
Creo que esto funcionará
BitmapFactory.Options opt = new BitmapFactory.Options(); opt.inMutable = true; //you have to set bitmap to mutable bmp1 = BitmapFactory.decodeResource(getResources(), R.drawable.map_distance_tag,opt); Bitmap bmOverlay = Bitmap.createBitmap(bmp1.getWidth(), bmp1.getHeight(), Bitmap.Config.ARGB_8888); //if you want to copy the bmp1 to bmOverlay bmOverlay=Bitmap.createScaledBitmap(bmp1, bmp1.getWidth, bmp1.getHeight, false); OR //if did not work replace bmOverlay to this: bmOverlay = Bitmap.createBitmap(bmp1);
Tuve el mismo problema y me estaba volviendo loco. Terminé solucionando el problema cambiando
Bitmap bmOverlay = Bitmap.createBitmap(bmp1.getWidth(), bmp1.getHeight(), bmp1.getConfig());
a
Bitmap bmOverlay = Bitmap.createBitmap(bmp1.getWidth(), bmp1.getHeight(), Bitmap.Config.ARGB_8888);
- Android Listener para detectar cuando se está presionando la pantalla
- Android: Cómo guardar contactos en sdcard como vCard. Sin duplicados?