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
- Android Color - ¿Cuánto más oscuro es primaryColorDark que primaryColor?
- Android: No se encontró identificador de recurso para el atributo 'headerView'
- Cómo inflar XML-Layout-File correctamente dentro de Custom ViewGroup?
- Java.lang.IllegalArgumentException: y debe ser <bitmap.height ()
- La imagen de fondo en disposición lineal no está bien dimensionada
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
- ActionLayout para los elementos de la vista de navegación se muestra en el lado derecho
- ¿Por qué la gravedad no funciona cuando se aplica al diseño relativo?
- ¿Es posible hacer que las pestañas de ActionBar sean más altas que la altura de ActionBar? ¿Si es así, cómo?
- Com.android.layoutlib.bridge.MockView no se puede convertir en android.view.ViewGroup
- Android: LinearLayout addView Animación
- Flinging con RecyclerView + AppBarLayout
- Cómo obtener coordenadas x, y
- La función Auto Mirroring for RTL no funciona en las versiones de Android inferiores a 6.0
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);