【问题标题】:Screenshot file takes long time to save on Android device屏幕截图文件需要很长时间才能保存在 Android 设备上
【发布时间】:2015-02-19 00:06:35
【问题描述】:

我有一个功能,它通过位图捕获视频的屏幕截图/视频帧,并将图像文件 (.png) 保存到 Android 手机上的图片目录中。但是由于某种原因,将图像保存在手机上需要很长时间。例如,我将运行应用程序/功能,文件将在 10 分钟后出现在手机上。知道为什么吗?

public static Bitmap captureVideoFrame(Activity activity, VideoView vv, String viewSource, int currPosInMs)
    {   
        MediaMetadataRetriever mmRetriever = new MediaMetadataRetriever();
        Map<String, String> headers = new HashMap<String, String>();
        mmRetriever.setDataSource(viewSource, headers);

        Bitmap bmFrame = mmRetriever.getFrameAtTime(currPosInMs * 1000); // unit in microsecond

        if(bmFrame == null){
            Toast.makeText(activity.getApplicationContext(), "Bitmap is EMPTY. Curr Position: " + currPosInMs, Toast.LENGTH_SHORT).show();
        }
        else
        {
            Toast.makeText(activity.getApplicationContext(), "Bitmap is GOOD. Curr Position: " + currPosInMs, Toast.LENGTH_SHORT).show();

            // Save file
            String mPath = Environment.getExternalStorageDirectory().toString() + "/" + PICTURES_DIRECTORY + Utilities.getDayTimeString() + ".png";
            OutputStream fout = null;
            File imageFile = new File(mPath);

            try 
            {
                fout = new FileOutputStream(imageFile);
                bmFrame.compress(Bitmap.CompressFormat.JPEG, 100, fout);
                fout.flush();
                fout.close();

                Toast.makeText(activity.getApplicationContext(), "Saved file successfully!", Toast.LENGTH_SHORT).show();
            }
            catch(Exception e){

            }
        }

        return bmFrame;
    }

【问题讨论】:

  • fout.close(); 之后尝试打开它,看看发生了什么?
  • 您如何确定“文件将在 10 分钟后出现在手机上”? adb shell? DDMS 文件资源管理器?通过 USB 电缆连接设备?设备上的文件管理器?还有什么?
  • 我注意到文件没有立即保存。运行应用程序时,我使用的是连接到手机的 USB 数据线。
  • 尝试降低 JPEG 图像的质量。我猜文件大小很大,写它需要时间。将compress调用中的参数“100”改为“75”——bmFrame.compress(Bitmap.CompressFormat.JPEG, 75, fout);
  • 顺便说一句,您的描述说您正在保存 PNG,但您的代码显示它的 JPEG。将JPEG更改为PNG以获取png图像。在这种情况下,质量参数不会有任何影响。

标签: android file outputstream android-file android-videoview


【解决方案1】:

首先,你应该把 fout.flush(); fout.close();在 catch 部分之后的 finally 块中,以确保文件始终被写入。

如果您正在通过 Windows 资源管理器查看 USB 连接,则可能由于缓存而存在延迟(文件实际上存在于磁盘上但未显示)。我可以在三星设备上注意到这一点。如果您在手机上使用文件资源管理器(例如 Astro 文件管理器),您应该可以实时看到修改(刷新存储图片的目录,或在目录中上下导航)。

在 finally 块完成后记录以下内容 - imageFile.exists() 和 imageFile.length() 以查看文件是否已写入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多