2013-04-29 12 views
6

Próbuję użyć metody AssetForURL, ale zwraca zero.AssetForURL zwraca zero

Jest to kod używam:

-(void)addAssetURL:(NSURL*)assetURL toAlbum:(NSString*)albumName withCompletionBlock:(SaveImageCompletion)completionBlock 
{ 
__block BOOL albumWasFound = NO; 

//search all photo albums in the library 
[self enumerateGroupsWithTypes:ALAssetsGroupAlbum 
        usingBlock:^(ALAssetsGroup *group, BOOL *stop) { 

         //compare the names of the albums 
         if ([albumName compare: [group valueForProperty:ALAssetsGroupPropertyName]]==NSOrderedSame) { 

          //target album is found 
          albumWasFound = YES; 

          //get a hold of the photo's asset instance 
          [self assetForURL: assetURL 
            resultBlock:^(ALAsset *asset) { 
             //add photo to the target album 
             [group addAsset: asset]; 
             //run the completion block 
             completionBlock(nil); 

            } failureBlock: completionBlock]; 

          //album was found, bail out of the method 
          return; 
         } 

         if (group==nil && albumWasFound==NO) { 
          //photo albums are over, target album does not exist, thus create it 

          __weak ALAssetsLibrary* weakSelf = self; 

          //create new assets album 
          [self addAssetsGroupAlbumWithName:albumName 
                resultBlock:^(ALAssetsGroup *group) { 

                 //get the photo's instance 
                 [weakSelf assetForURL: assetURL 
                    resultBlock:^(ALAsset *asset) { 

                     //add photo to the newly created album 
                     [group addAsset: asset]; 

                     //call the completion block 
                     completionBlock(nil); 

                    } failureBlock: completionBlock]; 

                } failureBlock: completionBlock]; 

          //should be the last iteration anyway, but just in case 
          return; 
         } 

        } failureBlock: completionBlock]; 

} 

Adres URL ja daję to jest:

file://localhost/private/var/mobile/Applications/6630FBD3-1212-4ED0-BC3B-0C23AEEFB267/tmp/capture-T0x1d56e310.tmp.N3SZXy/capturedvideo.MOV 

Dostaję URL z metody delegata kamera:

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 

    NSLog(@"%@",[info objectForKey:UIImagePickerControllerMediaURL]); 

    [library addAssetURL:[info objectForKey:UIImagePickerControllerMediaURL] toAlbum:@"Compedia videos" withCompletionBlock:^(NSError *error) { 
     if (error!=nil) { 
      NSLog(@"Big error: %@", [error description]); 
     } 
    }]; 

} 

Wszelkie pomysły?

+0

Czy jesteś pewien, że masz dostęp do adresu URL? Wypróbuj w przeglądarce urządzenia/symulatora. – Alexander

+0

'assetForURL' nie ma typu zwrotu (void). Czy masz na myśli, że zasób w ResultBlock jest zerowy? – Felix

+0

Tak, to właśnie miałem na myśli – user2328703

Odpowiedz

0

Czy na pewno masz dostęp do biblioteki zasobów? Nie zapomnij sprawdzić status Dostęp

ALAuthorizationStatus status = [ALAssetsLibrary authorizationStatus]; 
if (status == ALAuthorizationStatusNotDetermined) { 
    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; 
    [ALAssetsLibrary authorizationStatus]; 
    __block BOOL accessChecked = NO; /// *stop is not respected immediately 
    [library enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) { 
     if (accessChecked) return ; 
     *stop = YES; 
     accessChecked = YES; 
    } failureBlock:^(NSError *error){ 
    }]; 
} 
else { 
    BOOL granted = status == ALAuthorizationStatusAuthorized; 
} 

- (void)enumerateGroupsWithTypes:(ALAssetsGroupType)types usingBlock:(ALAssetsLibraryGroupsEnumerationResultsBlock)enumerationBlock failureBlock:(ALAssetsLibraryAccessFailureBlock)failureBlock 

Opis Wywołuje blok daną odejście jako parametr każdej z grup aktywów pasujących do danego rodzaju grupy aktywów. Wyniki są przekazywane jeden po drugim do wywołującego przez wykonanie bloku wyliczeniowego. Ta metoda jest asynchroniczna. Po wyliczeniu grup użytkownik może poprosić użytkownika o potwierdzenie dostępu aplikacji do danych; metoda, jednak, natychmiast zwraca. Powinieneś wykonać dowolną pracę, którą chcesz z zasobami w enumerationBlock.

Jeśli użytkownik odmówi dostępu do aplikacji lub jeśli żadna aplikacja nie ma dostępu do danych, wywoływana jest blokada błędu .

Powiązane problemy