How to send large byte arrays between activities in Android?

后端 未结 3 1191
我在风中等你
我在风中等你 2020-12-11 03:36

I need to send byte[] data from Activity1 to Activity2, in order to writedata(\"FileOutputStream.write(data)\") in a jpg

相关标签:
3条回答
  • 2020-12-11 04:08
    1. Create a temporary file.
    2. Pass the file path to the Other Activity.
    3. Get the path and load the image.

    Activity 1 :

        //creates the temporary file and gets the path
    String filePath= tempFileImage(context,yourBitmap,"name");
    
    
    
    Intent intent = new Intent(context, Activity2.class);
    
    //passes the file path string with the intent 
    intent.putExtra("path", filePath);
    
    
    startActivity(intent);
    

    Use this method to create the file:

       //creates a temporary file and return the absolute file path
    public static String tempFileImage(Context context, Bitmap bitmap, String name) {
    
        File outputDir = context.getCacheDir();
        File imageFile = new File(outputDir, name + ".jpg");
    
        OutputStream os;
        try {
            os = new FileOutputStream(imageFile);
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);
            os.flush();
            os.close();
        } catch (Exception e) {
            Log.e(context.getClass().getSimpleName(), "Error writing file", e);
        }
    
        return imageFile.getAbsolutePath();
    }
    

    Activity 2 :

    //gets the file path
    String filePath=getIntent().getStringExtra("path");
    
    //loads the file
    File file = new File(filePath);
    

    Finally load the image:

    Picasso.with(context).load(file).fit().centerCrop().into(imageView);
    

    Or:

    Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
    imageView.setImageBitmap(bitmap);
    
    0 讨论(0)
  • 2020-12-11 04:13

    I had the same problem. In short: subclass the Application (or create a helper singleton), use it (<application android:name=".App" .../> in manifest.xml) and store the image data there.

    App.java snippet:

    public final class App extends Application {
        private static App sInstance;
        private byte[] mCapturedPhotoData;
    
        // Getters & Setters
        public byte[] getCapturedPhotoData() {
            return mCapturedPhotoData;
        }
    
        public void setCapturedPhotoData(byte[] capturedPhotoData) {
            mCapturedPhotoData = capturedPhotoData;
        }
    
        // Singleton code
        public static App getInstance() { return sInstance; }
    
        @Override
        public void onCreate() {
            super.onCreate();
            sInstance = this;
        }
    }
    

    Camera Activity saves the data:

    private Camera.PictureCallback mJpegCaptureCallback = new Camera.PictureCallback() {
        @Override
        public void onPictureTaken(byte[] data, Camera camera) {
            // We cannot pass the large buffer via intent's data. Use App instance.
            App.getInstance().setCapturedPhotoData(data);
            setResult(RESULT_OK, new Intent());
            finish();
        }
    };
    

    Parent Activity reads the data:

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    
        if (requestCode == RequestCode.CAPTURE && resultCode == RESULT_OK) {
            // Read the jpeg data
            byte[] jpegData = App.getInstance().getCapturedPhotoData();
            App.log("" + jpegData.length);
    
            // Do stuff
    
            // Don't forget to release it
            App.getInstance().setCapturedPhotoData(null);
        }
    }
    
    0 讨论(0)
  • 2020-12-11 04:24

    Following are the steps:

    1) Create table in sqlite with byte and id columns 2) Save this byte and his id (you will give) from Activity 1 3) Go to Activity 2 (do not forget to send parameter id) 4) In Activity 2 get this parameter from intent and query database using id to get you byte.

    I hope this helps.

    0 讨论(0)
提交回复
热议问题