在一个活动中,我有一个名为"添加图像"的按钮,点击该按钮将用户带到图库,从中可以选择一个图像,并将该图像添加到数据库中并显示在使用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值(参见上面的代码)。
答案 0 :(得分:0)
这是“添加图像”按钮上的onClickListener
Android中没有crop
个额外内容,更不用说ACTION_PICK
。
这是onActivityMethod()
ACTION_PICK
会返回Uri
,如the documentation所述。它不会返回任何额外内容。
将Uri
传递给您最喜爱的图片加载库(例如Glide,Picasso),以便将该图片加载到后台主题上。
或者,分叉您自己的后台线程,并将其与ContentResolver
和openInputStream()
一起使用,以获得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);
}
}