截屏文件需要很长时间才能保存在Android设备上

时间:2014-12-20 02:44:44

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

我有一个功能,可以通过位图捕获视频的屏幕截图/视频帧,并将图像文件(.png)保存到Android手机上的Pictures目录中。但由于某种原因,图像需要很长时间才能保存在手机上。例如,我将运行应用程序/功能,文件将在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;
    }

1 个答案:

答案 0 :(得分:2)

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

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

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