0

The below code uploads 4 images from a phone/tab gallery to a server and writes the paths to a DB. On testing it, it is currently It is uploading all 4 images if they are 150kb and below. The problem comes in when i try to upload 1Mb images. The app crashes on loading the second image to iv. I have read this Android Bitmaps but i cant figure out how to implement it in my code. Kindly help.

public class MainActivity extends AppCompatActivity {

    Bitmap bitmap1;
    Bitmap bitmap2;
    Bitmap bitmap3;
    Bitmap bitmap4;

    boolean check = true;

    Button SelectImageGallery1;
    Button SelectImageGallery2;
    Button SelectImageGallery3;
    Button SelectImageGallery4;

    Button UploadImageServer;

    ImageView imageView1;
    ImageView imageView2;
    ImageView imageView3;
    ImageView imageView4;

    EditText imageName1;
    EditText imageName2;
    EditText imageName3;
    EditText imageName4;

    ProgressDialog progressDialog;

    String GetImageNameEditText1;
    String GetImageNameEditText2;
    String GetImageNameEditText3;
    String GetImageNameEditText4;

    String ImageName1 = "image_name1";
    String ImageName2 = "image_name2";
    String ImageName3 = "image_name3";
    String ImageName4 = "image_name4";

    String ImagePath1 = "image_path1";
    String ImagePath2 = "image_path2";
    String ImagePath3 = "image_path3";
    String ImagePath4 = "image_path4";

    String ServerUploadPath = "http://ny.com/multiple4/uploadmultiple4.php";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imageView1 = (ImageView) findViewById(R.id.imageView1);
        imageView2 = (ImageView) findViewById(R.id.imageView2);
        imageView3 = (ImageView) findViewById(R.id.imageView3);
        imageView4 = (ImageView) findViewById(R.id.imageView4);

        imageName1 = (EditText) findViewById(R.id.editTextImageName1);
        String strImageName1 = imageName1.getText().toString();
        if (TextUtils.isEmpty(strImageName1)) {
            imageName1.setError("Image Name Must Be Entered");
        }
        imageName2 = (EditText) findViewById(R.id.editTextImageName2);
        String strImageName2 = imageName2.getText().toString();
        if (TextUtils.isEmpty(strImageName2)) {
            imageName2.setError("Image Name Must Be Entered");
        }
        imageName3 = (EditText) findViewById(R.id.editTextImageName3);
        String strImageName3 = imageName3.getText().toString();
        if (TextUtils.isEmpty(strImageName3)) {
            imageName3.setError("Image Name Must Be Entered");
        }
        imageName4 = (EditText) findViewById(R.id.editTextImageName4);
        String strImageName4 = imageName4.getText().toString();
        if (TextUtils.isEmpty(strImageName4)) {
            imageName4.setError("Image Name Must Be Entered");
        }

        SelectImageGallery1 = (Button) findViewById(R.id.buttonSelect1);
        SelectImageGallery2 = (Button) findViewById(R.id.buttonSelect2);
        SelectImageGallery3 = (Button) findViewById(R.id.buttonSelect3);
        SelectImageGallery4 = (Button) findViewById(R.id.buttonSelect4);

        UploadImageServer = (Button) findViewById(R.id.buttonUpload);

        SelectImageGallery1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent();
                intent.setType("image/*");
                intent.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(Intent.createChooser(intent, "Select Image1 From Gallery"), 1);

            }
        });

        SelectImageGallery2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent();
                intent.setType("image/*");
                intent.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(Intent.createChooser(intent, "Select Image4 From Gallery"), 2);
            }
        });

        SelectImageGallery3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent();
                intent.setType("image/*");
                intent.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(Intent.createChooser(intent, "Select Image3 From Gallery"), 3);

            }
        });

        SelectImageGallery4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent();
                intent.setType("image/*");
                intent.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(Intent.createChooser(intent, "Select Image4 From Gallery"), 4);

            }
        });

        UploadImageServer.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                GetImageNameEditText1 = imageName1.getText().toString();
                GetImageNameEditText2 = imageName2.getText().toString();
                GetImageNameEditText3 = imageName3.getText().toString();
                GetImageNameEditText4 = imageName4.getText().toString();
                ImageUploadToServerFunction();
            }
        });

    }

    @Override
    protected void onActivityResult(int RC, int RQC, Intent I) {
        super.onActivityResult(RC, RQC, I);
        if (RC == 1 && RQC == RESULT_OK && I != null && I.getData() != null) {
            Uri uri = I.getData();
            try {
                bitmap1 = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
                //bitmap1 = MediaStore.Images.Media.getBitmap(getContentResolver(), filePath);
                imageView1.setImageBitmap(bitmap1);
            } catch(IOException e) {
                e.printStackTrace();
            }
        }

        if (RC == 2 && RQC == RESULT_OK && I != null && I.getData() != null) {
            Uri uri = I.getData();
            try {
                bitmap2 = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
                //bitmap1 =
                MediaStore.Images.Media.getBitmap(getContentResolver(), filePath);
                imageView2.setImageBitmap(bitmap2);
            } catch(IOException e) {
                e.printStackTrace();
            }
        }

        if (RC == 3 && RQC == RESULT_OK && I != null && I.getData() != null) {
            Uri uri = I.getData();
            byte[] imageAsBytes = null;
            try {
                bitmap3 = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
                //bitmap1 =
                MediaStore.Images.Media.getBitmap(getContentResolver(), filePath);
                imageView3.setImageBitmap(bitmap3);
            } catch(IOException e) {
                e.printStackTrace();
            }
        }
        if (RC == 4 && RQC == RESULT_OK && I != null && I.getData() != null) {
            Uri uri = I.getData();
            try {
                bitmap4 = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
                //bitmap1 =
                MediaStore.Images.Media.getBitmap(getContentResolver(), filePath);
                imageView4.setImageBitmap(bitmap4);
            } catch(IOException e) {
                e.printStackTrace();
            }
        }
    }
    public String getStringImage1(Bitmap bitmap1) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bitmap1.compress(Bitmap.CompressFormat.JPEG, 60, baos);
        byte[] imageBytes = baos.toByteArray();
        String encodedImage1 = Base64.encodeToString(imageBytes, Base64.DEFAULT);
        return encodedImage1;
    }

    public String getStringImage2(Bitmap bitmap2) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bitmap2.compress(Bitmap.CompressFormat.JPEG, 60, baos);
        byte[] imageBytes = baos.toByteArray();
        String encodedImage2 = Base64.encodeToString(imageBytes, Base64.DEFAULT);
        return encodedImage2;
    }
    public String getStringImage3(Bitmap bitmap3) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bitmap3.compress(Bitmap.CompressFormat.JPEG, 60, baos);
        byte[] imageBytes = baos.toByteArray();
        String encodedImage3 = Base64.encodeToString(imageBytes, Base64.DEFAULT);
        return encodedImage3;
    }

    public String getStringImage4(Bitmap bitmap4) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bitmap4.compress(Bitmap.CompressFormat.JPEG, 60, baos);
        byte[] imageBytes = baos.toByteArray();
        String encodedImage4 = Base64.encodeToString(imageBytes, Base64.DEFAULT);
        return encodedImage4;
    }

    public void ImageUploadToServerFunction() {
        final String imageName1 = GetImageNameEditText1.trim();
        final String imageName2 = GetImageNameEditText2.trim();
        final String imageName3 = GetImageNameEditText3.trim();
        final String imageName4 = GetImageNameEditText4.trim();
        final String imageView1 = getStringImage1(bitmap1);
        final String imageView2 = getStringImage2(bitmap2);
        final String imageView3 = getStringImage3(bitmap3);
        final String imageView4 = getStringImage4(bitmap4);

        class AsyncTaskUploadClass extends AsyncTask <Void, Void, String> {

            @Override
            protected void onPreExecute() {

                super.onPreExecute();

                progressDialog = ProgressDialog.show(MainActivity.this, "Image is Uploading", "Please Wait", false, false);
            }

            @Override
            protected void onPostExecute(String string1) {

                super.onPostExecute(string1);

                // Dismiss the progress dialog after done uploading.
                progressDialog.dismiss();

                // Printing uploading success message coming from server on android app.
                Toast.makeText(MainActivity.this, string1, Toast.LENGTH_LONG).show();

                // Setting image as transparent after done uploading.
                ImageView cleared1 = (ImageView) findViewById(R.id.imageView1);
                cleared1.setImageResource(android.R.color.transparent);

                ImageView cleared2 = (ImageView) findViewById(R.id.imageView2);
                cleared2.setImageResource(android.R.color.transparent);

                ImageView cleared3 = (ImageView) findViewById(R.id.imageView3);
                cleared3.setImageResource(android.R.color.transparent);

                ImageView cleared4 = (ImageView) findViewById(R.id.imageView4);
                cleared4.setImageResource(android.R.color.transparent);

            }

            @Override
            protected String doInBackground(Void...params) {
                ImageProcessClass imageProcessClass = new ImageProcessClass();
                HashMap <String, String> HashMapParams = new HashMap <String, String> ();
                HashMapParams.put(ImageName1, imageName1);
                HashMapParams.put(ImageName2, imageName2);
                HashMapParams.put(ImageName3, imageName3);
                HashMapParams.put(ImageName4, imageName4);
                HashMapParams.put(ImagePath1, imageView1);
                HashMapParams.put(ImagePath2, imageView2);
                HashMapParams.put(ImagePath3, imageView3);
                HashMapParams.put(ImagePath4, imageView4);

                String FinalData = imageProcessClass.ImageHttpRequest(ServerUploadPath, HashMapParams);
                return FinalData;
            }
        }
        AsyncTaskUploadClass AsyncTaskUploadClassOBJ = new
        AsyncTaskUploadClass();
        AsyncTaskUploadClassOBJ.execute();
    }

    public class ImageProcessClass {
        public String ImageHttpRequest(String
        requestURL, HashMap <String, String> PData) {
            StringBuilder stringBuilder = new StringBuilder();
            try {
                URL url;
                HttpURLConnection httpURLConnectionObject;
                OutputStream OutPutStream;
                BufferedWriter bufferedWriterObject;
                BufferedReader bufferedReaderObject;
                int RC;
                url = new URL(requestURL);
                httpURLConnectionObject = (HttpURLConnection)
                url.openConnection();
                httpURLConnectionObject.setReadTimeout(19000);
                httpURLConnectionObject.setConnectTimeout(19000);
                httpURLConnectionObject.setRequestMethod("POST");
                httpURLConnectionObject.setDoInput(true);
                httpURLConnectionObject.setDoOutput(true);
                OutPutStream = httpURLConnectionObject.getOutputStream();
                bufferedWriterObject = new BufferedWriter(
                new OutputStreamWriter(OutPutStream, "UTF-8"));
                bufferedWriterObject.write(bufferedWriterDataFN(PData));
                bufferedWriterObject.flush();
                bufferedWriterObject.close();
                OutPutStream.close();
                RC = httpURLConnectionObject.getResponseCode();
                if (RC == HttpsURLConnection.HTTP_OK) {
                    bufferedReaderObject = new BufferedReader(new
                    InputStreamReader(httpURLConnectionObject.getInputStream()));
                    stringBuilder = new StringBuilder();
                    String RC2;
                    while ((RC2 = bufferedReaderObject.readLine()) != null) {
                        stringBuilder.append(RC2);
                    }
                }
            } catch(Exception e) {
                e.printStackTrace();
            }
            return stringBuilder.toString();
        }

        private String bufferedWriterDataFN(HashMap <String, String> HashMapParams) throws UnsupportedEncodingException {
            StringBuilder stringBuilderObject;
            stringBuilderObject = new StringBuilder();
            for (Map.Entry < String, String > KEY: HashMapParams.entrySet()) {
                if (check) check = false;
                else stringBuilderObject.append("&");

                stringBuilderObject.append(URLEncoder.encode(KEY.getKey(), "UTF-8"));
                stringBuilderObject.append("=");

                stringBuilderObject.append(URLEncoder.encode(KEY.getValue(), "UTF-8"));
            }

            return stringBuilderObject.toString();
        }
    }
}

James Z
  • 11,838
  • 10
  • 25
  • 41

1 Answers1

0

Out Of Memory might occur if you are trying to set a bitmap resource as an image to an ImageView because the resource itself might not be that big, as you said 1MB, but when actually it is being inflated its size will be a lot bigger, for the way bitmaps works when its data is extracted in order to be reproduced.

I'm referring to the Loading Large Bitmaps Efficiently content in the Android Developers platform in order to give you a better overview of my suggestions, but you might want also to go a bit broader to get an idea around loading Bitmaps in Android.

I'd suggest you to try to work with the class BitmapFactory.Options in order to minimize the virtual memory used as cache to load the bitmap resources.

Eventually you will need to:

  • read the Bitmap dimensions and type
  • load a scaled down version, or an appropriate version in memory for your ImageView expectations (in size)
denis_lor
  • 5,442
  • 4
  • 20
  • 46