UIImagePickerController保存文件路径iOS / iPhone

时间:2012-07-16 11:56:45

标签: iphone objective-c ios xcode uiimagepickercontroller

使用以下代码我只想保存视频文件路径(不想运行它或打开媒体播放器视图)。

问题是当我点击选择器控制器中的视频缩略图时,它会自动在媒体播放器视图中打开视频。虽然我只想让它的路径保存,然后我想在用户按下播放按钮时使用它。

让我解释一下,我有2个视图,On MainView我有2个按钮,1个按钮OPEN用于打开UIImagePickerController并选择视频,1个按钮PLAY用于播放相同的选定视频。我在这里要做的是,当用户点击OPEN按钮UIImagePickerController时,应该打开并且用户应该能够选择视频,当用户点击视频缩略图UIImagePickerController时应该被解雇,{应打开{1}}(打开和播放按钮)。然后,如果用户想要播放电影,他将点击“播放”按钮并观看电影。

但是在这段代码中,当我点击MainView中的电影缩略图时,它会导航到媒体查看器。

UIImagePickerController

2 个答案:

答案 0 :(得分:1)

有两种方式......

  1. allowEditing 设置为 NO 。这不应该显示媒体查看器,但由于我不是每天都使用UIImagePickerController,我不是百分百肯定,你需要测试它。但即使它有效,如果视频超过10分钟,编辑界面仍然存在,因为必须修剪视频(查看UIImagePickerController的文档)。但正如我所写,测试它,因为我可能是错的,因为我不使用它。

  2. 请看ALAssetsLibrary。有了这个班级(和朋友),您可以在几分钟内编写自定义选择器。然后你可以做任何你想做的事情。但是这种方法有一个小的问题 - 用户必须同意您的应用程序可以访问位置信息,这对用户来说是非常误导的。那是因为资产可以包含位置信息。当用户禁用对您的应用程序的位置信息的访问时,您的自定义选择器将无法工作。


  3. 更新,评论中要求的一些代码。

    获取群组列表(此代码获取所有群组并过滤掉没有视频的群组):

    if ( ! __assetsLibrary ) {
      __assetsLibrary = [[ALAssetsLibrary alloc] init];
    }
    [__assetsLibrary enumerateGroupsWithTypes:__assetsGroupType
                                   usingBlock:^( ALAssetsGroup *group, BOOL *stop ) {
                                     /*
                                      * If group is nil => end of iteration, no more groups will arrive.
                                      */
                                     if ( group ) {
                                       /*
                                        * We do only want groups with videos, so, set filter to allVideos. Following
                                        * numberOfAssets method respects filter settings, so, only number of videos
                                        * is returned.
                                        */
                                       [group setAssetsFilter:[ALAssetsFilter allVideos]];
                                        if ( [group numberOfAssets] > 0 ) {
                                          TMDCONDLOG( DEBUG_PICKER, @"Asset group added: %@", [group valueForProperty:ALAssetsGroupPropertyName ]);
                                          [__assetsGroups addObject:group];
                                        } else {
                                          TMDCONDLOG( DEBUG_PICKER, @"Skipping %@, no videos inside", [group valueForProperty:ALAssetsGroupPropertyName] );
                                        }
                                     } else {
                                       // group is nil, no more groups will arrive, reload table
                                       TMDCONDLOG( DEBUG_PICKER, @"Asset groups count: %d", (int)[__assetsGroups count]);
                                       dispatch_async( dispatch_get_main_queue(), ^{
                                         [self reloadDataFinished];
                                       } );
                                     }
                                   }
                                 failureBlock:^( NSError *error) {
                                   TMDCONDLOG( DEBUG_PICKER, @"Failed: %@", error );
                                   dispatch_async(dispatch_get_main_queue(), ^{
                                     [self reloadDataFinished];
                                     [self showAccessFailedError];
                                   });
                                 }];
    

    以下是一些枚举ALAssetsGroup的代码:

    [__assetsGroup enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stopEnumeratingAssets ) {
      TMDCONDLOG( DEBUG_ASSETS, @"Asset: %@ Index: %d", result, ( int ) index );
      if ( result  ) {
        [__assets addObject:result];
      }
    
      /*
       * Enumeration ends? If yes, reload table.
       */
      if ( ! result || index == NSNotFound ) {
        *stopEnumeratingAssets = YES;
        TMDCONDLOG( DEBUG_ASSETS, @"Going to reload table view" );
        [self performSelectorOnMainThread:@selector(reloadTableData) withObject:nil waitUntilDone:NO];
      }
    }];
    

    以下是如何获取群组的资产数量,海报图片等的示例:

    __groupAssetsCountLabel.text = [NSString stringWithFormat:@"(%d)", (int) [__assetsGroup numberOfAssets]];    
    __groupTitleLabel.text = ( NSString * )[__assetsGroup valueForProperty:ALAssetsGroupPropertyName];
    __groupImageView.image = [UIImage imageWithCGImage:[__assetsGroup posterImage]];
    

    在您的群组的自定义UITableViewCell中使用此功能。以下是如何获取资产缩略图和持续时间的示例:

    dispatch_async( dispatch_get_main_queue(), ^{
      __assetView.image = [UIImage imageWithCGImage:[__asset thumbnail]];
    } );
    id property = [__asset valueForProperty:ALAssetPropertyDuration];
    if ( ! [property isEqual:ALErrorInvalidProperty] ) {
      NSInteger duration = ( ( NSNumber * )property ).integerValue;
      __durationLabel.text = [NSString stringWithFormat:@"%d:%02d", ( int ) ( duration / 60 ), ( int ) ( duration % 60 ) ];
    } else {
      __durationLabel.text = nil;
    }
    

    您可以在自定义UITableViewCell中使用此代码,以连续显示4个资源,以模拟Apple的选择器UI。


    宏示例......

    #define TMLOG( __xx, ... ) NSLog( @"%s(%d): " __xx, __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__ )
    
    #ifdef DEBUG
    #define TMDLOG( __xx, ... ) TMLOG( __xx, ##__VA_ARGS__ )
    #else
    #define TMDLOG( __xx, ... ) ((void)0)
    #endif
    
    #ifdef DEBUG
    #define TMDCONDLOG( __cond, __xx, ... ) { \
    if ( ( __cond ) )  { \
    TMDLOG( __xx, ##__VA_ARGS__ ); \
    } \
    } ((void)0)
    #else
    #define TMDCONDLOG( __cond, __xx, ... ) ((void)0)
    #endif
    

答案 1 :(得分:0)

中添加此内容
openPicker: method.

mediaPickerController.mediaTypes =
    [[NSArray alloc] initWithObjects: (NSString *) kUTTypeMovie, nil];

<强>更新

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo{

[picker dismissModalViewControllerAnimated:YES];

}