How to read SD card contents through iPad Camera Connection Kit in iOS SDK?

后端 未结 2 1875
耶瑟儿~
耶瑟儿~ 2021-01-14 03:40

I want to read the SD card contents through iPad Camera Connection Kit in iOS SDK, how to do that ? Any code sample ?

Thanks.

相关标签:
2条回答
  • 2021-01-14 03:54

    Use External Accessory Framework first you need to register for notifications in view did load-

    <code>
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_accessoryDidConnect:) name:EAAccessoryDidConnectNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_accessoryDidDisconnect:) name:EAAccessoryDidDisconnectNotification object:nil];
    [[EAAccessoryManager sharedAccessoryManager] registerForLocalNotifications];
    </code>
    
    Then you should find the attached accessories -
    
    <code>
         _accessoryList = [[NSMutableArray alloc] initWithArray:[[EAAccessoryManager sharedAccessoryManager] connectedAccessories]];
    
    </code>
    Then check this is the correct accessory you are looking for -
    <code>
    for(EAAccessory *obj in _accessoryList)
        {
            if ([[obj protocolStrings] containsObject:@"com.bluebamboo.p25i"])//if find the accessory(p25) record it
            {
                [accessoryLabel setText:@"P25mi connected"]; // yup this is correct accessory!
                [obj release];
                break;
            }
        }
    </code>
    Then open a session -
    <code>
    //if accessory not null
    if(accessory)
    {
        session = [[EASession alloc] initWithAccessory:accessory forProtocol:@"com.bluebamboo.p25i"];//initial session that pair with protocol string
        [[session outputStream] setDelegate:self];//set delegate class for output stream 
        [[session outputStream] scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; //set outputstream loop
        [[session outputStream] open]; //open session
        [[session inputStream] setDelegate:self];
        [[session inputStream] open];
        [[session inputStream] scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    
    
    }
    </code>
    

    Then the stream delegate will be called -

    <code>
    //this is a stream listener function that would actived by system while steam has any event
    - (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent
    {   
    
    
    
        switch(streamEvent)
        {
            case NSStreamEventOpenCompleted:
                if(theStream==[session outputStream])//to identify which stream has been opend
                {
                    [self addLabel:@"outputNSStream open;"];
                }
                else
                {
                    [self addLabel:@"inputNSStream open:"];
                }
    
    
                break;
            case NSStreamEventHasBytesAvailable:
                //if system has stream data comes in
                [self addLabel:@"receiving Data;"];
    
                uint8_t buf2[100];//create a buffer
                unsigned int len = 0;
                //read buffer commands return actuall length of return data
                len = [[session inputStream] read:buf2 maxLength:100];
    
                if (len>0 )
                {
                    if (buf2[4]==0x03&&buf2[5]==0x00)//if two bytes are 0x03 and 0x00, that means print success 
                    {
                        //display success message
                        alertMessage = [[UIAlertView alloc] initWithTitle:@"SUCCESS:" message:@"P25i have printed Text successfully" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
                        [alertMessage show];
                        [alertMessage release];
    
                        [self addLabel:@"received success"]; 
                    }
    
                }
    
    
                [self enableButton];
                //operation finished then close all streams and session
                [[session outputStream] close];
                [[session outputStream] removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
                [[session outputStream] setDelegate:nil];
                [[session inputStream] close];
                [[session inputStream] removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
                [[session inputStream] setDelegate:nil];
                [session release];
                session = nil;
                //[self connectSession];
                //switcher2=TRUE;
    
                break;
            case NSStreamEventHasSpaceAvailable:
    
                [self addLabel:@" NSStreamEventHasSpaceAvailable"];
                if (switcher2)//we send loop mode so application would keep sending data to p25, the switcher2 identify the data has send to P25m
                {
    
    
                             //[self addLabel:@"buffer is selected"];
                     int contentLength=[printContent.text length];
                     unsigned char buffer[contentLength+7];
                     buffer[0] = 0X55; 
                             buffer[1]=0x66; 
                             buffer[2]=0x77;  
                             buffer[3]=0x88; 
                             buffer[4]=0x44;//print command
                    for (int i=5;i<contentLength+5;i++)//add print content
                    {
                   buffer[i] =[printContent.text characterAtIndex:i-5];
                      }
                   buffer[contentLength+5]=0x0A;
                   buffer[contentLength+6]=0x0A;
                  [[session outputStream] write:(const uint8_t *)buffer maxLength:contentLength+7];//send print package
    
    
    
                    switcher2 =FALSE;
                }
    
    
    
                break;
            case NSStreamEventErrorOccurred:
                alertMessage = [[UIAlertView alloc] initWithTitle:@"ERROR:" message:@"NSSTream Error" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
                [alertMessage show];
                [alertMessage release];
    
                [self enableButton];
                [self addLabel:@"NSSTream error"];
                break;
            default:
    
                break;
        }
    }
    </code>
    
    0 讨论(0)
  • 2021-01-14 04:17

    There is no official api to do that. It might be possible on a jailbroken device but not using the official sdk.

    0 讨论(0)
提交回复
热议问题