我正在制作一个Android应用程序,其中一个活动(称为CameraAvtivity
),使用户能够快速连续拍摄照片,当用户自己决定结束照片拍摄活动时,他按下在一个按钮上结束CameraActivity
,以便在另一项活动中提示(如果实际上称之为PreviewActivity
,也可以调用MultiPhotoShootingModeActivity
)预览所拍摄的照片;但是预览并不总是正确显示,因为如果我连续快速拍摄一些照片然后在没有等待几秒钟的情况下结束CameraActivity
,则Android设备没有足够的时间存储照片以及调用PreviewActivity
时,保存过程仍在进行中,并且未显示某些预览。
我想要做的是在照片保存过程完全结束并且正确存储包含照片的文件时显示PreviewActivity
内的预览。
CameraActivity
拍照使用Fotoapparat图书馆;然后应使用Glide库在PreviewActivity
内的RecyclerView
中显示预览。
在下面的照片中,我向您展示了拍摄照片后没有等待足够时间并等待足够时间的结果(让我们说每张照片我们应该等待3秒,所以4张照片需要12秒)。在第一种情况下,我从第一张照片开始等待6-7秒,直到退出CameraActivity
,在第二张照片中,我等了15秒。
存储所拍摄图像的代码部分如下。
private void takePicture() {
PhotoResult photoResult = fotoapparatSwitcher.getCurrentFotoapparat().takePicture();
// Adding a sound to the shutter, taken from http://www.solidfiles.com/v/PMmGVvZ6m5mZM
MediaPlayer mp = MediaPlayer.create(getApplicationContext(), R.raw.camera_shutter);
mp.start();
// Creating a filename with the timestamp
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = MainActivity.sUsername.trim() + "_" + "IMAGE_" + timeStamp + "_" + ".jpg";
// Creating a "non-collision file name" in case of collision with names of previously saved images
if (imageFileNamesMPSA.contains(imageFileName)) {
imageFileName = MainActivity.sUsername.trim() + "_" + "IMAGE_" + timeStamp + "_(" + String.valueOf(fCount++) + ")_" + ".jpg";
} else {
fCount = 0;
}
// Creating the file
imageFile = new File(storageDirectory,imageFileName);
// The location is saved into the string imageFileLocation
String imageFileLocation = imageFile.getAbsolutePath();
Log.i(TAG_THIS_CLASS, "Image file location: " + imageFileLocation);
// Storing file name and location into the corresponding strings
switch (callingActivity){
case "SPSA":
imageFileNameSPSA = imageFileName;
imageFileLocationsSPSA = imageFileLocation;
// TODO: end the CameraActivity automatically when finished with photo taking automatically
// endPictureTakingOnClick();
break;
case "MPSA":
imageFileNamesMPSA.add(imageFileName);
imageFileLocationsMPSA.add(imageFileLocation);
break;
}
photoResult.saveToFile(imageFile);
// This method manages what to do when photo saving is finished
// For now manages the preview in the CameraActivity and the media scanning of the file
photoResult
.toBitmap(scaled(0.25f))
.whenAvailable(new PendingResult.Callback<BitmapPhoto>() {
@Override
public void onResult(BitmapPhoto result) {
// Previewing the photo made
ImageView imageView = (ImageView) findViewById(R.id.result);
imageView.setImageBitmap(result.bitmap);
imageView.setRotation(-result.rotationDegrees);
// Tell the MediaScanner about the new file so that it is immediately available to the
// user via the gallery
// TODO: maybe is not coherent to launch the MediaScanner inside here
new SingleMediaScanner(getApplicationContext(), imageFile);
}
});
}
请注意,感谢Fotoapparat的whenAvailable
方法(几乎在上面代码的末尾),我能够知道每张照片何时完全保存...但是{{1结束CameraActivity
并立即调用RecyclerView
(可能在此之前运行了Adapter
方法的行)并且照片存储过程仍然不完整。
下面是whenAvailable
内部使用的RecyclerView适配器的代码。请注意,PreviewActivity
是ImageGalleryAdapter
内的一个班级。
PreviewActivity
最后,我的问题是:
我知道这是一个很长的问题,但我尽力为它提供我认为必不可少的信息。 谢谢你的时间。