swift3.0 保存图片到本地,申请权限
1.info中写上
<key>NSCameraUsageDescription</key>
<string>需要您的同意才能读取媒体资料库</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>需要您的同意才能读取媒体资料库</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>需要您的同意才能读取媒体资料库</string>
<key>Privacy - Photo Library Usage Description</key>
<string>需要您的同意才能读取媒体资料库</string>
2.保存
import Photos //操作结果枚举
enum PhotoAlbumUtilResult {
case success, error, denied
} //相册操作工具类
class PhotoAlbumUtil: NSObject { public typealias completion = ((_ result: PhotoAlbumUtilResult) -> ())
//判断是否授权
class func isAuthorized() -> Bool {
return PHPhotoLibrary.authorizationStatus() == .authorized ||
PHPhotoLibrary.authorizationStatus() == .notDetermined } //保存图片到相册
class func saveImageInAlbum(image: UIImage, albumName: String,
completion: completion?) {
//权限验证
if !isAuthorized() {
completion?(.denied)
return
}
var assetAlbum: PHAssetCollection? //如果指定的相册名称为空,则保存到相机胶卷。(否则保存到指定相册)
if albumName.isEmpty {
let list = PHAssetCollection
.fetchAssetCollections(with: .smartAlbum, subtype: .smartAlbumUserLibrary,
options: nil)
assetAlbum = list[0]
} else {
//看保存的指定相册是否存在
let list = PHAssetCollection
.fetchAssetCollections(with: .album, subtype: .any, options: nil)
list.enumerateObjects({ (album, index, stop) in
let assetCollection = album
if albumName == assetCollection.localizedTitle {
assetAlbum = assetCollection
stop.initialize(to: true)
}
})
//不存在的话则创建该相册
if assetAlbum == nil {
PHPhotoLibrary.shared().performChanges({
PHAssetCollectionChangeRequest
.creationRequestForAssetCollection(withTitle: albumName)
}, completionHandler: { (isSuccess, error) in
self.saveImageInAlbum(image: image, albumName: albumName,
completion: completion)
})
return
}
} //保存图片
PHPhotoLibrary.shared().performChanges({
//添加的相机胶卷
let result = PHAssetChangeRequest.creationRequestForAsset(from: image)
//是否要添加到相簿
if !albumName.isEmpty {
let assetPlaceholder = result.placeholderForCreatedAsset
let albumChangeRequset = PHAssetCollectionChangeRequest(for:
assetAlbum!)
albumChangeRequset!.addAssets([assetPlaceholder!] as NSArray)
}
}) { (isSuccess: Bool, error: Error?) in
if isSuccess {
completion?(.success)
} else{
print(error!.localizedDescription)
completion?(.error)
}
}
}
}
3.使用
PhotoAlbumUtil.saveImageInAlbum(image: image, albumName: "APP") { (result) in
DispatchQueue.main.async {
switch result{
case .success:
//"保存成功"
break
case .denied:
//没有权限,去设置里打开权限
let a = MyAlertController()
a.addOKView("去设置"){ (a) in
let url = URL(string: UIApplicationOpenSettingsURLString)
if let url = url, UIApplication.shared.canOpenURL(url) {
if #available(iOS 10, *) {
UIApplication.shared.open(url, options: [:],
completionHandler: {
(success) in
})
} else {
UIApplication.shared.openURL(url)
}
}
}
a.addCancelView()
a.show(self,title: "没有相册权限",message: "请您到 \"设置\" -> \"APP\" 开启相册权限", style: .alert )
break
case .error:
//"保存失败"
}
}
}
swift3.0 保存图片到本地,申请权限的更多相关文章
- Android6.0动态申请权限
先直接看代码: public void onClick(View v){ onCallPermission(); } public void onCallPermission(){ if (Build ...
- 说说Android6.0动态申请权限的那些坑
白天在做SDK23版本的适配,遇到了不少坑,现在抽空记下来,以此为戒. 首先要知道哪些坑,就得先了解一些定义和基本使用方式. 那么先介绍一下动态申请的权限分组情况. 下面的权限组是由谷歌官方定义的,目 ...
- Android6.0动态申请权限那些坑--以及避免用户选择不再提示后无法获取权限的问题
Android 6.0 为了保护用户隐私,将一些权限的申请放在了应用运行的时候去申请, 比如以往的开发中,开发人员只需要将需要的权限在清单文件中配置即可,安装后用户可以在设置中的应用信息中看到:XX应 ...
- swift3.0 CoreGraphics绘图-实现画板
swift3.0对绘图的API进行了优化,看起来更swift了. 看下UI的构造.设置画笔粗细.清空面板和保存到本地 下面直接看画板文件 这里我做的比较复杂,记录触摸到的每个点,再连成路径,其实直接用 ...
- Android笔记之使用ImageView加载网络图片以及保存图片到本地并更新图库
ImageView显示网络图片 findViewById(R.id.btnLoad).setOnClickListener(new View.OnClickListener() { @Override ...
- 使用 swift3.0高仿新浪微博
项目地址:https://github.com/SummerHH/swift3.0WeBo 使用 swift3.0 高仿微博,目前以实现的功能有,添加访客视图,用户信息授权,首页数据展示(支持正文中连 ...
- Android开发在Activity外申请权限调用相机打开相册
问题描述: 最近在项目中遇到一个需要调用相册和打开相机的需求,但是,在Android 6.0以后,调用相册属于危险权限,需要开发者动态获取,这就意味着我们申请权限是与Activity绑定的,但如果一个 ...
- Android无需申请权限拨打电话
Android打电话有两种实现方法: 第一种方法,拨打电话跳转到拨号界面.源代码如下: Intent intent = new Intent(Intent.ACTION_DIAL); Uri data ...
- Swift3.0变化分享
Swift 3.0 做出的改变很大,在这篇文章中,我将尽我所能,利用代码样例给大家解释Swift 3.0最重要(要命)的改变,希望大家能够做好升级Swift 3.0 的准备.Swift 3.0的改变不 ...
随机推荐
- C语言函数指针(指向函数的指针)
转载:http://c.biancheng.net/cpp/html/3248.html 一个函数总是占用一段连续的内存区域,函数名在表达式中有时也会被转换为该函数所在内存区域的首地址,这和数组名非常 ...
- java自增(自减)运算符
自增(自减)运算符: ++ --就是可以将当前变量自我增加(减少)1 的运算符. i++, 后++, 先将 i 的值作为整个表达的值, 然后将 i 增加 1. ++i, 先++, 先将 i 增加 ...
- mysql主键问题
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_22314145/article/details/80824660 MySQL主键 一. MyS ...
- 并发包同步工具CyclicBarrier
/** * * @描述: 同步工具 * 表示大家彼此等待,大家集合好后才开始出发,分散活动后又在指点地点集合碰合 . * @作者: Wnj . * @创建时间: 2017年5月16日 . * @版本: ...
- [使用教程]cocostudio之UI编辑器动画模式
有坑! 1. 使用 (1)点击动画模式按钮,进入动画模式 (2)[关键1]左下角动作列表,右键添加动画 (3)[关键2]渲染区选择要动画的控件,右键编辑动画 * 可以看到最下面多了关键帧 (4)在右边 ...
- 一个老IT产品管理者对于产品经理工作的经验总结
一个老IT产品管理者对于产品经理工作的经验总结 1. 任何行业,包括IT行业,所谓产品管理.产品经理,其核心应该是企业产品管理制度,也就是说,只有企业存在相应的.合理的产品管理体系和制度,产品管理.产 ...
- 有时间,可以研究哈redis的源代码
1 2 3 4 留位,以后自己用!
- SQLi-db 批量注入工具+教程
这款工具在中国还没人发.所以我发来给大家玩玩:顺便带了教程. 关键字:inurl:article.asp?id= inurl:article.php?id=inurl:article.jsp?id=( ...
- linux解压eclipse启动时无法找到jre环境的解决办法
使用软链接的方法: 1.打开终端进入到eclipse安装主目录下:mkdir jre 2.cd jre 3.ln -s /home/zhoushuo/app/jdk1.8.0_102/bin bin
- 获取Spring管理的Bean
1.再Spring配置文件中配置工具类 <!-- 用于持有ApplicationContext,可以使用SpringContextHolder.getBean('xxxx')的静态方法得到spr ...