天天看點

iOS 對iphone和 ipad的攝像頭和圖檔庫的差別處理代碼

     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以下。