如何在onActivityResult方法中获取图库中的图像的byteArray?

时间:2018-03-27 09:23:55

标签: android arrays

在一个活动中,我有一个名为"添加图像"的按钮,点击该按钮将用户带到图库,从中可以选择一个图像,并将该图像添加到数据库中并显示在使用ImageView的活动中。

这是"添加图像"上的onClickListener。按钮。

addImageButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent in = new Intent(
                    Intent.ACTION_PICK,

android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            in.setType("image/*");
            in.putExtra("crop", "true");
            in.putExtra("outputX", 100);
            in.putExtra("outputY", 100);
            in.putExtra("scale", true);
            in.putExtra("return-data", true);
            startActivityForResult(in, 1);
        }
    });

这是onActivityMethod()

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

    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == 1 && resultCode == RESULT_OK && data != null) {

        Uri imageUri = data.getData();
        mImageByteArray = data.getExtras().getByteArray(ItemEntry.COLUMN_ITEM_IMAGE);
        mImageUri = imageUri;
        mImage.setImageURI(imageUri);
        mImageString = imageUri.toString();
        mImageBitmap = BitmapFactory.decodeByteArray(mImageByteArray, 0, mImageByteArray.length);
    }
}

我试图获取图像的字节数组,但我在mImageByteArray变量中得到一个Null值(参见上面的代码)。

4 个答案:

答案 0 :(得分:0)

  

这是“添加图像”按钮上的onClickListener

Android中没有crop个额外内容,更不用说ACTION_PICK

  

这是onActivityMethod()

ACTION_PICK会返回Uri,如the documentation所述。它不会返回任何额外内容。

Uri传递给您最喜爱的图片加载库(例如Glide,Picasso),以便将该图片加载到后台主题上。

或者,分叉您自己的后台线程,并将其与ContentResolveropenInputStream()一起使用,以获得InputStream标识的内容Uri。将InputStream传递给BitmapFactory及其decodeStream()方法。但是,请使用图像加载库。

答案 1 :(得分:-1)

您可以使用此函数来获取字节数组:

public static byte[] convertFileToByteArray(File f) {
    byte[] byteArray = null;
    try
    {
        InputStream inputStream = new FileInputStream(f);
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        byte[] b = new byte[1024*8];
        int bytesRead =0;

        while ((bytesRead = inputStream.read(b)) != -1)
        {
            bos.write(b, 0, bytesRead);
        }

        byteArray = bos.toByteArray();
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
    return byteArray;
}

只需从Uri获取文件并传递给此函数。

答案 2 :(得分:-1)

试试这个

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        if (requestCode == RESULT_LOAD_IMAGE && 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();

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

        }


    }

答案 3 :(得分:-1)

似乎你没有把ByteArray放在Intent的附加内容中,所以你无法得到它。使用PutExtra(String name, byte[] value)将您的bytaArray添加到Extra。

addImageButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent in = new Intent(
                    Intent.ACTION_PICK,

android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            in.setType("image/*");
            in.putExtra("crop", "true");
            in.putExtra("outputX", 100);
            in.putExtra("outputY", 100);
            in.putExtra("scale", true);
            in.putExtra("return-data", true);
            in.putExtra("image_byte_array", myImageByteArray); //Add your byteArray to your Intent's extras
            startActivityForResult(in, 1);
        }
    });

然后您可以使用getByteArrayExtra()

检索它
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == 1 && resultCode == RESULT_OK && data != null) {

        Uri imageUri = data.getData();
        mImageByteArray = data.getByteArrayExtra("image_byte_array"); //Use same name as when you put it
        mImageUri = imageUri;
        mImage.setImageURI(imageUri);
        mImageString = imageUri.toString();
        mImageBitmap = BitmapFactory.decodeByteArray(mImageByteArray, 0, mImageByteArray.length);
    }
}