2013-04-29 9 views
6

私はAssetForURLメソッドを使用しようとしていますが、それはnilを返しています。AssetForURLはnilを返します

-(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]; 

} 

私はそれを与えているURLは次のとおりです:

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

私はカメラのデリゲートメソッドからURLを取得しています:

この

は、私が使用しているコードです。
-(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]); 
     } 
    }]; 

} 

+0

本当にあなたはURLにアクセスできますか?デバイス/シミュレータのブラウザで試してみてください。 – Alexander

+0

'assetForURL'には戻り値の型(void)がありません。 resultBlockのアセットがnilであることを意味しますか? – Felix

+0

はい、これは私が意味したものです – user2328703

答えて

0

アセットライブラリにアクセスできますか? は、パラメータとして与えられたブロック通しを呼び出しアクセス状況に


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 

説明をチェックすることを忘れないでください与えられた資産グループのタイプと一致 資産グループの各。結果は、列挙ブロックを実行して、呼び出し元に1つずつ渡された です。 このメソッドは非同期です。グループが列挙されるとき、ユーザーは にデータへのアプリケーションのアクセスを確認するよう頼まれるかもしれません。方法は、 ですが、すぐに戻ります。 enumerationBlockのアセットで の作業を実行する必要があります。

ユーザーが アプリケーションへのアクセスを拒否した場合、またはアプリケーションにデータへのアクセスが許可されていない場合は、 failureBlockが呼び出されます。

関連する問題