如何在安卓设备上上传图片到 Parse?

5
我已经能够使用以下代码,从相机中拍摄照片或从图库中选择照片并在ImageView中显示它。现在我需要做的是使用这张照片并将其上传到Parse。我已经在网上搜索了很多方法,但都没有找到正确的方法。请问有人可以帮我吗?是否可以从ImageView中上传图片?谢谢。
```java // 代码示例 ```
protected Button mFromCamera;
protected Button mFromGallery;
protected ImageView mImageView;

private static final int CAMERA_REQUEST = 1888;
private static final int SELECT_PHOTO = 100;

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


//Initialize ImageView
mImageView = (ImageView) findViewById(R.id.ImgPrev);
//Initialize Camera
mFromCamera = (Button) findViewById(R.id.FromCamera);

//use camera
mFromCamera.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(cameraIntent, CAMERA_REQUEST);
    } //use camera end

});

//initialize button
mFromGallery = (Button) findViewById(R.id.FromGallery);

//pick a photo
mFromGallery.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View arg0) {
        Intent photoPickerIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        photoPickerIntent.setType("image/*");
        startActivityForResult(photoPickerIntent, SELECT_PHOTO);
    }
});//pick a photo end
}



//previewing Image
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
    //from the gallery
    case SELECT_PHOTO:
        if (requestCode == SELECT_PHOTO && resultCode == RESULT_OK && null!= data) {
            Uri selectedImage = data.getData();
            String[] filePathColumn = { MediaStore.Images.Media.DATA };

            Cursor cursor = getContentResolver().query(selectedImage,
                    filePathColumn, null, null, null);
            cursor.moveToFirst();

            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            String picturePath = cursor.getString(columnIndex);
            cursor.close();

            mImageView.setImageBitmap(BitmapFactory.decodeFile(picturePath));
        }
        break;
    //from the camera
    case CAMERA_REQUEST:
        if (requestCode == CAMERA_REQUEST && resultCode == RESULT_OK) {
            Bitmap photo = (Bitmap) data.getExtras().get("data");
            mImageView.setImageBitmap(photo);
        }
        break;
}
}//Preview Image End
3个回答

3

阅读您的回答:

我已经按照您之前的代码进行操作。我可以将图像上传到Parse。但是我不知道如何将可绘制源切换为来自相机/图库或图像视图的我的图像。- Stanley Santoso

转化为:

Abhishek Bansal

我理解您的问题不在于解析图像?

尝试回答您的问题:

我不知道如何将可绘制源切换为来自相机/图库或图像视图的我的图像。

1 - R.drawable.androidbegin似乎是您的问题,但实际上您已经有要解析的位图:

从图库 ->

mImageView.setImageBitmap(BitmapFactory.decodeFile(picturePath));

从相机 ->

Bitmap photo = (Bitmap) data.getExtras().get("data");

2 - 因此我建议在代码开头声明一个类型为Bitmap的变量

private Bitmap yourbitmap;

3 - 然后在您的代码中为相册和相机分配位图,并使用它来解析。

...
yourbitmap = BitmapFactory.decodeFile(picturePath);
...
yourbitmap = (Bitmap) data.getExtras().get("data");
...

4 - 最后,您可以像这样使用位图:

//    Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
//                            R.drawable.androidbegin);
    // Convert it to byte
                    ByteArrayOutputStream stream = new ByteArrayOutputStream();
                    // Compress image to lower quality scale 1 - 100
                    yourbitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
                    byte[] image = stream.toByteArray();
           ...

非常感谢,这个方法可行。我没有意识到那些是我的图像源,因为格式看起来非常不同。我能够将上传代码放在onActivityForResult底部的case内。是否可以在onActivityForResult之外执行此操作?我认为我需要在onCreate中执行此操作,以便在单击时解析其他信息(用户名和其他内容),使它们进入同一个对象/类。而且,如果我从图库中选择了一张图片,然后改变主意想要拍照,那么我将上传两张图片。我该如何做才能只上传一张图片? - stanley santoso
你好,是的,你可以将上传代码放在自己的函数中,然后从任何地方引用它。例如:private myUploading() { // 将其转换为字节 ByteArrayOutputStream stream = new ByteArrayOutputStream(); // 将图像压缩到较低质量比例1-100 yourbitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); byte[] image = stream.toByteArray(); ... } 在每个break;之前,在你的onActivityResult中调用上传函数:myUploading(); 就这样。 - mourad
谢谢您的建议。但是,我完全迷失在试图理解它的过程中。当我将代码放在onCreate中时,大多数引用无法工作,因为它们在onActivityForResult下面。而我又不能将onActivityForResult带到onCreate中。您能给我提供一个示例代码吗? - stanley santoso
另外,在onCreate中放置“private void myUploading(){...}”似乎需要在括号()内放置一些内容。我应该放什么?如何调用myUploading()?只写“myUploading”似乎不起作用。 - stanley santoso
谢谢 Stanley 给了绿色标记,非常感谢。现在回答你的问题:你可以向函数 myUploading() {...} 添加参数。例如,你可以添加 myUploading(String myname, int myage) { ... },这样函数就可以上传图片,同时还包括姓名和年龄。然后当你调用新的 myUploading() 函数时,需要调用 myUploading(name, age)。 - mourad
显示剩余6条评论

2

互联网上有很多好的教程可用。基本上,您需要执行以下操作:

Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
                        R.drawable.androidbegin);
                // Convert it to byte
                ByteArrayOutputStream stream = new ByteArrayOutputStream();
                // Compress image to lower quality scale 1 - 100
                bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
                byte[] image = stream.toByteArray();

                // Create the ParseFile
                ParseFile file = new ParseFile("androidbegin.png", image);
                // Upload the image into Parse Cloud
                file.saveInBackground();

                // Create a New Class called "ImageUpload" in Parse
                ParseObject imgupload = new ParseObject("ImageUpload");

                // Create a column named "ImageName" and set the string
                imgupload.put("ImageName", "AndroidBegin Logo");

                // Create a column named "ImageFile" and insert the image
                imgupload.put("ImageFile", file);

                // Create the class and the columns
                imgupload.saveInBackground();

来源: 这篇教程

同时参考这个问题:如何使用Parse API在Android中上传图像到Parse服务器


我已经按照你之前提供的代码进行了操作。我成功地将图片上传到了Parse。但是我不知道如何将可绘制源切换为来自相机/图库或ImageView的图片。 - stanley santoso

0

点击这里获取AsyncHttpClient库并上传您的图片。它可以快速上传您的图片。

public void uploadImage(Bitmap img_bit)
{
    AsyncHttpClient imgupload = new AsyncHttpClient();
    RequestParams params = new RequestParams();
        if (img_bit != null) {

            byte[] imagebyte;
            ByteArrayOutputStream bao = new ByteArrayOutputStream();
            img_bit.compress(Bitmap.CompressFormat.PNG, 100, bao);
            imagebyte = bao.toByteArray();
            params.put("image", new ByteArrayInputStream(imagebyte),   "test"+ System.currentTimeMillis() + ".png");
        }
        imgupload.post("url",params, new AsyncHttpResponseHandler() {

                            @Override
                            public void onSuccess(int arg0, Header[] arg1,
                                    byte[] arg2) {
                                System.out.println("Image Upload successfully");
                            }

                            @Override
                            public void onFailure(int arg0, Header[] arg1,
                                    byte[] arg2, Throwable arg3) {
                                System.out.println("faile the data");
                            }
                        });


     }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接