当我拍摄一张图片时,我的代码会缩小图片的大小,如果有必要的话还会旋转。但是,当我从图库中选取6张图片时,会出现一个 ERROR (outofmemory)
.
所以,我想减少代码,如果可以的话,用我拍照时使用的代码。下面我展示一下我的代码。
textCamera.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (i.resolveActivity(getPackageManager()) != null){
File imageFile = null;
try {
imageFile = getImageFile();
} catch (IOException e) {
e.printStackTrace();
}
if (imageFile != null){
Uri imageUri = FileProvider.getUriForFile(MainActivity.this,
"com.gustavo.android.filerevise",
imageFile);
i.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(i, SELECAO_CAMERA);
}
}
dialog.dismiss();
}
});
textGaleria.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
if (i.resolveActivity(getPackageManager()) != null){
startActivityForResult(i, SELECAO_GALERIA);
}
dialog.dismiss();
}
});
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK){
Bitmap imagem = null;
try {
switch (requestCode){
case SELECAO_CAMERA:
imagem = rotateImage(setReducedImageSize());
listPath.add(currentImagePath);
Log.d("Path", "onClick: " + listPath);
break;
case SELECAO_GALERIA:
Uri localImagemSelecionada = data.getData();
InputStream imageStream = getContentResolver().openInputStream(localImagemSelecionada);
imagem = BitmapFactory.decodeStream(imageStream);
listPath.add(null);
Log.d("Path", "onClick: " + listPath);
break;
}
if (imagem!= null){
imagemConfigurada = new Imagem();
imagemConfigurada.setImagem(imagem);
listImagens.add(imagemConfigurada);
Log.d("Imagem", "onActivityResult: " + listImagens);
adapter.notifyDataSetChanged();
}
textQtdImagem.setText("Você adicionou " + listImagens.size() + " de 6 imagens");
textQtdImagem.setGravity(Gravity.CENTER_HORIZONTAL);
}catch (Exception e){
e.printStackTrace();
}
}
}
private File getImageFile()throws IOException {
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = "JPEG_" + timeStamp + "_";
File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
File image = File.createTempFile(
imageFileName, /* prefix */
".jpg", /* suffix */
storageDir /* directory */
);
currentImagePath = image.getAbsolutePath();
return image;
}
enter code here
private Bitmap setReducedImageSize(){
final float scale = getResources().getDisplayMetrics().density;
int padding_150dp = (int) (150 * scale + 0.5f);
int targetImageViewWidth = padding_150dp;
int targetImageViewHeight = padding_150dp;
BitmapFactory.Options bmOptions = new BitmapFactory.Options();
bmOptions.inJustDecodeBounds = true;
Bitmap bitmap = BitmapFactory.decodeFile(currentImagePath, bmOptions);
int cameraImageWidth = bmOptions.outWidth;
int cameraImageHeight = bmOptions.outHeight;
int scaleFactor = Math.min(cameraImageWidth/targetImageViewWidth, cameraImageHeight/targetImageViewHeight);
bmOptions.inSampleSize = scaleFactor;
bmOptions.inJustDecodeBounds = false;
return BitmapFactory.decodeFile(currentImagePath, bmOptions);
}
private Bitmap rotateImage(Bitmap bitmap){
ExifInterface exifInterface = null;
try {
exifInterface = new ExifInterface(currentImagePath);
}catch (IOException e){
e.printStackTrace();
}
int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED);
Matrix matrix = new Matrix();
switch (orientation){
case ExifInterface.ORIENTATION_ROTATE_90:
matrix.setRotate(90);
break;
case ExifInterface.ORIENTATION_ROTATE_180:
matrix.setRotate(180);
break;
case ExifInterface.ORIENTATION_ROTATE_270:
matrix.setRotate(270);
break;
default:
}
return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
}
问题是这个方法 setReducedImageSize
当拍摄图片时,从文件中获取图像。但是当从图库中获取图片时,我没有路径。
下面的代码解决了我的问题。
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK){
Bitmap imagem = null;
try {
switch (requestCode){
case SELECAO_CAMERA:
imagem = imageTreatment(SELECAO_CAMERA, null, currentImagePath);
listPath.add(currentImagePath);
Log.d("Path", "onClick: " + listPath);
break;
case SELECAO_GALERIA:
Uri localImagemSelecionada = data.getData();
String [] filePath = {MediaStore.Images.Media.DATA};
Cursor cursor = getContentResolver().query(localImagemSelecionada, filePath, null, null,null);
cursor.moveToFirst();
String mImagePath = cursor.getString(cursor.getColumnIndex(filePath[0]));
imagem = imageTreatment(SELECAO_GALERIA, mImagePath);
listPath.add(mImagePath);
Log.d("Path", "onClick: " + listPath);
break;
}
if (imagem!= null){
imagemConfigurada = new Image();
imagemConfigurada.setImage(imagem);
listImagens.add(imagemConfigurada);
Log.d("Imagem", "onActivityResult: " + listImagens);
adapter.notifyDataSetChanged();
}
textQtdImagem.setText("Você adicionou " + listImagens.size() + " de 6 imagens");
textQtdImagem.setGravity(Gravity.CENTER_HORIZONTAL);
}catch (Exception e){
e.printStackTrace();
}
}
}
private Bitmap imageTreatment(int requestCode String path){
Bitmap bitmap = null;
//Usado para o Scale Factor:
final float scale = getResources().getDisplayMetrics().density;
int padding_150dp = (int) (150 * scale + 0.5f);
int targetImageViewWidth = padding_150dp;
int targetImageViewHeight = padding_150dp;
BitmapFactory.Options bmOptions = new BitmapFactory.Options();
bmOptions.inJustDecodeBounds = true;
if (requestCode == SELECAO_CAMERA){
try {
bitmap = BitmapFactory.decodeFile(path, bmOptions);
int cameraImageWidth = bmOptions.outWidth;
int cameraImageHeight = bmOptions.outHeight;
int scaleFactor = Math.min(cameraImageWidth / targetImageViewWidth, cameraImageHeight / targetImageViewHeight);
Log.d("scale", "imageTreatment: " + scaleFactor);
bmOptions.inSampleSize = scaleFactor;
bmOptions.inJustDecodeBounds = false;
bitmap = BitmapFactory.decodeFile(path, bmOptions);
Log.d("bitmap", "imageTreatment: " + bitmap);
} catch (Exception e) {
e.printStackTrace();
}
}else {
try {
bitmap = BitmapFactory.decodeFile(path, bmOptions);
int cameraImageWidth = bmOptions.outWidth;
int cameraImageHeight = bmOptions.outHeight;
int scaleFactor = Math.min(cameraImageWidth/targetImageViewWidth, cameraImageHeight/targetImageViewHeight);
Log.d("scale", "imageTreatment: " + scaleFactor);
bmOptions.inSampleSize = scaleFactor;
bmOptions.inJustDecodeBounds = false;
bitmap = BitmapFactory.decodeFile(path, bmOptions);
}catch (Exception e){
e.printStackTrace();
}
}
//orientation:
try {
int rotate = 0;
try {
ExifInterface exif = new ExifInterface(path);
int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
switch (orientation){
case ExifInterface.ORIENTATION_ROTATE_270:
rotate = 270;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
rotate = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_90:
rotate = 90;
break;
}
}catch (Exception e){
e.printStackTrace();
}
Matrix matrix = new Matrix();
matrix.postRotate(rotate);
bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
}catch (Exception e){
e.printStackTrace();
}
return bitmap;
}