How to upload an image in parse server using parse api in android How to upload an image in parse server using parse api in android android android

How to upload an image in parse server using parse api in android


After struggling for several hours here is code segment works for me.

1. Data Member of activity class

Bitmap bmp;Intent i;Uri BmpFileName = null;

2. Starting the camera. Goal is to start camera activity and BmpFileName to store the referrence to file

String storageState = Environment.getExternalStorageState();if (storageState.equals(Environment.MEDIA_MOUNTED)) {String path = Environment.getExternalStorageDirectory().getName() + File.separatorChar + "Android/data/" + this.getPackageName() + "/files/" + "Doc1" + ".jpg";File photoFile = new File(path);try {if (photoFile.exists() == false) { photoFile.getParentFile().mkdirs();photoFile.createNewFile();}} catch (IOException e) {Log.e("DocumentActivity", "Could not create file.", e);}Log.i("DocumentActivity", path);BmpFileName = Uri.fromFile(photoFile);i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);i.putExtra(MediaStore.EXTRA_OUTPUT, BmpFileName);startActivityForResult(i, 0);

3. Reading contents from Camera output by overriding onActivityResult. Goal is to get bmp variable valuated.

protected void onActivityResult(int requestCode, int resultCode, Intent data) {// TODO Auto-generated method stubsuper.onActivityResult(requestCode, resultCode, data);if (resultCode == RESULT_OK) {try {bmp = MediaStore.Images.Media.getBitmap( this.getContentResolver(), BmpFileName);} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}// Myocode to display image on UI - You can ignoreif (bmp != null)IV.setImageBitmap(bmp);}}

4. On Save event

// MUST ENSURE THAT YOU INITIALIZE PARSEParse.initialize(mContext, "Key1", "Key2");ParseObject pObj = null;ParseFile pFile = null ;pObj = new ParseObject ("Document");pObj.put("Notes", "Some Value");// Ensure bmp has valueif (bmp == null || BmpFileName == null) {Log.d ("Error" , "Problem with image"return;}ByteArrayOutputStream stream = new ByteArrayOutputStream();bmp.compress(CompressFormat.PNG, 100, stream);pFile = new ParseFile("DocImage.jpg", stream.toByteArray());try {pFile.save();pObj.put("FileName", pFile);pObj.save();_mParse.DisplayMessage("Image Saved");} catch (ParseException e) {// TODO Auto-generated catch block_mParse.DisplayMessage("Error in saving image");e.printStackTrace();}

// Finish activity in my case . you may choose some thing elsefinish();

So here are key difference from others

  • I called initialize parse. You may laugh about it but folks have spent hour's debugging code without realize that parse was not initialized
  • Use Save instead of SaveInBackground. I understand that it may hold the activity but that is desired behavior for me and more importantly it works

Let me know if it does not work


Save ParseObject in the background

// ParseObject  ParseObject pObject = new ParseObject("ExampleObject");  pObject.put("myNumber", number);  pObject.put("myString", name);  pObject.saveInBackground(); // asynchronous, no callback

Save in the background with callback

pObject.saveInBackground(new SaveCallback () {   @Override   public void done(ParseException ex) {    if (ex == null) {        isSaved = true;    } else {        // Failed        isSaved = false;    }  }});

Variations of the save...() method include the following:

    saveAllinBackground() saves a ParseObject with or without a callback.    saveAll(List<ParseObject> objects) saves a list of ParseObjects.    saveAllinBackground(List<ParseObject> objects) saves a list of ParseObjects in the     background.    saveEventually() lets you save a data object to the server at some point in the future; use     this method if the Parse cloud is not currently accessible.

Once a ParseObject has been successfully saved on the Cloud, it is assigned a unique Object-ID. This Object-ID is very important as it uniquely identifies that ParseObject instance. You would use the Object-ID, for example, to determine if the object was successfully saved on the cloud, for retrieving and refreshing a given Parse object instance, and for deleting a particular ParseObject.

I hope you will solve your problem..


Parse.initialize(this, "applicationId", "clientKey");     byte[] data = "Sample".getBytes();    //data of your image file comes here     final ParseFile file = new ParseFile(data);     try {        file.save();    } catch (ParseException e) {        // TODO Auto-generated catch block        e.printStackTrace();    }     if (file.isDirty()){                     //exception or error message etc      }     else{         try {            ParseUser.logIn("username", "password");    //skip this if already logged in        } catch (ParseException e2) {            e2.printStackTrace();        }         ParseObject userDisplayImage = new ParseObject("UserDisplayImage");            user = ParseUser.getCurrentUser();            userDisplayImage.put("user", user);     //The logged in User            userDisplayImage.put("displayImage", file); //The image saved previously            try {                userDisplayImage.save();      //image and user object saved in a new table. Check data browser            } catch (ParseException e1) {                // TODO Auto-generated catch block                e1.printStackTrace();            }         //See how to retrieve         ParseQuery query = new ParseQuery("UserDisplayImage");         query.whereEqualTo("user", user);         try {            parseObject = query.getFirst();        } catch (ParseException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }         ParseFile imageFile = null;          imageFile = parseObject.getParseFile("displayImage");          try {            byte[] imgData = imageFile.getData(); //your image data!!        } catch (ParseException e1) {            // TODO Auto-generated catch block            e1.printStackTrace();        }     }