web-dev-qa-db-fra.com

PHImageResultIsDegradedKey / PHImageFileURLKey est introuvable

iOS 13 beta4 ne donne plus

1) PHImageFileURLKey 2) PHImageResultIsDegradedKey dans les clés d'informations de résultat d'image.

Quelqu'un sait comment trouver le fileurl du PHAsset?

6
guhan0

1 .PHImageResultIsDegradedKey est maintenant disponible dans la dernière version d'iOS 13 GM et GM2. Un problème a donc été résolu.

2 .PHImageFileURLKey ne sera pas disponible dans iOS 13 et si vous avez tellement besoin de fileURL d'un élément d'image et que vous en avez besoin sans aucun rappel de méthodes de PhotoKit, optez pour l'expression régulière dans la description de l'élément. Ça va marcher.

Vous pouvez obtenir le description d'un objet PHAssetResource en utilisant + [PHAssetResource assetResourcesForAsset:], utilisez le premier objet du tableau résultant, puis extrayez le fileURL de la chaîne en utilisant l'expression régulière:

public static func getFileURLFromPHAssetResourceDescription(description: String) -> String? {
    let regex = try! NSRegularExpression(pattern: "(?<=fileURL: ).*(?=\\s)")
    if let result = regex.firstMatch(in: description, options: [], range: NSRange(location: 0, length: description.count)) {
        let url = String(description[Range(result.range, in: description)!])
        return url
    }
    return nil
}

Remarque: uniquement disponible à partir d'iOS9

0
guhan0

Un exemple de code Objective-C pour quiconque le recherche:

PHContentEditingInputRequestOptions *editOptions = [[PHContentEditingInputRequestOptions alloc] init];

[myPHAsset requestContentEditingInputWithOptions:editOptions completionHandler:^(PHContentEditingInput *contentEditingInput, NSDictionary *info) {

    if (contentEditingInput.fullSizeImageURL) {
        //do something with contentEditingInput.fullSizeImageURL
    }

}];
1
AEQ

Si quelqu'un cherche à obtenir le même résultat sur Xamarin.iOS, il s'agit de ma version C # du code Swift:

phAsset.RequestContentEditingInput(new PHContentEditingInputRequestOptions(), phcontentediting);

puis:

private void phcontentediting(PHContentEditingInput contentEditingInput, NSDictionary requestStatusInfo)
        {

        }

lorsque phcontentediting est appelé, contentEditingInput a beaucoup d'informations utiles telles que CreationDate, FullSizeImageUrl et même Location!

1
Amir No-Family

let resourse = PHAssetResource.assetResources (pour: self.phasset)

laissez url = resourse.first? .originalFilename

Cela fonctionne pour moi!

0
xiaochuan

Vous pouvez utiliser

let photoPath = photoAsset.localIdentifier

pour remplacer le

let photoPath = info["PHImageFileURLKey"]
0

Si quelqu'un a besoin de la taille du fichier lors de l'utilisation de RequestContentEditingInput dans Xamarin.

var options = new PHContentEditingInputRequestOptions();
asset.RequestContentEditingInput(options, (PHContentEditingInput contentEditingInput, NSDictionary requestStatusInfo) =>
{
    var imageUrl = contentEditingInput.FullSizeImageUrl.ToString();

    NSObject fileSizeObj;
    if (contentEditingInput.FullSizeImageUrl.TryGetResource(new NSString("NSURLFileSizeKey"), out fileSizeObj))
    {
        var fileSizeNSNum = fileSizeObj as NSNumber;
        long fileSize = fileSizeNSNum.Int64Value;
    }

    // Make sure to dispose or your app will crash with a lot of photos!
    contentEditingInput.Dispose();

});
0
KTrace

Dans iOS 13.0, PHImageFileURLKey est supprimé. Afin d'accéder aux données PHAsset, lorsque nous appelons cette fonction pour requestImageData, nous pouvons obtenir des informations sur l'image via cette clé PHImageFileUTIKey.

PHImageManager.default().requestImageData(for: asset, options: PHImageRequestOptions(), resultHandler:{ [weak self] (imagedata, dataUTI, orientation, info) in

if let assetInfo = info, let fileURLKey = assetInfo["PHImageFileUTIKey"] as? NSString {
let fileComp = fileURLKey.components(separatedBy: ".")

if fileComp.count > 0 {
   // Do your stuff.
}

})
0
Bhanu

Avec la suggestion de guhan0, j'ai fait un petit changement. En effet, parfois, il y a plus de 1 "fileURL: ...", donc, je prends le premier lorsque la valeur commence par "file: //" ce qui signifie qu'il y a une URL de fichier. Je pense qu'il y a une meilleure solution, mais pour l'instant, cela fonctionne bien:

private func getFileURLFromPHAssetResource(resourceDescription description: String) -> String? {

        let regex = try! NSRegularExpression(pattern: "(?<=fileURL: ).*(?=\\s)")

        for match in regex.matches(in: description, options: [], range: NSRange(location: 0, length: description.count)).lazy {

            let url = String(description[Range(match.range, in: description)!])

            if url.starts(with: "file://") { return url }
        }

        return nil
    }
0
Lapinou