我对 ViewPagers 和 Camera 应用程序进行了广泛的文档研究,实际上一切都很好,除了 GingerBread 上的一个主要问题,我在 SO 上没有发现任何问题,所以我会试着问这个......
在我的应用程序中有一个 ViewPager(支持库 v4),它显示了两个片段:一个,将其称为主片段,一个显示活动何时开始,向用户显示某些信息,包括一个最初为空的图像视图和隐藏。
通过滑动到下一个片段,用户可以看到相机预览,它是在创建 Activity 时创建的(即使它直到滑动才显示)和拍照按钮。
拍摄照片时,视图以编程方式返回到主片段,图像视图加载新照片并取消隐藏,因此用户可以看到与其他预先存在的信息混合的图像。
如果用户不喜欢图片,他可以再次滑回相机片段并拍摄另一张,如此反复,直到他对结果满意为止。
出于这个原因,在返回到主片段之前,我调用 mCamera.restartPreview() 并确保在用户向后滑动时相机已准备好。
在 Android 4.x 上一切正常,但当我在 2.3.3(API 级别 10)上进行测试时,当主片段被回调时,相机预览仍处于前台,并隐藏视图。您可以在相机片段显示按钮的屏幕部分中查看甚至滚动视图的其余部分,但其余部分与相机预览重叠。
下面是相关函数的代码:
CameraFragment onPictureTaken()
private PictureCallback mPicture = new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE);
if (pictureFile == null){
Log.d(TAG, "Error creating media file, check storage permissions: ");
return;
}
try {
FileOutputStream fos = new FileOutputStream(pictureFile);
Log.e(TAG, "FILE " +pictureFile.getAbsoluteFile().toString());
Bitmap bitmap = rotated(data);
bitmap.compress(CompressFormat.JPEG, PICTURE_QUALITY, fos);
bitmap.recycle(); //devo davvero chiamarla esplicitamente ??
mediaFile = pictureFile;
mPreview.restartPreview();
// go back to newpin activity to show it
((NewPinActivity) myActivity).newPin.setMedia(mediaFile.getAbsoluteFile().toString());
((NewPinActivity) myActivity).takeBack();
} catch (FileNotFoundException e) {
Log.d(TAG, "File not found: " + e.getMessage());
}
}
};
和 mainfragment takeBack() 方法
public void takeBack(){
mViewPager.setCurrentItem(0, true);
String mainFragTag = "android:switcher:"+R.id.newpinpager+":0";
Fragment fragMain = this.getSupportFragmentManager().findFragmentByTag(mainFragTag);
try {
((NewPinMainFragment)fragMain).showPhoto(newPin.getMedia());
} catch (NullPointerException e){
}
}
如果这是 ViewPager 和 GingerBread 或 CameraPreview 和 Gingerbread 或什么的问题,有人知道吗?