web-dev-qa-db-ja.com

PHImageResultIsDegradedKey / PHImageFileURLKeyが見つかりません

iOS 13ベータ4はもはや与えない

1)PHImageFileURLKey 2)画像結果情報キーのPHImageResultIsDegradedKey。

誰もがPHAssetのfileurlを見つける方法を知っていますか?

6
guhan0

1 .PHImageResultIsDegradedKeyが最新のiOS 13で利用可能になりましたGMおよびGM2。1つの問題が解決されました。

2 .PHImageFileURLKeyはiOS 13では使用できません。画像アセットのfileURLが必要で、PhotoKitのメソッドコールバックなしで必要な場合は、アセットの説明で正規表現を使用します。それが動作します。

+ [PHAssetResource assetResourcesForAsset:]を使用してPHAssetResourceオブジェクトのdescriptionを取得し、結果の配列から最初のオブジェクトを使用して、正規表現を使用して文字列からfileURLを抽出できます。

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
}

注:iOS9からのみ利用可能

0
guhan0

それを探している人のためのObjective-Cコードの例:

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

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

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

}];
1
AEQ

Xamarin.iOSで同じことを実現しようとしている場合、これは私のC#バージョンのSwiftコード:

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

その後:

private void phcontentediting(PHContentEditingInput contentEditingInput, NSDictionary requestStatusInfo)
        {

        }

phcontenteditingが呼び出されると、contentEditingInputにはCreationDateFullSizeImageUrl、さらにはLocationなどの多くの有用な情報が含まれます。

1
Amir No-Family

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

let url = resourse.first?.originalFilename

これは私のために働きます!

0
xiaochuan

使用できます

let photoPath = photoAsset.localIdentifier

交換する

let photoPath = info["PHImageFileURLKey"]

XamarinでRequestContentEditingInputを使用するときに誰かがファイルサイズを必要とする場合。

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

IOS 13.0では、PHImageFileURLKeyは削除されました。 PHAssetデータにアクセスするために、requestImageDataにこの関数を呼び出すと、このキー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

Guhan0の提案により、小さな変更を加えました。実際、時々、1つ以上の「fileURL:...」がある場合があるので、値が「file://」で始まる、つまりファイルのURLがあることを最初にとります。私はもっ​​と良い解決策があると思いますが、今のところそれはうまくいきます:

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