我已启动并运行相机,并将图片保存到手机中,但我现在想要将其显示在我已设置的ImageView中,然后在每次启动应用程序之后再次显示。关于如何扩展我已经实现的目标的任何建议?
我的相机代码如下:
private void takePic() {
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
File pictureDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
String pictureName = "Avatar.jpg";
File imageFile = new File(pictureDirectory, pictureName);
Uri pictureUri = Uri.fromFile(imageFile);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, pictureUri);
startActivityForResult(cameraIntent, CAMERA_REQUEST);
}
我有一个按钮,只需拨打takePic()
即可。之前我有onActivityResult()
看起来像这样:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == CAMERA_REQUEST && resultCode == RESULT_OK) {
Bitmap photo = (Bitmap) data.getExtras().get("data");
AvatarMe.setImageBitmap(photo);
}
}
我用它来简单地在我的ImageView中显示缩略图,但是当我修改代码以保存图片时我不得不将其删除,否则应用程序会崩溃。似乎Android不会让我同时做到这两点,所以我需要一些帮助来弄清楚我是如何做到的。
所以基本上我想拍照,在我的ImageView中显示它,并保存它,这样如果应用程序在拍完照片后被杀死,我可以用保存的图片填充ImageView。
答案 0 :(得分:0)
您可以使用picasso库。
答案 1 :(得分:0)
在您的onActivityResult()
数据来自意图,但您必须保存到内部存储空间并在imageview中显示,请查看。
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE)
{
if (resultCode == Activity.RESULT_OK)
{
Bitmap bmp = (Bitmap)data.getExtras().get("data");
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
//saving image into internal storage
File myfile = new File(Environment.getExternalStorageDirectory(),"yourfilename.jpg");
FileOutputStream fo;
try {
myfile.createNewFile();
fo = new FileOutputStream(myfile);
fo.write(byteArray);
fo.flush();
fo.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// convert byte array to Bitmap
Bitmap bitmap = BitmapFactory.decodeByteArray(byteArray, 0,
byteArray.length);
imageView.setImageBitmap(bitmap);
}
}
}
快乐的编码!!
答案 2 :(得分:0)
你可以使用picasso library或者你可以使用我的方法来压缩图像和这个ImageCompression类 `
private Context context;
float maxHeight;
float maxWidth;
boolean wantSave;
public ImageCompression(Context context) {
this.context = context;
}
public ImageCompression(Context context, float maxHeight, float maxWidth, boolean wantSave) {
this.context = context;
this.maxHeight = maxHeight;
this.maxWidth = maxWidth;
this.wantSave = wantSave;
}
@Override
protected Bitmap doInBackground(String... strings) {
if (strings.length == 0 || strings[0] == null)
return null;
return compressImage(strings[0]);
}
protected void onPostExecute(Bitmap imagePath) {
// imagePath is path of new compressed image.
}
public Bitmap compressImage(String imagePath) {
// to check if image is exist or not
File checkFile = new File(imagePath);
if (!checkFile.exists()) {
return null;
}
Bitmap scaledBitmap = null;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
Bitmap bmp = BitmapFactory.decodeFile(imagePath, options);
int actualHeight = options.outHeight;
int actualWidth = options.outWidth;
float imgRatio = (float) actualWidth / (float) actualHeight;
float maxRatio = maxWidth / maxHeight;
if (actualHeight > maxHeight || actualWidth > maxWidth) {
if (imgRatio < maxRatio) {
imgRatio = maxHeight / actualHeight;
actualWidth = (int) (imgRatio * actualWidth);
actualHeight = (int) maxHeight;
} else if (imgRatio > maxRatio) {
imgRatio = maxWidth / actualWidth;
actualHeight = (int) (imgRatio * actualHeight);
actualWidth = (int) maxWidth;
} else {
actualHeight = (int) maxHeight;
actualWidth = (int) maxWidth;
}
}
options.inSampleSize = calculateInSampleSize(options, actualWidth, actualHeight);
options.inJustDecodeBounds = false;
options.inDither = false;
options.inPurgeable = true;
options.inInputShareable = true;
options.inTempStorage = new byte[16 * 1024];
try {
bmp = BitmapFactory.decodeFile(imagePath, options);
scaledBitmap = Bitmap.createBitmap(actualWidth, actualHeight, Bitmap.Config.RGB_565);
float ratioX = actualWidth / (float) options.outWidth;
float ratioY = actualHeight / (float) options.outHeight;
float middleX = actualWidth / 2.0f;
float middleY = actualHeight / 2.0f;
Matrix scaleMatrix = new Matrix();
scaleMatrix.setScale(ratioX, ratioY, middleX, middleY);
Canvas canvas = new Canvas(scaledBitmap);
canvas.setMatrix(scaleMatrix);
if (bmp != null) {
canvas.drawBitmap(bmp, middleX - bmp.getWidth() / 2, middleY - bmp.getHeight() / 2, new Paint(Paint.FILTER_BITMAP_FLAG));
bmp.recycle();
}
ExifInterface exif;
try {
exif = new ExifInterface(imagePath);
int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 0);
Matrix matrix = new Matrix();
if (orientation == 6) {
matrix.postRotate(90);
} else if (orientation == 3) {
matrix.postRotate(180);
} else if (orientation == 8) {
matrix.postRotate(270);
}
scaledBitmap = Bitmap.createBitmap(scaledBitmap, 0, 0, scaledBitmap.getWidth(), scaledBitmap.getHeight(), matrix, true);
} catch (IOException e) {
e.printStackTrace();
}
// these lines from 144 to 157 for save the new photo
if (wantSave) {
FileOutputStream out = null;
String filepath = imagePath;
try {
out = new FileOutputStream(filepath);
//write the compressed bitmap at the destination specified by filename.
scaledBitmap.compress(Bitmap.CompressFormat.JPEG, 80, out);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
return scaledBitmap;
} catch (OutOfMemoryError exception) {
exception.printStackTrace();
}
return null;
}
public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
final int heightRatio = Math.round((float) height / (float) reqHeight);
final int widthRatio = Math.round((float) width / (float) reqWidth);
inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
}
final float totalPixels = width * height;
final float totalReqPixelsCap = reqWidth * reqHeight * 2;
while (totalPixels / (inSampleSize * inSampleSize) > totalReqPixelsCap) {
inSampleSize++;
}
return inSampleSize;
}
}
然后在onActivityResult调用
ImageCompression imageCompression = new ImageCompression(context, imageHeight, imageHeight, false) {
@Override
protected void onPostExecute(Bitmap bitmab) {
super.onPostExecute(bitmab);
try {
if (imagePath != null) {
mCropImageView.setImageBitmap(bitmab);
}
} catch (OutOfMemoryError error) {
Toast.makeText(CropImageActivity.this, "OutOfMemory, no space", Toast.LENGTH_SHORT).show();
}
}
};
imageCompression.execute(imagePath);
我希望这会有所帮助
答案 3 :(得分:0)
在这种情况下,摄像机意图的“数据”为空。您可以查看answer。
要解决此问题,您必须将传递给相机意图全局的uri。
//make this a global variable
Uri pictureUri = Uri.fromFile(imageFile);
然后你可以像这样访问位图
void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK)
{
Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), pictureUri);
AvatarMe.setImageBitmap(bitmap);
}
}
您还可以使用db或共享首选项存储pictureUri,稍后再重复使用。