在我的iOS应用中,有没有办法访问从我的应用中截取的所有屏幕截图?
如果不可能,有没有办法只用截屏专辑(来自所有应用程序)打开图像选择器控制器(UIImagePickerController)?
谢谢。
答案 0 :(得分:5)
没有办法提供标准的UIImagePickerController,其源类型不是此处定义的
然而,有一种方法可以获取截图的专辑并将其呈现在自己的UI中。根据文档,你可以做这样的事情:
let options = PHFetchOptions()
options.predicate = NSPredicate(format: "localizedTitle = Screenshots")
let collections = PHAssetCollection.fetchAssetCollectionsWithType(.SmartAlbum, subtype: .Any, options: options)
let sceenShots = collections.firstObject as? PHAssetCollection
但是由于bug(上面会因为谓词而崩溃)你可以获取所有专辑,然后过滤截图的专辑(适用于iOS8 +)
let collections = PHAssetCollection.fetchAssetCollectionsWithType(.SmartAlbum, subtype: .Any, options: nil)
var screenshots: PHAssetCollection?
collections.enumerateObjectsUsingBlock {
(collection, _, _) -> Void in
if collection.localizedTitle == "Screenshots" {
screenshots = collection as? PHAssetCollection
}
}
或者如果你的目标是iOS9 +,你可以这样做:
let collections = PHAssetCollection.fetchAssetCollectionsWithType(.SmartAlbum, subtype: .SmartAlbumScreenshots, options: nil)
let screenshots = collections.lastObject as? PHAssetCollection
另请注意,无法从特定应用中获取屏幕截图。
答案 1 :(得分:1)
我还考虑了一种不同的方式来访问从我的应用中获取的所有屏幕截图。我们的想法是使用UIApplicationUserDidTakeScreenshotNotification拦截屏幕截图,然后检索并保存文件URL(或复制文件):
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(screenshotDetected) name:UIApplicationUserDidTakeScreenshotNotification object:nil];
- (void)screenshotDetected {
PHFetchResult<PHAssetCollection *> *albums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeSmartAlbumScreenshots options:nil];
[albums enumerateObjectsUsingBlock:^(PHAssetCollection * _Nonnull album, NSUInteger idx, BOOL * _Nonnull stop) {
PHFetchOptions *options = [[PHFetchOptions alloc] init];
options.wantsIncrementalChangeDetails = YES;
options.predicate = [NSPredicate predicateWithFormat:@"mediaType == %d",PHAssetMediaTypeImage];
PHFetchResult<PHAsset *> *assets = [PHAsset fetchAssetsInAssetCollection:album options:options];
[assets enumerateObjectsUsingBlock:^(PHAsset * _Nonnull asset, NSUInteger idx, BOOL * _Nonnull stop) {
// do things
}];
}];
}
问题是在执行代码时,最后一个触发通知的屏幕截图尚未可用。