我有一个要求,当点击捕获按钮时,我必须存储Android相机的最后10个预览帧。我能够将10帧放入缓冲区,当单击捕获按钮时,我将克隆此缓冲区并通过AsyncTask将帧保存到文件系统。 一切都很好,但问题在于活动生命周期。当我在AsyncTask仍在执行时按home或菜单按钮时,我的AsyncTask停止,我只能在文件系统中看到3到5帧。我已经尝试了许多替代方法,比如在Thread,ExecutorService甚至是Intent Service中执行它。使用该服务的问题是我的缓冲区包含超过10mb的数据,活动服务通信的限制是500kb到1mb(我想,因为我在尝试时得到了一个例外)。以下是我的代码,非常感谢任何帮助。
private class PreviewFramesProcessor extends AsyncTask<List<byte[]>, Void, Void> {
@Override
protected void onPreExecute() {
dialog.setIndeterminate(true);
dialog.setCanceledOnTouchOutside(false);
dialog.setCancelable(false);
dialog.setMessage("Processing...");
dialog.show();
}
@Override
protected Void doInBackground(List<byte[]>...temp) {
/*String folder = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath();
panImagesFolder = new File(folder + File.separator + getUniqueFolderName());*/
panImagesFolder.mkdirs();
List<byte[]> byteArrayList = temp[0];
for(int i = byteArrayList.size() - 1; i >= 0 ; i--) {
File pictureFile = getUniqueMediaFileUri(panImagesFolder, i);
try {
byte[] tempArray = convertYuvToJpeg(byteArrayList.get(i), mCameraDevice);
FileOutputStream fos = new FileOutputStream(pictureFile);
fos.write(tempArray);
fos.close();
galleryAddPic(pictureFile);
byteArrayList.remove(i);
} catch(Exception e) {
Log.e("Nagendra", "Exception in processByteArrayBuffer(): " + e.getMessage());
}
}
return null;
}
@Override
protected void onPostExecute(Void result) {
isPictureTaken = false;
dialog.hide();
}
@Override
protected void onProgressUpdate(Void... values) {
}
}
答案 0 :(得分:0)
我认为你的活动正在被破坏,检查在开发者设置中是否启用了活动。