how do you pass images (bitmaps) between android activities using bundles?

后端 未结 9 1114
自闭症患者
自闭症患者 2020-11-22 09:56

Suppose I have an activity to select an image from the gallery, and retrieve it as a BitMap, just like the example: here

Now, I want to pass this BitMap to be used i

相关标签:
9条回答
  • 2020-11-22 10:33

    Bitmap is Parcelable so you can add using [putExtra(String,Parcelable)][2] method, But not sure it is a best practice, If it is large size data it is better to store in a single place and use from both activities.

    [2]: http://developer.android.com/reference/android/content/Intent.html#putExtra(java.lang.String, android.os.Parcelable)

    0 讨论(0)
  • 2020-11-22 10:34

    Write this code from where you want to Intent into next activity.

        yourimageView.setDrawingCacheEnabled(true); 
        Drawable drawable = ((ImageView)view).getDrawable(); 
        Bitmap bitmap = imageView.getDrawingCache();
        Intent intent = new Intent(getBaseContext(), NextActivity.class);
        intent.putExtra("Image", imageBitmap);
    

    In onCreate Function of NextActivity.class

    Bitmap hotel_image;
    Intent intent = getIntent();
    hotel_image= intent.getParcelableExtra("Image");
    
    0 讨论(0)
  • 2020-11-22 10:36

    As suggested by @EboMike I saved the bitmap in a file named myImage in the internal storage of my application not accessible my other apps. Here's the code of that part:

    public String createImageFromBitmap(Bitmap bitmap) {
        String fileName = "myImage";//no .png or .jpg needed
        try {
            ByteArrayOutputStream bytes = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
            FileOutputStream fo = openFileOutput(fileName, Context.MODE_PRIVATE);
            fo.write(bytes.toByteArray());
            // remember close file output
            fo.close();
        } catch (Exception e) {
            e.printStackTrace();
            fileName = null;
        }
        return fileName;
    }
    

    Then in the next activity you can decode this file myImage to a bitmap using following code:

    Bitmap bitmap = BitmapFactory.decodeStream(context
                        .openFileInput("myImage"));//here context can be anything like getActivity() for fragment, this or MainActivity.this
    

    Note A lot of checking for null and scaling bitmap's is ommited.

    0 讨论(0)
  • 2020-11-22 10:39

    You can pass image in short without using bundle like this This is the code of sender .class file

    Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher;
    Intent intent = new Intent();
    Intent.setClass(<Sender_Activity>.this, <Receiver_Activity.class);
    Intent.putExtra("Bitmap", bitmap);
    startActivity(intent);
    

    and this is receiver class file code.

    Bitmap bitmap = (Bitmap)this.getIntent().getParcelableExtra("Bitmap");
    ImageView viewBitmap = (ImageView)findViewById(R.id.bitmapview);
    viewBitmap.setImageBitmap(bitmap);
    

    No need to compress. that's it

    0 讨论(0)
  • 2020-11-22 10:40

    Activity

    To pass a bitmap between Activites

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

    And in the Activity class

    Bitmap bitmap = getIntent().getParcelableExtra("bitmap");
    

    Fragment

    To pass a bitmap between Fragments

    SecondFragment fragment = new SecondFragment();
    Bundle bundle = new Bundle();
    bundle.putParcelable("bitmap", bitmap);
    fragment.setArguments(bundle);
    

    To receive inside the SecondFragment

    Bitmap bitmap = getArguments().getParcelable("bitmap");
    

    Transferring large bitmap (Compress bitmap)

    If you are getting failed binder transaction, this means you are exceeding the binder transaction buffer by transferring large element from one activity to another activity.

    So in that case you have to compress the bitmap as an byte's array and then uncompress it in another activity, like this

    In the FirstActivity

    Intent intent = new Intent(this, SecondActivity.class);
    
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.JPG, 100, stream);
    byte[] bytes = stream.toByteArray(); 
    intent.putExtra("bitmapbytes",bytes);
    

    And in the SecondActivity

    byte[] bytes = getIntent().getByteArrayExtra("bitmapbytes");
    Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
    
    0 讨论(0)
  • 2020-11-22 10:40

    in first.java

    Intent i = new Intent(this, second.class);
                        i.putExtra("uri",uri);
                        startActivity(i);
    

    in second.java

    Bundle bd = getIntent().getExtras();
            Uri uri = bd.getParcelable("uri");
            Log.e("URI", uri.toString());
            try {
                Bitmap bitmap = Media.getBitmap(this.getContentResolver(), uri);
                imageView.setImageBitmap(bitmap);
    
            } 
            catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
    0 讨论(0)
提交回复
热议问题