如何在Android中使用Parse API上传图像到Parse服务器。
如何在Android中使用Parse API上传图像到Parse服务器。
我想在Android中将图片上传到Parse云服务器,但是我无法做到。\n我尝试了以下代码:\n
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();
\n请告诉我如何做到这一点。
如何在Parse服务器上使用Android中的Parse API上传图像
在使用Parse API在Android应用中上传图像时,有时会遇到问题。问题可能是由于以下原因之一导致的:
1. 无法保存图像文件:
在代码中,我们尝试将图像文件保存到Parse服务器上。但是,如果保存操作失败,可能会引发ParseException异常。这可能是由于网络连接问题、服务器错误或其他原因导致的。为了解决这个问题,我们可以通过在catch块中打印异常堆栈跟踪来调试问题。
2. 没有为图像创建列:
在上述代码中,我们创建了一个名为"UserDisplayImage"的新表,用于保存用户的图像和用户对象。然而,在数据浏览器中,我们不会看到为图像创建的任何列。尽管如此,我们仍然可以通过关系表在数据浏览器中下载图像文件。此外,我们还可以直接使用图像的URL访问文件。
3. 可以在同一类中保存图像:
在注册用户时,我们创建了一个名为"User"的类,并保存了用户的字段值。在保存图像时,我们创建了另一个名为"UserDisplayImage"的类。然而,有时我们可能希望在同一类中保存图像。为了实现这一点,我们可以使用Parse对象将图像保存到同一用户类中。
通过在用户创建后或用户创建时使用以下代码来实现在同一类中保存图像的功能:
user = ParseUser.getCurrentUser(); user.put("displayImage", file); user.save(); //在这里处理异常
通过解决上述问题,我们可以成功地使用Parse API在Android应用中上传图像。
问题的原因是用户想要在Android应用中使用Parse API上传图像,但是他们不知道如何处理图像文件。用户询问了其他用户是否应该将图像视为文件,并且如何进行处理。
解决方法是将图像视为文件,并按照Parse的指南对图像文件进行处理。根据Parse的指南,给文件一个带有文件扩展名的名称非常重要,因为这样Parse可以根据文件类型进行处理。所以,如果要存储PNG图像,确保文件名以.png结尾。
下面是解决问题的代码示例:
// 获取要上传的图像文件 File file = new File("path/to/image.png"); // 创建一个ParseFile对象 ParseFile parseFile = new ParseFile(file); // 创建一个ParseObject并设置图像文件 ParseObject pObject = new ParseObject("ImageObject"); pObject.put("image", parseFile); // 保存ParseObject到Parse服务器 pObject.saveInBackground(new SaveCallback() { public void done(ParseException ex) { if (ex == null) { // 上传成功 } else { // 上传失败 } } });
这样,用户就可以使用Parse API在Android应用中上传图像了。
如何在Android中使用Parse API在Parse服务器中上传图像
在经过几个小时的努力后,这是对我有效的代码片段。
1. Activity类的数据成员
Bitmap bmp; Intent i; Uri BmpFileName = null;
2. 启动相机。目标是启动相机活动并将BmpFileName存储到文件的引用中。
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. 通过重写onActivityResult从相机输出中读取内容。目标是获取bmp变量的值。
protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { try { bmp = MediaStore.Images.Media.getBitmap( this.getContentResolver(), BmpFileName); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } // 显示图像在UI上的代码 - 可以忽略 if (bmp != null) IV.setImageBitmap(bmp); } }
4. 在保存事件中
// 必须确保初始化Parse Parse.initialize(mContext, "Key1", "Key2"); ParseObject pObj = null; ParseFile pFile = null ; pObj = new ParseObject ("Document"); pObj.put("Notes", "Some Value"); // 确保bmp有值 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) { _mParse.DisplayMessage("Error in saving image"); e.printStackTrace(); }
关键区别如下:
- 我调用了Parse的初始化方法。你可能会对此嘲笑,但人们在没有意识到Parse未初始化的情况下花了几个小时来调试代码。
- 使用Save而不是SaveInBackground。我知道这可能会阻塞活动,但这是我希望的行为,而且更重要的是它起作用。
如果不起作用,请告诉我。