Android:正在保存的图片,使用Glide的RecyclerView预览失败

时间:2017-09-29 07:58:10

标签: android android-recyclerview storage photo android-glide

我正在制作一个Android应用程序,其中一个活动(称为CameraAvtivity),使用户能够快速连续拍摄照片,当用户自己决定结束照片拍摄活动时,他按下在一个按钮上结束CameraActivity,以便在另一项活动中提示(如果实际上称之为PreviewActivity,也可以调用MultiPhotoShootingModeActivity)预览所拍摄的照片;但是预览并不总是正确显示,因为如果我连续快速拍摄一些照片然后在没有等待几秒钟的情况下结束CameraActivity,则Android设备没有足够的时间存储照片以及调​​用PreviewActivity时,保存过程仍在进行中,并且未显示某些预览。

我想要做的是在照片保存过程完全结束并且正确存储包含照片的文件时显示PreviewActivity内的预览。

CameraActivity拍照使用Fotoapparat图书馆;然后应使用Glide库在PreviewActivity内的RecyclerView中显示预览。

在下面的照片中,我向您展示了拍摄照片后没有等待足够时间并等待足够时间的结果(让我们说每张照片我们应该等待3秒,所以4张照片需要12秒)。在第一种情况下,我从第一张照片开始等待6-7秒,直到退出CameraActivity,在第二张照片中,我等了15秒。

Not waiting enough time

Waiting enough time

存储所拍摄图像的代码部分如下。

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适配器的代码。请注意,PreviewActivityImageGalleryAdapter内的一个班级。

PreviewActivity

最后,我的问题是:

  • 是否有可能做一些等待照片正确存储的东西来预览它们?
  • 这是完成已经提到的任务的最佳方式(例如AsyncTask或我不知道的方法)?
  • 我可以使用代码片段来开始解决方案吗?

我知道这是一个很长的问题,但我尽力为它提供我认为必不可少的信息。 谢谢你的时间。

0 个答案:

没有答案