0

ALAsset にアクセスするために、このすばらしい Titanium モジュールをフォークしました。 https://github.com/amigoni/titanium-mobile-alasset-module

写真のデータと情報にアクセスしようとしています。シミュレーターでは正常に動作するようですが、デバイスでは動作しません。

ここにコードがあると思われる場所があります

-(void)assetThumbnails:(id)args
{
ENSURE_UI_THREAD_1_ARG(args);
ENSURE_SINGLE_ARG(args,NSDictionary);

id onthumb       = [args objectForKey:@"thumbnailCallback"];
NSString *group = [args objectForKey:@"group"];
ENSURE_STRING_OR_NIL(group);
int page        = [TiUtils intValue:[args objectForKey:@"page"] def:1] - 1;
int perPage     = [TiUtils intValue:[args objectForKey:@"perPage"] def:25];

int fromIndex   = page * perPage;
int toIndex     = fromIndex + perPage;

NSUInteger groupTypes = ALAssetsGroupSavedPhotos;
if( group == nil ){
    group = @"savedPhotos";
}
if( [group isEqualToString:@"savedPhotos"] ){
    groupTypes  = ALAssetsGroupSavedPhotos;
} else if( [group isEqualToString:@"photoStream"] ){
    groupTypes  = ALAssetsGroupPhotoStream;
} else if( [group isEqualToString:@"faces"] ){
    groupTypes  = ALAssetsGroupFaces;
} else if( [group isEqualToString:@"all"] ){
    groupTypes  = ALAssetsGroupAll;
}
NSMutableArray *assets  = [[NSMutableArray alloc] init];
RELEASE_TO_NIL(thumbCallback);
thumbCallback  = [onthumb retain];
void (^assetGroupEnumerator) (ALAssetsGroup *, BOOL *) = ^(ALAssetsGroup *group, BOOL *stop){
    if(group != nil) {
        [group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
            if( result != nil )
            {
                if( (index >= fromIndex) && (index <= toIndex) ){
                    NSURL *url = [[result defaultRepresentation] url];
                    NSString *sUrl = [url absoluteString];
                    NSDictionary *metadata = result.defaultRepresentation.metadata; 
                        UIImage *thumbnail = [UIImage imageWithCGImage:[result thumbnail]];
                        NSDictionary *event = [NSDictionary 
                                               dictionaryWithObjectsAndKeys:
                                               [[[TiBlob alloc] initWithImage:thumbnail] autorelease],
                                               @"thumbnail",
                                               NUMINT(index),
                                               @"index",
                                               sUrl,
                                               @"url",
                                               metadata,
                                               @"metadata",
                                               nil];
                        [assets addObject:event];
                }
            } else {
                if (thumbCallback!=nil)
                {
                    NSDictionary *event = [NSDictionary dictionaryWithObjectsAndKeys:assets,@"assets", nil];
                    [self _fireEventToListener:@"onThumbnail" withObject:event listener:thumbCallback thisObject:nil];
                    [assets release];
                }
            }
        }];
    }
};

ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];

[library enumerateGroupsWithTypes:groupTypes
                       usingBlock:assetGroupEnumerator
                     failureBlock:^(NSError *error) {}];
[library release];
}

興味深いのは、コードが 26 番目の項目の後でクラッシュするように見えることです。上記のコードからわかるように、これは 2 ページ目の最初のページになります。

私は Objective C についてあまりよく知らないので、助けを求めていました。

ありがとう

4

1 に答える 1

0

[アセットのリリース] で例外が発生する可能性があります。私の場合はそれです。

アセットの割り当てで、[[[NSMutableArray alloc] init] autorelease] と行を削除します。例外は発生しません。

于 2012-06-09T05:19:53.813 に答える