Je souhaite télécharger une image dans Parse Cloud Server sous Android. Mais je suis incapable de le faire.
J'ai essayé le code suivant:
Drawable drawable = getResources().getDrawable(R.drawable.profilepic) ;
Bitmap bitmap = (Bitmap)(Bitmap)drawable()
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] data = stream.toByteArray();
ParseFile imageFile = new ParseFile("image.png", data);
imageFile.saveInBackground();
S'il vous plaît laissez-moi savoir comment puis-je le faire.
J'ai ajouté une prime pour trouver le meilleur code définitif pour ce problème commun
Enregistrer ParseObject en arrière-plan
// ParseObject ParseObject pObject = new ParseObject("ExampleObject"); pObject.put("myNumber", number); pObject.put("myString", name); pObject.saveInBackground(); // asynchronous, no callback
Enregistrer en arrière-plan avec rappel
pObject.saveInBackground(new SaveCallback () { @Override public void done(ParseException ex) { if (ex == null) { isSaved = true; } else { // Failed isSaved = false; } } });
Les variantes de la méthode save ... () sont les suivantes:
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.
Une fois qu'un objet ParseObject a été enregistré avec succès sur le nuage, un identifiant d'objet unique lui est attribué. Cet objet-ID est très important car il identifie de manière unique cette instance ParseObject. Vous utiliseriez par exemple Object-ID pour déterminer si l'objet a été correctement enregistré sur le cloud, pour récupérer et actualiser une instance d'objet Parse donnée et pour supprimer un objet ParseObject particulier.
J'espère que tu vas résoudre ton problème ..
Après avoir lutté pendant plusieurs heures, voici que le segment de code fonctionne pour moi.
1. Data Membre de la classe d'activité
Bitmap bmp;
Intent i;
Uri BmpFileName = null;
2. Mise en marche de la caméra. L'objectif est de démarrer l'activité de la caméra et BmpFileName pour stocker la référence dans un fichier
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. Lecture du contenu de la sortie de la caméra en remplaçant onActivityResult. Le but est de faire évaluer la variable bmp.
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
try {
bmp = MediaStore.Images.Media.getBitmap( this.getContentResolver(), BmpFileName);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// Myocode to display image on UI - You can ignore
if (bmp != null)
IV.setImageBitmap(bmp);
}
}
4. Sur l'événement Save
// MUST ENSURE THAT YOU INITIALIZE PARSE
Parse.initialize(mContext, "Key1", "Key2");
ParseObject pObj = null;
ParseFile pFile = null ;
pObj = new ParseObject ("Document");
pObj.put("Notes", "Some Value");
// Ensure bmp has value
if (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();
}
// Termine l'activité dans mon cas. vous pouvez choisir autre chose finish ();
Alors, voici la différence clé des autres
Faites-moi savoir si cela ne fonctionne pas
Utilisez-le comme ça
//Convert Bitmap to Byte array --For Saving Image to Parse Db. */
Bitmap profileImage= "your bitmap";
ByteArrayOutputStream blob = new ByteArrayOutputStream();
profileImage.compress(CompressFormat.PNG, 0 /* ignored for PNG */,blob);
imgArray = blob.toByteArray();
//Assign Byte array to ParseFile
parseImagefile = new ParseFile("profile_pic.png", imgArray);
parseUser.getCurrentUser().put("columname in parse db", parseImagefile);
parseUser.getCurrentUser().saveInBackground();
J'espère que cela t'aidera..
Code simple de Imageupload et retriving en utilisant Glide à analyser.
Image Upload
destination_profile
est l'objet Fichier de votre souhait de télécharger le chemin de l'image.
ParseUser currentUser = ParseUser.getCurrentUser();
if (destination_profile != null) {
Glide.with(getActivity()).load(destination_profile.getAbsolutePath()).asBitmap().toBytes().centerCrop().into(new SimpleTarget<byte[]>() {
@Override
public void onResourceReady(byte[] resource, GlideAnimation<? super byte[]> glideAnimation) {
final ParseFile parseFile = new ParseFile(destination_profile.getName(), resource);
parseFile.saveInBackground(new SaveCallback() {
@Override
public void done(ParseException e) {
currentUser.put("picture", parseFile);
currentUser.saveInBackground(new SaveCallback() {
@Override
public void done(ParseException e) {
showToast("Profile image upload success");
}
});
}
});
}
});
}
Retrouver des images
img_userProfilePicture_bg
est un objet de ImageView où vous voulez définir une image.
ParseUser currentUser = ParseUser.getCurrentUser();
if (currentUser.has("picture")) {
ParseFile imageFile = (ParseFile) currentUser.get("picture");
imageFile.getDataInBackground(new GetDataCallback() {
public void done(final byte[] data, ParseException e) {
if (e == null) {
Glide.with(getActivity()).load(data).centerCrop().into(img_userProfilePicture_bg);
} else {
// something went wrong
}
}
});
}
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();
}
}
En supposant que vous ayez votre fichier bitmap bitmap
.
ParseObject object = new ParseObject("NameOfClass");
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
byte[] scaledData = stream.toByteArray();
ParseFile image = new ParseFile("image.jpeg",scaledData);
image.saveInBackground(new SaveCallback() {
@Override
public void done(ParseException e) {
if (e==null)
//Image has been saved as a parse file.
else
//Failed to save the image as parse file.
}
});
object.put("images",image);
object.saveInBackground(new SaveCallback() {
@Override
public void done(ParseException e) {
if (e==null)
//Image has been successfuly uploaded to Parse Server.
else
//Error Occured.
}
});
Il est important de convertir le bitmap en byte[]
, puis de télécharger le fichier d'analyse avant de l'associer à l'objet d'analyse.