iPhone跟 iPad對攝像頭和圖檔庫的代碼處理有點不一樣,iPad主要是用使用
UIPopoverController來包含 UIImagePickerController.
主要的代碼如下:
1. 類從UIViewController繼承,然後裡面實作 UINavigationControllerDelegate跟
UIImagePickerControllerDelegate。
2. 将ios的appDelegate類 的laungh函數中,将相應的代碼修改為:
// Set RootViewController to window
if ( [[UIDevice currentDevice].systemVersion floatValue] < 6.0)
{
// warning: addSubView doesn't work on iOS6
[window setRootViewController:viewController];
[window addSubview: viewController.view];
}
else
{
// use this method on ios6
[window setRootViewController:viewController];
}
主要目的是 當SDK< 6.0的時候,也設定
[window setRootViewController:viewController];
防止在後面取window.rootViewController的時候crash.
3. *.h檔案裡面包含這麼幾個成員變量:
UIImagePickerController* picker_camera_;
UIImagePickerController* picker_library_;
UIWindow * window;
UIPopoverController * pc_image_picker_;
4. *.mm檔案的内容如下:
@implementation IPHONEAvatar
static IPHONEAvatar* _sharedIPHONEAvatar = nil;
static int _g_iImgIndex = 0;
+(IPHONEAvatar*)sharedIPHONEAvatar {
@synchronized([IPHONEAvatar class])
{
if(!_sharedIPHONEAvatar)
{
[[self alloc] init];
}
return _sharedIPHONEAvatar;
}
return nil;
}
+(id)alloc
{
@synchronized ([IPHONEAvatar class])
{
NSAssert(_sharedIPHONEAvatar == nil,
@"Attempted to allocated a second instance of the IPHONEAvatar singleton");
_sharedIPHONEAvatar = [super alloc];
return _sharedIPHONEAvatar;
}
return nil;
}
- (void)imagePickerController:(UIImagePickerController*)picker
didFinishPickingImage:(UIImage*)image
editingInfo:(NSDictionary*)editingInfo
{
NSMutableDictionary * dict= [NSMutableDictionary dictionaryWithDictionary:editingInfo];
[dict setObject:image forKey:@"UIImagePickerControllerEditedImage"];
[self imagePickerController:picker didFinishPickingMediaWithInfo:dict];
}
-(void)image:(UIImage*)image didFinishSavingWithError:(NSError*)error contextInfo:(void*)contextInfo
{
UNUSED(image);
UNUSED(contextInfo);
if (error) {
CCLOG("saving pic error!");
}
}
- (void)imagePickerControllerDidCancel:(UIImagePickerController*)picker
{
[picker.view removeFromSuperview];
[picker dismissModalViewControllerAnimated:YES];
[picker release];
picker = nil;
picker_camera_ = nil;
picker_library_ = nil;
if(window)
{
[window removeFromSuperview];
[window release];
window = nil;
}
#ifdef HD_EDITION
if (pc_image_picker_)
{
[pc_image_picker_ dismissPopoverAnimated:YES];
pc_image_picker_ = nil;
}
#else
#endif
}
//3.x 使用者選中圖檔後的回調
- (void)imagePickerController:(UIImagePickerController*)picker
didFinishPickingMediaWithInfo:(NSDictionary*)info
{
CCLOG("imagePickerController:");
if (picker == picker_camera_) {
//如果是 來自照相機的image,那麼先儲存
UIImage* original_image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
UIImageWriteToSavedPhotosAlbum(original_image, self,
@selector(image:didFinishSavingWithError:contextInfo:),
nil);
}
UIImage* image = [info objectForKey: @"UIImagePickerControllerEditedImage"];
NSError** error = 0;
NSFileManager* fm = [NSFileManager defaultManager];
NSString* my_avatar_temp_path = [NSString stringWithFormat:
@"%@/Documents/MYAVATAR_TEMP%d.PNG", NSHomeDirectory(),_g_iImgIndex++];
if ([fm fileExistsAtPath:my_avatar_temp_path]) {
[fm removeItemAtPath:my_avatar_temp_path error:error];
}
//UIImage* avatar_image = [ImageHelper image:image fillView:avatar_];
UIImage* avatar_image= nil;
#ifdef HD_EDITION
avatar_image = [ImageHelper image:image fillSize:CGSizeMake(120.0f, 120.0f)];
#else
avatar_image = [ImageHelper image:image fillSize:CGSizeMake(120.0f, 120.0f)];
#endif
NSData* imageData = UIImagePNGRepresentation(avatar_image);
BOOL avatar_updated = NO;
if (imageData) {
BOOL bSuccess = [imageData writeToFile:my_avatar_temp_path atomically:YES];
if (bSuccess)
{
CCString strAvatarPath;
strAvatarPath.initWithFormat("%s",[my_avatar_temp_path UTF8String]);
CCLog("strAvatarPath: %s",strAvatarPath.getCString());
CCNotificationCenter::sharedNotificationCenter()->postNotification(AVATARCHANGE,&strAvatarPath);
}
else
{
CCLog("Failed to save picture");
}
avatar_updated = bSuccess;
}
[picker.view removeFromSuperview];
[picker dismissModalViewControllerAnimated:YES];
[picker release];
picker = nil;
picker_camera_ = nil;
picker_library_ = nil;
if (window)
{
[window removeFromSuperview];
[window release];
window = nil;
}
#ifdef HD_EDITION
if (pc_image_picker_)
{
[pc_image_picker_ dismissPopoverAnimated:YES];
pc_image_picker_ = nil;
}
#else
#endif
// upload new avatar to server
if (avatar_updated)
{
std::string avatar_hash = getImageFileHashValue([my_avatar_temp_path UTF8String]) + ".png";
NSString* my_avatar_path = [NSString stringWithFormat:
@"%@/Documents/%s", NSHomeDirectory(), avatar_hash.c_str()];
if ([fm fileExistsAtPath:my_avatar_path])
{
[fm removeItemAtPath:my_avatar_path error:error];
}
[fm moveItemAtPath: my_avatar_temp_path
toPath: my_avatar_path
error: error];
CCString strFileName;
strFileName.initWithFormat("%s",[my_avatar_path UTF8String]);
std::string strUploading = LanguageManager::sharedLanguageManager()->getLocalizedString("uploading avatar,please waiting...");
UIAlertView * baseAlert = [[[UIAlertView alloc] initWithTitle:[NSString stringWithUTF8String:strUploading.c_str()] message:nil
delegate:self cancelButtonTitle:nil otherButtonTitles:nil] autorelease];
[baseAlert show];
std::string strOk = LanguageManager::sharedLanguageManager()->getLocalizedString("OK");
if (AvatarManager::sharedAvatarManager()->uploadFile(strFileName) )
{
[baseAlert dismissWithClickedButtonIndex:0 animated:YES];
std::string strUploadSuccess = LanguageManager::sharedLanguageManager()->getLocalizedString("upload avatar success!");
UIAlertView* av = [[[UIAlertView alloc] initWithTitle:@"tip" message:[NSString stringWithUTF8String:strUploadSuccess.c_str()] delegate:self cancelButtonTitle:[NSString stringWithUTF8String:strOk.c_str()] otherButtonTitles:nil] autorelease];
[av show];
}
else
{
[baseAlert dismissWithClickedButtonIndex:0 animated:YES];
std::string strUploadFailed = LanguageManager::sharedLanguageManager()->getLocalizedString("upload avatar failed!");
UIAlertView* av = [[[UIAlertView alloc] initWithTitle:@"tip" message:[NSString stringWithUTF8String:strUploadFailed.c_str()] delegate:self cancelButtonTitle: [NSString stringWithUTF8String:strOk.c_str()] otherButtonTitles:nil] autorelease];
[av show];
AnalyticX::flurryLogError(FLURRY_UPLOAD_AVATAR, "UPLOAD_AVATAR_FAILED");
}
}
}
-(void)onIPHONECamera
{
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
picker_camera_ = [[UIImagePickerController alloc] init];
#ifdef HD_EDITION
picker_camera_.sourceType = UIImagePickerControllerSourceTypeCamera;
if ([UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceFront])
{
picker_camera_.cameraDevice = UIImagePickerControllerCameraDeviceFront;
}
else
{
picker_camera_.cameraDevice = UIImagePickerControllerCameraDeviceRear;
}
picker_camera_.allowsEditing = YES;
picker_camera_.delegate = self;
#else
picker_camera_.sourceType = UIImagePickerControllerSourceTypeCamera;
if ([UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceFront])
{
picker_camera_.cameraDevice = UIImagePickerControllerCameraDeviceFront;
}
else
{
picker_camera_.cameraDevice = UIImagePickerControllerCameraDeviceRear;
}
picker_camera_.allowsEditing = YES;
picker_camera_.delegate = self;
#endif
#ifdef HD_EDITION
picker_camera_.view.frame = [UIScreen mainScreen].bounds;
window = [[UIWindow alloc] initWithFrame: [[UIScreen mainScreen] bounds]];
window.rootViewController = picker_camera_;//self;
if ( [[UIDevice currentDevice].systemVersion floatValue] < 6.0)
{
// warning: addSubView doesn't work on iOS6
[window addSubview: picker_camera_.view];
}
else
{
// use this method on ios6
[window setRootViewController:picker_camera_];//self];
}
[window makeKeyAndVisible];
#else
picker_camera_.view.frame = [UIScreen mainScreen].bounds;
window = [[UIWindow alloc] initWithFrame: [[UIScreen mainScreen] bounds]];
window.rootViewController = picker_camera_;//self;
if ( [[UIDevice currentDevice].systemVersion floatValue] < 6.0)
{
// warning: addSubView doesn't work on iOS6
[window addSubview: picker_camera_.view];
}
else
{
// use this method on ios6
[window setRootViewController:picker_camera_];//self];
}
[window makeKeyAndVisible];
#endif
}
else
{
//提示攝像頭無法用
}
}
-(void)onIPHONEAlbum
{
picker_library_ = [[UIImagePickerController alloc] init];
#ifdef HD_EDITION
picker_library_.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
picker_library_.allowsEditing = YES;
picker_library_.delegate = self;
#else
picker_library_.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
picker_library_.allowsEditing = YES;
picker_library_.delegate = self;
#endif
#ifdef HD_EDITION
CGSize libSize = picker_library_.view.frame.size;
//libSize = CGSizeMake(160/2, 160/2);
pc_image_picker_ = [[UIPopoverController alloc] initWithContentViewController:picker_library_];
if ( [[UIDevice currentDevice].systemVersion floatValue] < 6.0)
{
CCLog("systemVersion<6.0");
}
else
{
CCLog("systemVersion>=6.0");
}
[pc_image_picker_ presentPopoverFromRect:CGRectMake(57/2, 352/2, libSize.width, libSize.height) inView:[[UIApplication sharedApplication] keyWindow].rootViewController.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
#else
[[[UIApplication sharedApplication] keyWindow] addSubview:picker_library_.view];
#endif
}
@end
具體細節就不說了,主要是區分iPhone和iPad,然後區分 SDK6.0以上跟 6.0以下。