Paso de mapa de bits entre dos actividades

Estoy desarrollando una aplicación de pintura en la que quiero pasar una imagen de mapa de bits de una actividad a otra, pero el proyecto no está respondiendo. Convertido la captura de pantalla de diseño relativo en un mapa de bits y pasar a través de intención, pero el problema no se resuelve. Aquí está mi código

DibujoActividad

package com.newdrawing; public class DrawingActivity extends Activity { private Bitmap mBitmap; private Canvas mCanvas; private Path mPath; private Paint mBitmapPaint; private Paint mPaint; MyDrawView myDrawView; RelativeLayout parent; Bitmap bitmap; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_drawing); parent = (RelativeLayout) findViewById(R.id.singleparent); myDrawView = new MyDrawView(this); parent.addView(myDrawView); Activity context; //RelativeLayout item = (RelativeLayout)findViewById(R.id.item); View child = getLayoutInflater().inflate(R.layout.trans, null); parent.addView(child); } public void color(View v) { switch (v.getId()) { case R.id.button3: parent.setBackgroundColor(Color.RED); break; case R.id.button4: parent.setBackgroundColor(Color.GREEN); break; case R.id.button5: parent.setBackgroundColor(Color.BLUE); break; } } public void save(View v) { parent.setDrawingCacheEnabled(true); bitmap=parent.getDrawingCache(); parent.setDrawingCacheEnabled(false); Log.e("Bitmap",String.valueOf(bitmap)); // send(); //Canvas c = new Canvas(bitmap); //.draw(c); // File outputFile; // Where to save it //FileOutputStream out = new FileOutputStream(imageFile); // boolean success = bitmap.compress(CompressFormat.PNG, 100, out); // out.close(); Intent i = new Intent(this, ImageActivity.class); ByteArrayOutputStream bs = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 50, bs); byte[] byteArray = bs.toByteArray(); i.putExtra("byteArray", byteArray); startActivity(i); } private void send() { Intent i9=new Intent(DrawingActivity.this,ImageActivity.class); i9.putExtra("Image",bitmap); startActivity(i9); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_drawing, menu); return true; } public class MyDrawView extends View { public MyDrawView(Context c) { super(c); mPath = new Path(); mBitmapPaint = new Paint(Paint.DITHER_FLAG); mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setDither(true); mPaint.setColor(0xFF000000); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeJoin(Paint.Join.ROUND); mPaint.setStrokeCap(Paint.Cap.ROUND); mPaint.setStrokeWidth(3); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); mCanvas = new Canvas(mBitmap); } @Override protected void onDraw(Canvas canvas) { canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint); canvas.drawColor(Color.TRANSPARENT); canvas.drawPath(mPath, mPaint); } private float mX, mY; private static final float TOUCH_TOLERANCE = 4; private void touch_start(float x, float y) { mPath.reset(); mPath.moveTo(x, y); mX = x; mY = y; } private void touch_move(float x, float y) { float dx = Math.abs(x - mX); float dy = Math.abs(y - mY); if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) { mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2); mX = x; mY = y; } } private void touch_up() { mPath.lineTo(mX, mY); // commit the path to our offscreen mCanvas.drawPath(mPath, mPaint); // kill this so we don't double draw mPath.reset(); } @Override public boolean onTouchEvent(MotionEvent event) { float x = event.getX(); float y = event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: touch_start(x, y); invalidate(); break; case MotionEvent.ACTION_MOVE: touch_move(x, y); invalidate(); break; case MotionEvent.ACTION_UP: touch_up(); invalidate(); break; } return true; } public void clear(){ mBitmap.eraseColor(Color.TRANSPARENT); invalidate(); System.gc(); } } } 

ImageActivity

 package com.newdrawing; public class ImageActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_image); Intent i = getIntent(); ImageView img=(ImageView)findViewById(R.id.image11); /* if(getIntent().hasExtra("byteArray")) { Bitmap b = BitmapFactory.decodeByteArray( getIntent().getByteArrayExtra("byteArray"),0,getIntent().getByteArrayExtra("byteArray").length); img.setImageBitmap(b); Log.e("Bitmap",String.valueOf(b)); }*/ Bundle extras = getIntent().getExtras(); byte[] byteArray = extras.getByteArray("byteArray"); Bitmap bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length); img.setImageBitmap(bmp); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_image, menu); return true; } } 

Informe Locat

 10-16 10:39:22.653: E/AndroidRuntime(339): FATAL EXCEPTION: main 10-16 10:39:22.653: E/AndroidRuntime(339): java.lang.IllegalStateException: Could not execute method of the activity 10-16 10:39:22.653: E/AndroidRuntime(339): at android.view.View$1.onClick(View.java:2072) 10-16 10:39:22.653: E/AndroidRuntime(339): at android.view.View.performClick(View.java:2408) 10-16 10:39:22.653: E/AndroidRuntime(339): at android.view.View$PerformClick.run(View.java:8816) 10-16 10:39:22.653: E/AndroidRuntime(339): at android.os.Handler.handleCallback(Handler.java:587) 10-16 10:39:22.653: E/AndroidRuntime(339): at android.os.Handler.dispatchMessage(Handler.java:92) 10-16 10:39:22.653: E/AndroidRuntime(339): at android.os.Looper.loop(Looper.java:123) 10-16 10:39:22.653: E/AndroidRuntime(339): at android.app.ActivityThread.main(ActivityThread.java:4627) 10-16 10:39:22.653: E/AndroidRuntime(339): at java.lang.reflect.Method.invokeNative(Native Method) 10-16 10:39:22.653: E/AndroidRuntime(339): at java.lang.reflect.Method.invoke(Method.java:521) 10-16 10:39:22.653: E/AndroidRuntime(339): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 10-16 10:39:22.653: E/AndroidRuntime(339): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 10-16 10:39:22.653: E/AndroidRuntime(339): at dalvik.system.NativeStart.main(Native Method) 10-16 10:39:22.653: E/AndroidRuntime(339): Caused by: java.lang.reflect.InvocationTargetException 10-16 10:39:22.653: E/AndroidRuntime(339): at com.newdrawing.DrawingActivity.save(DrawingActivity.java:91) 10-16 10:39:22.653: E/AndroidRuntime(339): at java.lang.reflect.Method.invokeNative(Native Method) 10-16 10:39:22.653: E/AndroidRuntime(339): at java.lang.reflect.Method.invoke(Method.java:521) 10-16 10:39:22.653: E/AndroidRuntime(339): at android.view.View$1.onClick(View.java:2067) 10-16 10:39:22.653: E/AndroidRuntime(339): ... 11 more 10-16 10:39:22.653: E/AndroidRuntime(339): Caused by: java.lang.IllegalStateException: Can't compress a recycled bitmap 10-16 10:39:22.653: E/AndroidRuntime(339): at android.graphics.Bitmap.checkRecycled(Bitmap.java:180) 10-16 10:39:22.653: E/AndroidRuntime(339): at android.graphics.Bitmap.compress(Bitmap.java:572) 10-16 10:39:22.653: E/AndroidRuntime(339): ... 15 more 

Usted puede simplemente intentar con abajo –

 Intent i = new Intent(this, Second.class) i.putExtra("Image", bitmap); startActivity(i) 

Y, en la Second.class

 Bitmap bitmap = (Bitmap) intent.getParcelableExtra("Image"); 

Echa un vistazo aquí Si desea comprimir su Bitmap antes de enviar a la siguiente actividad sólo tiene un vistazo a continuación –

 Intent i = new Intent(this, NextActivity.class); Bitmap b; // your bitmap ByteArrayOutputStream bs = new ByteArrayOutputStream(); b.compress(Bitmap.CompressFormat.PNG, 50, bs); i.putExtra("byteArray", bs.toByteArray()); startActivity(i); 

En su nextactivity –

 if(getIntent().hasExtra("byteArray")) { ImageView previewThumbnail = new ImageView(this); Bitmap b = BitmapFactory.decodeByteArray( getIntent().getByteArrayExtra("byteArray"),0,getIntent() .getByteArrayExtra("byteArray").length); previewThumbnail.setImageBitmap(b); } 

He contestado una pregunta similar en este post SO. Mi solución guardará la imagen en el almacenamiento interno del dispositivo inaccesible por otras aplicaciones (en teléfonos sin enrutamiento). Entonces podemos simplemente decodificar el archivo y mostrarlo en imageview. Evita la excepción TranscationTooLarge, ya que no se puede exceder el límite de 1mb del paquete de paso.

Creo que para la mayoría de los casos, está bien poner el mapa de bits en una referencia estática que debe ser null-ed cuando la actividad de recepción ya no lo necesita.

De esta manera, es muy rápido y no necesita ser convertido o codificado y decodificado. También no deja rastros detrás.

Si sus imágenes son estáticas y en la carpeta dibujable etc Así que envíe el mapa de bits de la intención de próxima actividad muy costoso (Para la máquina :)) Así que ahora es el mejor enfoque es en primer lugar crear string-array en strings.xml como aquí.

 <resources> <string name="app_name">Gallery App</string> <string-array name="images"> <item>@drawable/img1</item> <item>@drawable/img2</item> <item>@drawable/img3</item> <item>@drawable/img4</item> <item>@drawable/img5</item> <item>@drawable/img6</item> </string-array> </resources> 

A continuación, en su actividad para obtener la lista de imágenes relacionadas con las images que matriz declarado en la parte superior.

1: -Declare la instancia de TypeArray typeArray

2: typeArray = getResources().obtainTypedArray(R.array.images);

3: -Declare su lista y agregue cada artículo uno por uno ->

  ArrayList list = new ArrayList(); for (int i = 0 ;i< typedArray.length() ; i++){ Bitmap bitmap = BitmapFactory.decodeResource(getResources(),typedArray.getResourceId(i ,-1)); list.add(bitmap); } 

4: -Por supuesto ahora establecerás esta lista en tu ArrayAdapter

 view.setAdapter(new ArrayAdapter(this , R.layout.viewImages , list)); 

5: -Enviar imagen de mapa de bits cliked a su próxima actividad

  view.setOnItemClickedListener(new AdapterView.OnItemClickedListener(){ @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Intent i = new Intent(MainActivity.this , DetailedImageActivity.class); int imageId = typedArray.getResourceId(position , -1); i.putExtra("imageId",imageId) ; Log.i("ResourceId ","here"); startActivity(i); } }); 

6: -Recieve su Id de mapa de bits y obtener su imagen de mapa de bits

 public class DetailedImageActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_detailed_image); ImageView imageView = (ImageView) findViewById(R.id.detailImageView); String title = getIntent().getStringExtra("title"); int imageId = getIntent().getExtras().getInt("imageId") ; Bitmap image = BitmapFactory.decodeResource(getResources() ,imageId); imageView.setImageBitmap(image); } } 

Hay muchas maneras:

1}

Bitmap implementa Parcelable, por lo que siempre se puede pasar en la intención:

 Intent intent = new Intent(this, NewActivity.class); intent.putExtra("BitmapImage", bitmap); 

Y recuperarlo en el otro extremo:

 Intent intent = getIntent(); Bitmap bitmap = (Bitmap) intent.getParcelableExtra("BitmapImage"); 

2)

Convertirlo en una matriz de bytes antes de agregarlo a la intención, enviarlo y decodificar.

// Convertir en matriz de bytes

 ByteArrayOutputStream stream = new ByteArrayOutputStream(); bmp.compress(Bitmap.CompressFormat.PNG, 100, stream); byte[] byteArray = stream.toByteArray(); Intent in1 = new Intent(this, Activity2.class); in1.putExtra("image",byteArray); 

Luego en la Actividad 2:

 byte[] byteArray = getIntent().getByteArrayExtra("image"); Bitmap bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length); 

En su logcat se indica

 10-16 10:39:22.653: E/AndroidRuntime(339): Caused by: java.lang.IllegalStateException: Can't compress a recycled bitmap 10-16 10:39:22.653: E/AndroidRuntime(339): at android.graphics.Bitmap.checkRecycled(Bitmap.java:180) 10-16 10:39:22.653: E/AndroidRuntime(339): at android.graphics.Bitmap.compress(Bitmap.java:572) 

Tu mapa de bits se recicló antes de pasarlo a ImageActivity. Usted podría hacer el mapa de bits estático por lo que no sería reciclado.

Puede utilizar bundle para pasar el mapa de bits de una actividad a otra

Agregue su imagen en matriz de bytes:

 ArrayList<byte[]> image=new ArrayList<byte[]>(); Bundle b = new Bundle(); Intent it=new Intent(getBaseContext(),your.class); b.putByteArray("image", image.get(position)); it.putExtras(b); startActivity(it); 

Y conseguir su imagen adentro en crear de la actividad del receptor del paquete

Lo estoy buscando tanto y finalmente encuentro la respuesta en https://eazyprogramming.blogspot.com/2013/01/passing-image-between-activities.html#comment-form

En Primera Actividad

 Intent intent=new Intent(FirstClass.this, SecondClass.class); Bundle bundle=new Bundle(); bundle.putInt("image",R.drawable.ic_launcher); intent.putExtras(bundle); startActivity(intent); 

En Segunda Actitud:

 Bundle bundle=this.getIntent().getExtras(); int pic=bundle.getInt("image"); v.setImageResource(pic); 

Otro método: en Primera Actividad:

 Bundle extras = getIntent().getExtras(); byte[] b = extras.getByteArray("picture"); Bitmap bmp = BitmapFactory.decodeByteArray(b, 0, b.length); ImageView image = (ImageView) findViewById(R.id.imageView1); image.setImageBitmap(bmp); 

En Segunda Actitud:

 Bundle extras = getIntent().getExtras();byte[] b = extras.getByteArray("picture");Bitmap bmp = BitmapFactory.decodeByteArray(b, 0, b.length);ImageView image = (ImageView) findViewById(R.id.imageView1); 
  • Android: cómo usar el color del estilo en XML de otro diseño
  • ¿Por qué view.onLayout () se llama repetitivamente cuando se cambia = false?
  • Android: cómo cambiar layout_x, layout_y en un AbsoluteLayout dinámicamente?
  • Necesita utilizar un tema Theme.AppCompat (o descendente) con esta actividad
  • Android: inflar un diseño y escribirlo en PDF produce un PDF en blanco
  • Barra de herramientas transparente de Android sobre un ImageView
  • Admob bannner anuncios no tomar todo el ancho
  • Cómo habilitar el zoom webview detrás del diseño lineal en android?
  • Hacer transparente el diálogo del diálogo de alerta
  • ¿Por qué getLocationOnScreen () y getLocationInWindow () devuelven los mismos valores?
  • LinearLayout no se expande dentro de ScrollView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.