2010-01-05 16 views
0

En utilisant cette méthode, comment puis-je retourner les valeurs mAh curCapacity et maxCapacity plutôt qu'un pourcentage?Valeurs de capacité de retour, pas pourcentage (iPhone)

http://blog.coriolis.ch/2009/02/14/reading-the-battery-level-programmatically/comment-page-1/#comment-6089

Peu importe ce que je fais de mon curCapacity et les valeurs qui correspondent à mes maxcapacity pourcentage de la batterie!

Modifier // Ma 1ère tentative

#include "IOPowerSources.h" 
#include "IOPSKeys.h" 

- (double) batteryLevel // Find current charge percentage 
{ 
#if TARGET_IPHONE_SIMULATOR 
    return 80.0f; 
#else 
    CFTypeRef blob = IOPSCopyPowerSourcesInfo(); 
    CFArrayRef sources = IOPSCopyPowerSourcesList(blob); 

    CFDictionaryRef pSource = NULL; 
    const void *psValue; 

    int numOfSources = CFArrayGetCount(sources); 
    if (numOfSources == 0) { 
     NSLog(@"Error in CFArrayGetCount"); 
     return -1.0f; 
    } 

    for (int i = 0 ; i < numOfSources ; i++) 
    { 
      pSource = IOPSGetPowerSourceDescription(blob,  CFArrayGetValueAtIndex(sources, i)); 
     if (!pSource) { 
      NSLog(@"Error in IOPSGetPowerSourceDescription"); 
      return -1.0f; 
     } 
     psValue = (CFStringRef)CFDictionaryGetValue(pSource, CFSTR(kIOPSNameKey)); 

     int curCapacity = 0; 
     int maxCapacity = 0; 
     double percent; 

     psValue = CFDictionaryGetValue(pSource, CFSTR(kIOPSCurrentCapacityKey)); 
     CFNumberGetValue((CFNumberRef)psValue, kCFNumberSInt32Type, &curCapacity); 

     psValue = CFDictionaryGetValue(pSource, CFSTR(kIOPSMaxCapacityKey)); 
     CFNumberGetValue((CFNumberRef)psValue, kCFNumberSInt32Type, &maxCapacity); 

     percent = ((double)curCapacity/(double)maxCapacity * 100.0f); 

     return percent; 
    } 
    return -1.0f; 
#endif 
} 




#include "IOPowerSources.h" 
#include "IOPSKeys.h" 

- (double) curCapacity // Find current capacity 
{ 
#if TARGET_IPHONE_SIMULATOR 
    return 460; 
    #else 
    CFTypeRef blob = IOPSCopyPowerSourcesInfo(); 
    CFArrayRef sources = IOPSCopyPowerSourcesList(blob); 

    CFDictionaryRef pSource = NULL; 
    const void *psValue; 

    int numOfSources = CFArrayGetCount(sources); 
    if (numOfSources == 0) { 
     NSLog(@"Error in CFArrayGetCount"); 
     return -1.0f; 
    } 

    for (int i = 0 ; i < numOfSources ; i++) 
    { 
     pSource = IOPSGetPowerSourceDescription(blob,  CFArrayGetValueAtIndex(sources, i)); 
     if (!pSource) { 
      NSLog(@"Error in IOPSGetPowerSourceDescription"); 
      return -1.0f; 
     } 
     psValue = (CFStringRef)CFDictionaryGetValue(pSource, CFSTR(kIOPSNameKey)); 

     int curCapacity = 0; 
     int maxCapacity = 0; 
     double curCapacityVal; 

     psValue = CFDictionaryGetValue(pSource, CFSTR(kIOPSCurrentCapacityKey)); 
     CFNumberGetValue((CFNumberRef)psValue, kCFNumberSInt32Type, &curCapacity); 

     psValue = CFDictionaryGetValue(pSource, CFSTR(kIOPSMaxCapacityKey)); 
     CFNumberGetValue((CFNumberRef)psValue, kCFNumberSInt32Type, &maxCapacity); 

     curCapacityVal = (double)curCapacity; 

     return curCapacityVal; 
    } 
    return -1.0f; 
#endif 
} 




#include "IOPowerSources.h" 
#include "IOPSKeys.h" 

- (double) maxCapacity // Find maximum capacity 
{ 
#if TARGET_IPHONE_SIMULATOR 
    return 780; 
#else 
    CFTypeRef blob = IOPSCopyPowerSourcesInfo(); 
    CFArrayRef sources = IOPSCopyPowerSourcesList(blob); 

    CFDictionaryRef pSource = NULL; 
    const void *psValue; 

    int numOfSources = CFArrayGetCount(sources); 
    if (numOfSources == 0) { 
     NSLog(@"Error in CFArrayGetCount"); 
     return -1.0f; 
    } 

    for (int i = 0 ; i < numOfSources ; i++) 
    { 
     pSource = IOPSGetPowerSourceDescription(blob,  CFArrayGetValueAtIndex(sources, i)); 
     if (!pSource) { 
      NSLog(@"Error in IOPSGetPowerSourceDescription"); 
      return -1.0f; 
     } 
     psValue = (CFStringRef)CFDictionaryGetValue(pSource, CFSTR(kIOPSNameKey)); 

     int curCapacity = 0; 
     int maxCapacity = 0; 
     double maxCapacityVal; 

     psValue = CFDictionaryGetValue(pSource, CFSTR(kIOPSCurrentCapacityKey)); 
     CFNumberGetValue((CFNumberRef)psValue, kCFNumberSInt32Type, &curCapacity); 

     psValue = CFDictionaryGetValue(pSource, CFSTR(kIOPSMaxCapacityKey)); 
     CFNumberGetValue((CFNumberRef)psValue, kCFNumberSInt32Type, &maxCapacity); 

     maxCapacityVal = (double)maxCapacity; 

     return maxCapacityVal; 

    } 
    return -1.0f; 
#endif 
} 

Un grand merci,

Stu

+0

Soyez conscient que toutes les API utilisées ici sont sans papier sur l'iPhone, et conduira probablement à un rejet si vous soumettez cette demande au Magasin d'applications. Je recommande d'abandonner le support pour 2.x et d'utiliser les nouvelles méthodes de surveillance de la batterie UIDevice. –

+0

Je suis conscient de cela, mais ne prévois pas de soumettre. juste en train de pratiquer! Merci quand même. – Stumf

Répondre

2

J'ai changé la méthode pour retourner un dict:

#include "IOPowerSources.h" 
#include "IOPSKeys.h" 

- (NSDictionary *) batteryData 
{ 
    CFTypeRef blob = IOPSCopyPowerSourcesInfo(); 
    CFArrayRef sources = IOPSCopyPowerSourcesList(blob); 

    CFDictionaryRef pSource = NULL; 
    const void *psValue; 

    int numOfSources = CFArrayGetCount(sources); 
    if (numOfSources == 0) { 
    NSLog(@"Error in CFArrayGetCount"); 
     return [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:-1], @"curCapacity", [NSNumber numberWithInt:-1], @"maxCapacity", nil];; 
    } 

    for (int i = 0 ; i < numOfSources ; i++) 
    { 
    pSource = IOPSGetPowerSourceDescription(blob, CFArrayGetValueAtIndex(sources, i)); 
    if (!pSource) { 
     NSLog(@"Error in IOPSGetPowerSourceDescription"); 
      return [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:-1], @"curCapacity", [NSNumber numberWithInt:-1], @"maxCapacity", nil];; 
    } 
    psValue = (CFStringRef)CFDictionaryGetValue(pSource, CFSTR(kIOPSNameKey)); 

    int curCapacity = 0; 
    int maxCapacity = 0; 
    double percent; 

    psValue = CFDictionaryGetValue(pSource, CFSTR(kIOPSCurrentCapacityKey)); 
    CFNumberGetValue((CFNumberRef)psValue, kCFNumberSInt32Type, &curCapacity); 

    psValue = CFDictionaryGetValue(pSource, CFSTR(kIOPSMaxCapacityKey)); 
    CFNumberGetValue((CFNumberRef)psValue, kCFNumberSInt32Type, &maxCapacity); 

    percent = ((double)curCapacity/(double)maxCapacity * 100.0f); 

    return [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:curCapacity], @"curCapacity", [NSNumber numberWithInt:maxCapacity], @"maxCapacity", nil]; 
    } 
    return [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:-1], @"curCapacity", [NSNumber numberWithInt:-1], @"maxCapacity", nil];; 
} 
-1

A en juger par les constantes dans IOPSKeys.h, il pourrait ne pas être possible d'obtenir une valeur mAh première pour la batterie .

Le logiciel de la source d'alimentation peut spécifier les unités pour cette clé. Les unités doivent être conformes pour toutes les capacités signalées par cette source d'énergie. Les clients peuvent déduire un pourcentage de la batterie source de puissance restante en divisant « Capacité actuelle » par « Capacité maximale »

0

Eh bien, la fonction des déclarations écrites seulement une seule double représentant soit une erreur ou le pourcentage. Pour revenir les capcities actuels et max vous devrez soit réécrire la fonction pour renvoyer plusieurs valeurs comme ceci:

-(double) batteryLevel(**currentCapacity,**maxCapacity){...} 

Ou diviser en trois fonctions distinctes dont chacune appelle une fonction ioPower distincte pour chaque capacité recherchée.

+0

Merci pour votre réponse. J'ai essayé de le diviser en trois fonctions distinctes (voir ci-dessus) mais je pense que je me suis trompé car cela ne fonctionne toujours pas. Pouvez-vous me montrer comment cela devrait être fait? – Stumf