我下面这个示例代码发送意图获得的图像。
Intent i = new Intent();
i.setAction(Intent.ACTION_GET_CONTENT);
i.setType("image/*");
if (i.resolveActivity(getPackageManager()) != null) {
startActivityForResult(i, 3);
}
在onActivityResult
:
if(requestCode == 3 && resultCode == RESULT_OK) {
Bitmap thumbnail = data.getParcelableExtra("data");
if(thumbnail == null) {
Toast.makeText(getApplicationContext(), "Thumbnail is null", Toast.LENGTH_SHORT).show();
return;
}
ImageView iv = (ImageView) findViewById(R.id.imageView);
iv.setImageBitmap(thumbnail);
}
当发送的意图,图片选择推出,而我选择在画廊中的图像之一。 但在onActivityResult
,对应于示例代码下面的语句(我改getParcelableExtra
在Android 4.4的):
Bitmap thumbnail = data.getParcelable("data");
我得到的缩略图为空。 我测试的Genymotion VM。
我究竟做错了什么 ?
btnFromGallery.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
try {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
Log.i("after select", "get image");
startActivityForResult(Intent.createChooser(intent, ""), PICK_IMAGE);
} catch (Exception e) {
Toast.makeText(getApplicationContext(), R.string.imageException, Toast.LENGTH_LONG).show();
Log.e(e.getClass().getName(), e.getMessage(), e);
}
}
});
//onActivityResult code:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case PICK_IMAGE:
if (resultCode == Activity.RESULT_OK) {
Log.i("On onActivityResult", "on Activity Result");
Uri selectedImageUri = data.getData();
String filePath = null;
try {
String filemanagerstring = selectedImageUri.getPath();
selectedImagePath = getPath(selectedImageUri);
if (selectedImagePath != null) {
filePath = selectedImagePath;
} else if (filemanagerstring != null) {
filePath = filemanagerstring;
} else {
Toast.makeText(getApplicationContext(), R.string.unknownPath, Toast.LENGTH_LONG).show();
}
if (filePath != null) {
decodeFile(filePath);
} else {
bitmap = null;
}
} catch (Exception e) {
Toast.makeText(getApplicationContext(), R.string.dataException, Toast.LENGTH_LONG).show();
}
}
break;
}
}
//Get Path Method
public String getPath(Uri uri) {
String[] projection = { MediaColumns.DATA };
Cursor cursor = managedQuery(uri, projection, null, null, null);
if (cursor != null) {
int column_index = cursor.getColumnIndexOrThrow(MediaColumns.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
} else
return null;
}
//Decode File method
public void decodeFile(String filePath) {
try {
File f = new File(filePath);
ExifInterface exif = new ExifInterface(f.getPath());
int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
int angle = 0;
if (orientation == ExifInterface.ORIENTATION_ROTATE_90) {
angle = 90;
} else if (orientation == ExifInterface.ORIENTATION_ROTATE_180) {
angle = 180;
} else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) {
angle = 270;
}
Matrix mat = new Matrix();
mat.postRotate(angle);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
Bitmap bmp = BitmapFactory.decodeStream(new FileInputStream(f), null, options);
bitmap = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), mat, true);
ByteArrayOutputStream outstudentstreamOutputStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, outstudentstreamOutputStream);
imgEdit.setImageBitmap(bitmap);
你可以尝试他的回答? 如何挑选从画廊(SD卡),我的应用程序的图像?
使用getData()
代替getParcelableExtra()
它会回报你一个开放的,你将需要使用ContentResolver
获取图像。
此外,使用Intent.ACTION_PICK
代替Intent.ACTION_GET_CONTENT
。
不但得不到位的,从数据中获取URI和自己加载位图。
Uri selectedImageUri = data.getData();
String selectedImagePath = getPath(selectedImageUri);
试试这个。它帮助你
/**
* Images uploaded through gallery
*
*/
btn_gallery.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
if (v.getId() == R.id.btn_gallery)
{
upload = true;
gallery_upload();
}
}
});
/**
* By this method we can upload the image from gallery
*/
public void gallery_upload()
{
Log.d("Upload", "inside gallery upload");
Intent i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, RESULT_LOAD_IMAGE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if (upload)
{
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]);
picturePath = cursor.getString(columnIndex);
Log.e("", "" + picturePath);
cursor.close();
imageView = (ImageView) findViewById(R.id.upload_register_image);
File image = new File(picturePath);
if (image.exists())
{
File f = image.getAbsoluteFile();
decodeFile(f);
}
else
{
Log.d("VEHICLEREGISTERATION", "image doesnt exist");
}
upload = false;
imagePath(picturePath);
}
}
}
/**
* Helps to decode size of the image
* */
private Bitmap decodeFile(File f)
{
try
{
// Decode image size
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeStream(new FileInputStream(f), null, o);
// The new size we want to scale to
final int REQUIRED_SIZE = 70;
// Find the correct scale value. It should be the power of 2.
int scale = 1;
while (o.outWidth / scale / 2 >= REQUIRED_SIZE && o.outHeight / scale / 2 >= REQUIRED_SIZE)
scale *= 2;
// Decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
Bitmap bit_map = BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
imageView.setImageBitmap(bit_map);
}
catch (FileNotFoundException e)
{
}
return null;
}
public void imagePath(String Path)
{
finalImgPath = Path;
}