我有一个功能,可以通过位图捕获视频的屏幕截图/视频帧,并将图像文件(.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;
}
答案 0 :(得分:2)
首先,你应该把fout.flush(); fout.close();在catch部分之后的finally块中,以确保始终写入文件。
如果您正在通过Windows资源管理器查看USB连接,可能会因缓存而导致延迟(该文件实际存在于磁盘上但未显示)。我可以在三星设备上注意到这一点。如果您在手机上使用文件浏览器(例如Astro文件管理器),您应该实时看到修改(在存储图片的目录上刷新,或在目录上上下导航)。
在finally块完成后记录以下内容 - imageFile.exists()和imageFile.length()以查看文件是否已写入。