Commit c7f449cf authored by yuzheng.tz's avatar yuzheng.tz

优化相机调用前的权限检查,防止第一次请求权限用户拒绝时的相机黑屏

parent a68f8488
...@@ -40,6 +40,7 @@ ...@@ -40,6 +40,7 @@
/// Return YES if Authorized 返回YES如果得到了授权 /// Return YES if Authorized 返回YES如果得到了授权
- (BOOL)authorizationStatusAuthorized; - (BOOL)authorizationStatusAuthorized;
+ (NSInteger)authorizationStatus; + (NSInteger)authorizationStatus;
- (void)requestAuthorizationWithCompletion:(void (^)())completion;
/// Get Album 获得相册/相册数组 /// Get Album 获得相册/相册数组
- (void)getCameraRollAlbum:(BOOL)allowPickingVideo allowPickingImage:(BOOL)allowPickingImage completion:(void (^)(TZAlbumModel *model))completion; - (void)getCameraRollAlbum:(BOOL)allowPickingVideo allowPickingImage:(BOOL)allowPickingImage completion:(void (^)(TZAlbumModel *model))completion;
......
...@@ -62,7 +62,7 @@ static CGFloat TZScreenScale; ...@@ -62,7 +62,7 @@ static CGFloat TZScreenScale;
/** /**
* 当某些情况下AuthorizationStatus == AuthorizationStatusNotDetermined时,无法弹出系统首次使用的授权alertView,系统应用设置里亦没有相册的设置,此时将无法使用,故作以下操作,弹出系统首次使用的授权alertView * 当某些情况下AuthorizationStatus == AuthorizationStatusNotDetermined时,无法弹出系统首次使用的授权alertView,系统应用设置里亦没有相册的设置,此时将无法使用,故作以下操作,弹出系统首次使用的授权alertView
*/ */
[self requestAuthorizationWhenNotDetermined]; [self requestAuthorizationWithCompletion:nil];
} }
return status == 3; return status == 3;
...@@ -77,18 +77,27 @@ static CGFloat TZScreenScale; ...@@ -77,18 +77,27 @@ static CGFloat TZScreenScale;
return NO; return NO;
} }
//AuthorizationStatus == AuthorizationStatusNotDetermined 时询问授权弹出系统授权alertView - (void)requestAuthorizationWithCompletion:(void (^)())completion {
- (void)requestAuthorizationWhenNotDetermined { void (^callCompletionBlock)() = ^(){
dispatch_async(dispatch_get_main_queue(), ^{
if (completion) {
completion();
}
});
};
if (iOS8Later) { if (iOS8Later) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) { [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
dispatch_async(dispatch_get_main_queue(), ^{ callCompletionBlock();
});
}]; }];
}); });
} else { } else {
[self.assetLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) { [self.assetLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
} failureBlock:nil]; callCompletionBlock();
} failureBlock:^(NSError *error) {
callCompletionBlock();
}];
} }
} }
......
...@@ -473,6 +473,7 @@ static CGSize AssetGridThumbnailSize; ...@@ -473,6 +473,7 @@ static CGSize AssetGridThumbnailSize;
#pragma mark - Private Method #pragma mark - Private Method
/// 拍照按钮点击事件
- (void)takePhoto { - (void)takePhoto {
AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo]; AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
if ((authStatus == AVAuthorizationStatusRestricted || authStatus ==AVAuthorizationStatusDenied) && iOS7Later) { if ((authStatus == AVAuthorizationStatusRestricted || authStatus ==AVAuthorizationStatusDenied) && iOS7Later) {
...@@ -482,7 +483,26 @@ static CGSize AssetGridThumbnailSize; ...@@ -482,7 +483,26 @@ static CGSize AssetGridThumbnailSize;
NSString *message = [NSString stringWithFormat:[NSBundle tz_localizedStringForKey:@"Please allow %@ to access your camera in \"Settings -> Privacy -> Camera\""],appName]; NSString *message = [NSString stringWithFormat:[NSBundle tz_localizedStringForKey:@"Please allow %@ to access your camera in \"Settings -> Privacy -> Camera\""],appName];
UIAlertView * alert = [[UIAlertView alloc]initWithTitle:[NSBundle tz_localizedStringForKey:@"Can not use camera"] message:message delegate:self cancelButtonTitle:[NSBundle tz_localizedStringForKey:@"Cancel"] otherButtonTitles:[NSBundle tz_localizedStringForKey:@"Setting"], nil]; UIAlertView * alert = [[UIAlertView alloc]initWithTitle:[NSBundle tz_localizedStringForKey:@"Can not use camera"] message:message delegate:self cancelButtonTitle:[NSBundle tz_localizedStringForKey:@"Cancel"] otherButtonTitles:[NSBundle tz_localizedStringForKey:@"Setting"], nil];
[alert show]; [alert show];
} else { // 调用相机 } else if (authStatus == AVAuthorizationStatusNotDetermined) {
// fix issue 466, 防止用户首次拍照拒绝授权时相机页黑屏
if (iOS7Later) {
[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
if (granted) {
dispatch_sync(dispatch_get_main_queue(), ^{
[self pushImagePickerController];
});
}
}];
} else {
[self pushImagePickerController];
}
} else {
[self pushImagePickerController];
}
}
// 调用相机
- (void)pushImagePickerController {
UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypeCamera; UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypeCamera;
if ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]) { if ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]) {
self.imagePickerVc.sourceType = sourceType; self.imagePickerVc.sourceType = sourceType;
...@@ -493,7 +513,6 @@ static CGSize AssetGridThumbnailSize; ...@@ -493,7 +513,6 @@ static CGSize AssetGridThumbnailSize;
} else { } else {
NSLog(@"模拟器中无法打开照相机,请在真机中使用"); NSLog(@"模拟器中无法打开照相机,请在真机中使用");
} }
}
} }
- (void)refreshBottomToolBarStatus { - (void)refreshBottomToolBarStatus {
......
...@@ -132,7 +132,7 @@ ...@@ -132,7 +132,7 @@
UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:nil otherButtonTitles:@"拍照",@"去相册选择", nil]; UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:nil otherButtonTitles:@"拍照",@"去相册选择", nil];
[sheet showInView:self.view]; [sheet showInView:self.view];
} else { } else {
[self pushImagePickerController]; [self pushTZImagePickerController];
} }
} else { // preview photos or video / 预览照片或者视频 } else { // preview photos or video / 预览照片或者视频
id asset = _selectedAssets[indexPath.row]; id asset = _selectedAssets[indexPath.row];
...@@ -196,7 +196,7 @@ ...@@ -196,7 +196,7 @@
#pragma mark - TZImagePickerController #pragma mark - TZImagePickerController
- (void)pushImagePickerController { - (void)pushTZImagePickerController {
if (self.maxCountTF.text.integerValue <= 0) { if (self.maxCountTF.text.integerValue <= 0) {
return; return;
} }
...@@ -267,16 +267,35 @@ ...@@ -267,16 +267,35 @@
// 无相机权限 做一个友好的提示 // 无相机权限 做一个友好的提示
UIAlertView * alert = [[UIAlertView alloc]initWithTitle:@"无法使用相机" message:@"请在iPhone的""设置-隐私-相机""中允许访问相机" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"设置", nil]; UIAlertView * alert = [[UIAlertView alloc]initWithTitle:@"无法使用相机" message:@"请在iPhone的""设置-隐私-相机""中允许访问相机" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"设置", nil];
[alert show]; [alert show];
} else if (authStatus == AVAuthorizationStatusNotDetermined) {
// fix issue 466, 防止用户首次拍照拒绝授权时相机页黑屏
if (iOS7Later) {
[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
if (granted) {
dispatch_sync(dispatch_get_main_queue(), ^{
[self takePhoto];
});
}
}];
} else {
[self takePhoto];
}
// 拍照之前还需要检查相册权限 // 拍照之前还需要检查相册权限
} else if ([TZImageManager authorizationStatus] == 2) { // 已被拒绝,没有相册权限,将无法保存拍的照片 } else if ([TZImageManager authorizationStatus] == 2) { // 已被拒绝,没有相册权限,将无法保存拍的照片
UIAlertView * alert = [[UIAlertView alloc]initWithTitle:@"无法访问相册" message:@"请在iPhone的""设置-隐私-相册""中允许访问相册" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"设置", nil]; UIAlertView * alert = [[UIAlertView alloc]initWithTitle:@"无法访问相册" message:@"请在iPhone的""设置-隐私-相册""中允许访问相册" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"设置", nil];
alert.tag = 1; alert.tag = 1;
[alert show]; [alert show];
} else if ([TZImageManager authorizationStatus] == 0) { // 正在弹框询问用户是否允许访问相册,监听权限状态 } else if ([TZImageManager authorizationStatus] == 0) { // 未请求过相册权限
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [[TZImageManager manager] requestAuthorizationWithCompletion:^{
return [self takePhoto]; [self takePhoto];
}); }];
} else { // 调用相机 } else {
[self pushImagePickerController];
}
}
// 调用相机
- (void)pushImagePickerController {
UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypeCamera; UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypeCamera;
if ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]) { if ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]) {
self.imagePickerVc.sourceType = sourceType; self.imagePickerVc.sourceType = sourceType;
...@@ -287,7 +306,6 @@ ...@@ -287,7 +306,6 @@
} else { } else {
NSLog(@"模拟器中无法打开照相机,请在真机中使用"); NSLog(@"模拟器中无法打开照相机,请在真机中使用");
} }
}
} }
- (void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { - (void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
...@@ -346,7 +364,7 @@ ...@@ -346,7 +364,7 @@
if (buttonIndex == 0) { // take photo / 去拍照 if (buttonIndex == 0) { // take photo / 去拍照
[self takePhoto]; [self takePhoto];
} else if (buttonIndex == 1) { } else if (buttonIndex == 1) {
[self pushImagePickerController]; [self pushTZImagePickerController];
} }
} }
...@@ -379,7 +397,7 @@ ...@@ -379,7 +397,7 @@
/// 用户点击了取消 /// 用户点击了取消
- (void)tz_imagePickerControllerDidCancel:(TZImagePickerController *)picker { - (void)tz_imagePickerControllerDidCancel:(TZImagePickerController *)picker {
// NSLog(@"cancel"); // NSLog(@"cancel");
} }
// The picker should dismiss itself; when it dismissed these handle will be called. // The picker should dismiss itself; when it dismissed these handle will be called.
// If isOriginalPhoto is YES, user picked the original photo. // If isOriginalPhoto is YES, user picked the original photo.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment