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的改变不 ...
随机推荐
- ubuntu 18 设置语言环境
1. 查看语言环境 ubuntu系统中,存在两个系统变量:$LANG和$LANGUAGE 分别控制语言环境和地区,这两个变量是从/etc/default/locale中读取的: 方法一: echo $ ...
- Maven 安装与使用(一)
1. 安装 参考:http://maven.apache.org/install.html A. win7环境下,官网下载maven安装文件 B. 解压缩maven文件 C. 确认已配置好JAVA环境 ...
- QT5.3 杂记
Qt5下,QWidget系列从QtGui中被剥离出去,成为单独的QtWidget模块.随着Qt Quick2的引入,QtDeclarative也逐渐和QWidget系列也脱离关系. 最终:在Qt5下的 ...
- linux 设置git记住密码
linux下: 1.在~/下, touch创建文件 .git-credentials, 用vim编辑此文件,输入: https://{username}:{password}@github.com 注 ...
- sqlserver批量删除表
--批量删除表 ) DECLARE tmpCur CURSOR FOR SELECT name FROM sys.objects WHERE TYPE='U' AND name LIKE N'%_Qu ...
- HTML 水平线hr
HTML 水平线 <hr /> 标签在 HTML 页面中创建水平线. hr 元素可用于分隔内容. 实例 <p>This is a paragraph</p> < ...
- css属性值语法解读
//margin 形式语法: [ <length> | <percentage> | auto ]{1,4} //合法实例: margin: style /*单值语法 */ 举 ...
- dll的制作
https://blog.csdn.net/guanchanghui/article/details/1621031
- Oracle sql trace用法
sql_trace是oracle提供的一个非常好的跟踪工具,主要用来检查数据库的异常情况,通过跟踪数据库的活动,找到有问题的语句. 一.概述: SQL_TRACE是Oracle的一个非常强大的工 ...
- 【海龟汤策略】反趋势交易策略源代码分享(基于BOTVS)
策略介绍: 海龟之汤,简称“龟汤”,是个与海龟交易法则相反的交易策略,它利用了跟势交易(特别是海龟方式)在很多假突破方面的缺陷来获利(把海龟做成汤吃掉).上世纪八十年代早期,有个非常著名的交易员团体— ...