#import <Foundation/Foundation.h>
typedef NS_ENUM(NSInteger, ChosePhontType) {
//相册
//相机
};
@interface AuthorityManage : NSObject
@property (nonatomic, strong) CLLocationManager *locationManager; //定位管理类
+ (instancetype)sharedManager;
- (void)chosePhoto:(ChosePhontType)type picker:(UIImagePickerController *)picker vc:(UIViewController
- (void)savePhotoToAlbumWithImage:(UIImage *)image vc:(UIViewController
- (void)setLocationManageWithDesiredAccuracy:(CLLocationAccuracy)desiredAccuracy
CLLocationDistance)distanceFilter
UIViewController
@end
#import "AuthorityManage.h"
#import <Photos/PHPhotoLibrary.h>
#import <AVFoundation/AVCaptureDevice.h>
#import <AVFoundation/AVMediaFormat.h>
// kCLAuthorizationStatusNotDetermined //用户尚未做出选择这个应用程序的问候
// kCLAuthorizationStatusRestricted //此应用程序没有被授权访问的照片数据。可能是家长控制权限
// kCLAuthorizationStatusDenied //用户已经明确否认了这一照片数据的应用程序访问
// kCLAuthorizationStatusAuthorized //用户已经授权应用访问照片数据
@implementation
// 创建单例对象
+ (instancetype)sharedManager
{
static dispatch_once_t token;
static AuthorityManage * manage = nil;
dispatch_once(&token, ^{
if
AuthorityManage alloc] init];
}
});
return
}
//==========访问系统 相册 / 相机 ===============
- (void)chosePhoto:(ChosePhontType)type picker:(UIImagePickerController *)picker vc:(UIViewController
{
if (type == ChosePhontTypeAlbum) { // 相册
//======判断 访问相册 权限是否开启=======
PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
//有被授权访问的照片数据 用户已经明确否认了这一照片数据的应用程序访问
if (status == PHAuthorizationStatusRestricted || status == PHAuthorizationStatusDenied) {
//====没有权限====
[[AuthorityManage sharedManager] showNoAlbumAuthalertControllerWithVC:vc type:ChosePhontTypeAlbum];
} else { //====有访问相册的权限=======
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) { //相册可用
picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
[vc presentViewController:picker animated:YES completion:^{}];
else { // 相册不可用
NSLog(@"相册不可用");
}
}
else if (type == ChosePhontTypeCamera) { // 相机
//======判断 访问相机 权限是否开启=======
AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
if (authStatus == AVAuthorizationStatusRestricted || authStatus == AVAuthorizationStatusDenied){
//====无权限====
[[AuthorityManage sharedManager] showNoAlbumAuthalertControllerWithVC:vc type:ChosePhontTypeCamera];
else
//===有权限======
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) { //相机可用
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
[vc presentViewController:picker animated:YES completion:^{}];
else { // 相机不可用
NSLog(@"相机不可用");
}
}
}
}
- (void)showNoAlbumAuthalertControllerWithVC:(UIViewController *)vc type:(ChosePhontType)type
{
NSString
NSString
if (type == ChosePhontTypeAlbum) {
title = @"开启相册权限";
@"开启后才能访问你的相册";
else
@"开启相机权限";
@"开启后才能访问你的相机";
}
*alertController = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
}];
UIAlertAction *ok = [UIAlertAction actionWithTitle:@"去开启" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
//===无权限 引导去开启===
[[AuthorityManage sharedManager] openJurisdiction];
}];
addAction:cancel];
addAction:ok];
[vc presentViewController:alertController animated:YES completion:nil];
}
#pragma mark-------去设置界面开启权限----------
- (void)openJurisdiction
{
NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
if (kSystemVersion > 10.0) {
[[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
else
[[UIApplication sharedApplication] openURL:url];
}
}
}
- (void)savePhotoToAlbumWithImage:(UIImage *)image vc:(UIViewController
{
if (@available(iOS 11.0, *)) {
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
if (status == PHAuthorizationStatusNotDetermined || status == PHAuthorizationStatusAuthorized) {
//保存图片到相册
UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), NULL);
else
//====没有权限====
[[AuthorityManage sharedManager] showNoAlbumAuthalertControllerWithVC:vc type:ChosePhontTypeAlbum];
}
}];
else
//======判断 访问相册 权限是否开启=======
PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
//有被授权访问的照片数据 用户已经明确否认了这一照片数据的应用程序访问
//家长控制,不允许访问 || 用户拒绝当前应用访问相册
if (status == PHAuthorizationStatusRestricted || status == PHAuthorizationStatusDenied) {
//====没有权限====
[[AuthorityManage sharedManager] showNoAlbumAuthalertControllerWithVC:vc type:ChosePhontTypeAlbum];
} else { //====有访问相册的权限=======
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) { //相册可用
//因为需要知道该操作的完成情况,即保存成功与否,所以此处需要一个回调方法image:didFinishSavingWithError:contextInfo:
UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), NULL);
else { // 相册不可用
NSLog(@"相册不可用");
}
}
}
}
//保存相册回调方法
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void
{
NSString *msg = nil
if (error != NULL) {
@"保存图片失败"
else
@"保存图片成功"
}
[Common showToastMsg:msg];
}
- (void)setLocationManageWithDesiredAccuracy:(CLLocationAccuracy)desiredAccuracy
CLLocationDistance)distanceFilter
UIViewController
{
//判断定位是否开启是判断的整个手机系统的定位是否打开,并不是针对这一应用
//判断手机定位是否开启
if([CLLocationManager locationServicesEnabled]) {
//用户第一次下载应用需要先调用定位去系统注册 才能弹出是否允许定位的系统提示框
BOOL isRequestLocation = [[NSUserDefaults standardUserDefaults] boolForKey:kIsRequestLocationAuth];
if
self requestLocationWithDesiredAccuracy:desiredAccuracy distanceFilter:distanceFilter vc:vc];
else
//判断用户是否禁止当前应用获取位置权限 永不、使用应用期间、始终
if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorizedWhenInUse ||
[CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorizedAlways) {
//用户允许获取位置权限
self requestLocationWithDesiredAccuracy:desiredAccuracy distanceFilter:distanceFilter vc:vc];
else
//用户拒绝开启用户权限
[Common showSystemAlertWithtitle:@"打开定位服务来允许xxx确定您的位置"
message:@"请在系统设置中开启定位服务(设置>隐私>定位服务>xxx>使用应用期间)"
okBtnTitle:去开启
viewController:vc
alertOkBtnClicked:^(UIAlertAction
//引导去开启
NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
if( [[UIApplication sharedApplication] canOpenURL:url] ) {
[[UIApplication sharedApplication] openURL:url];
}
}];
}
}
else
//手机未开启权限
[Common showNormalAlert:@"在系统设置中开启定位服务来允许xxx确定您的位置"
andViewController:vc
alertOkBtnClicked:^(UIAlertAction
}
}
- (void)requestLocationWithDesiredAccuracy:(CLLocationAccuracy)desiredAccuracy
CLLocationDistance)distanceFilter
UIViewController
{
[AuthorityManage sharedManager].locationManager.desiredAccuracy = desiredAccuracy;
[AuthorityManage sharedManager].locationManager.distanceFilter = distanceFilter;
if (kSystemVersion >= 8) {
[[AuthorityManage sharedManager].locationManager requestWhenInUseAuthorization]; //使用程序其间允许访问位置数据(iOS8定位需要)
}
[[AuthorityManage sharedManager].locationManager startUpdatingLocation]; //开启定位
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:kIsRequestLocationAuth]; //是否注册过定位权限
[[NSUserDefaults standardUserDefaults] synchronize];
}
- (CLLocationManager
{
if (!_locationManager) {
_locationManager = [[CLLocationManager alloc] init];
}
return _locationManager;
}
//调用
[[AuthorityManage sharedManager] savePhotoToAlbumWithImage:Image vc:self];
[[AuthorityManage sharedManager] chosePhoto:ChosePhontTypeCamera picker:self.pickV vc:self];
#pragma mark - 地图定位
- (void)requestLocation
{
[AuthorityManage sharedManager].locationManager.delegate = self;
[[AuthorityManage sharedManager] setLocationManageWithDesiredAccuracy:kCLLocationAccuracyThreeKilometers distanceFilter:100 vc:self];
}
-(void)dealloc{
//防止回调崩溃
[AuthorityManage sharedManager].locationManager.delegate = nil;
}
#pragma mark - CLLocationManagerDelegate
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation
{
CLLocation *location = [locations lastObject];
//获取WGS-84坐标的对象,两者选其一
CLLocationCoordinate2D coords = location.coordinate;
//获得经纬度
NSLog(@"纬度%f,经度%f",coords.latitude,coords.longitude);
//停止定位
[[AuthorityManage sharedManager].locationManager stopUpdatingLocation];
}
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError
{
if ([error code] == kCLErrorDenied) {
NSLog(@"访问被拒绝");
}
if ([error code] == kCLErrorLocationUnknown) {
NSLog(@"无法获取位置信息");
}
}
Android 关闭相机服务 安卓如何关闭相机定位
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
nginx升级(简单、平滑、无需关闭服务)
nginx平滑升级
nginx 新版本 上传