将 Android Phone 图库中的图像保存到 Parse - 无法保存 .jpg 照片

Save an image from the gallery of an Android Phone to Parse - Can't save .jpg photos

this tutorial and the second answer of this question in SO, I managed to save a photo that I chose from my gallery to my object in Parse 的以下部分之后。

问题是我保存的照片有 .PNG 扩展名(它只是一张截图)。 当我试图从相机文件夹中选择一张普通照片时,没有保存任何东西,出现异常。

所有其他照片的扩展名是 .jpg 不是 .jpeg

正因为如此,我试着放了if 语句,这样我就可以检查照片的类型。 以下代码的结果是,当我选择 .JPG 照片时, 数据类型为 NULL.

但是,我如何设法将 .jpg 照片保存在我的 Parse 对象中?


在我的 Activity 中,我有 2 个按钮。当您按下第一个 ( sign_in ) 时,监听器会正确地检查我页面中其他数据的所有检查,然后如果所有数据都正常,它会调用一个函数 ( postData() ) ,其中将通过对象进行保存以进行解析。

第二个按钮是关于从图库中添加照片。在我的 .java activity 中,我有这个确切的听众:

 picture.setOnClickListener(new View.OnClickListener() {

                public void onClick(View view) {
                    startActivityForResult(new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI), GET_FROM_GALLERY);
                }
            });

这是从按钮的 onClick 函数调用的函数:

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);


        //Detects request codes
        if(requestCode==GET_FROM_GALLERY && resultCode == Activity.RESULT_OK) {
            Uri selectedImage = data.getData();

            selectedImageType =data.getType();
            Toast.makeText(SignUpActivity.this, "Type: "+selectedImageType,
                    Toast.LENGTH_SHORT).show();
            try {
                bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), selectedImage);

                // Convert it to byte
                ByteArrayOutputStream stream = new ByteArrayOutputStream();
                // Compress image to lower quality scale 1 - 100
                if (selectedImageType == "JPEG"){
                    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);

                    // bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
                    image = stream.toByteArray();
                }
                else if (selectedImageType == "JPG" || selectedImageType == "jpg"){
                    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);

                    // bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
                    image = stream.toByteArray();
                }
                else  if (selectedImageType == "PNG") {
                    bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);

                    // bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
                    image = stream.toByteArray();
                }
                else{
                    Toast.makeText(SignUpActivity.this, "Please pick a JPEG or PNG photo!",
                            Toast.LENGTH_SHORT).show();
                }

            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

这是保存数据的函数:

 public void postData(final String username,final String password,final String email,final String gender,final String age) {
        ParseObject user = new ParseObject("users");
        user.put("username", username);
        user.put("password", password);
        user.put("email", email);
        user.put("gender", gender);
        user.put("age_category", age);
        user.put("admin", false);

        ParseFile file = null;

        if (selectedImageType == "JPEG"){
            file = new ParseFile("profile_picture.jpeg", image);
        }
        else if (selectedImageType == "JPG" || selectedImageType == "jpg"){
            file = new ParseFile("profile_picture.jpg", image);
        }
        else if (selectedImageType == "PNG"){
            file = new ParseFile("profile_picture.png", image);
        }
        else{
            // Show a simple toast message
            Toast.makeText(SignUpActivity.this, "Please pick a JPEG or PNG photo!",
                    Toast.LENGTH_SHORT).show();
        }

        // Upload the image into Parse Cloud
        file.saveInBackground();

       user.put("photo", file);

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

        // Show a simple toast message
        Toast.makeText(SignUpActivity.this, "Image Uploaded",
                Toast.LENGTH_SHORT).show();


        Intent intent = new Intent(SignUpActivity.this, LoginActivity.class);
        startActivity(intent);
        overridePendingTransition(R.anim.push_down_in, R.anim.push_down_out);

        //finish();
    }

所以 .jpeg 有效而 .jpg 无效?那么这个怎么样(注意你不应该将字符串与==进行比较):

if (selectedImageType.toUpperCase().equals("JPEG") || selectedImageType.toUpperCase().equals("JPG")){
            file = new ParseFile("profile_picture.jpeg", image);
        }

也可以合并一些之前的代码:

if (selectedImageType.toUpperCase().equals("JPEG") || selectedImageType.toUpperCase().equals("JPG")){
                    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
                    image = stream.toByteArray();
                }

删除试图在位图创建和图像 Post 到 parse.com 的整个过程中跟踪 "selectedImageType" 的 if 语句。

有了位图后,您可以简单地将所有压缩指定为 "Bitmap.CompressFormat.JPEG",然后只需将所有 jpg post 指定为 parse.com。