2015-03-01 11 views
7

Sono di fronte a un problema con l'emettitore IR sul mio Galaxy S5 in esecuzione su Android 5.0.Emettitore IR e Android 5.0

Prima di aggiornarlo su 5.0, la mia app funzionava perfettamente sul mio telefono ma ora, il dispositivo che suppongo di gestire non ha alcuna reazione. Quando faccio clic sulla mia app per inviare un codice IR, il led lampeggia per indicare che il gestore IR è attivato e posso ricevere un segnale con un fotodiodo IR collegato al mio oscilloscopio. Sfortunatamente, la forma del segnale che ottengo è molto diversa da quella che dovrebbe essere.

Posso aggiungere che lo stesso codice in esecuzione sul mio tablet sotto Android 4.4.2 funziona ancora perfettamente.

per contribuire a rispondere alla mia domanda, un campione del mio codice:

private String commande="0000 0070 0000 0032 0080 003F 0010 0010 0010 0030 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 " 
+ "0010 0010 0010 0010 0010 0010 0010 0010 0010 0030 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 " 
+ "0030 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0030 0010 0030 0010 0030 0010 0030 0010 0030 " 
+ "0010 0010 0010 0010 0010 0010 0010 0030 0010 0030 0010 0030 0010 0030 0010 0030 0010 0010 0010 0030 0010 0A98"; 

IRManager=(ConsumerIrManager)activité.getSystemService(Context.CONSUMER_IR_SERVICE); 
code=commandConversion(commande); 
IRManager.transmit(code.getFrequency(),code.getCodes()); 

private RemoteCommandeCode commandConversion(String command) { 
    List<String> list; 
    RemoteCommandeCode code; 
    int frequency; 

    list= new ArrayList<String>(Arrays.asList(command.split(" "))); 

    list.remove(0); // dummy 

    frequency = Integer.parseInt(liste.remove(0), 16); // frequency 

    list.remove(0); // seq1 

    list.remove(0); // seq2 

    code=new RemoteCommandeCode(list.size()); 

    for (int i = 0; i < list.size(); i++) { 
     code.setCode(i,Integer.parseInt(list.get(i), 16)); 
    } 

    frequency = (int) (1000000/(frequency * 0.241246)); 

    code.setFrequency(frequency); 

    return(code); 
} 

public class RemoteCommandeCode { 
    private int fréquence; 
    private int [] codes; 

    public RemoteCommandeCode(int nombreCodes){ 
     codes=new int[nombreCodes]; 
    } 

    public int getFrequency() { 
     return frequency; 
    } 

    public void setFrequency(int frequency) { 
     this.frequency = frequency; 
    } 

    public int [] getCodes() { 
     return codes; 
    } 

    public void setCodes(int [] codes) { 
     this.codes = codes; 
    } 

    public void setCode(int i,int code){ 
     codes[i]=code; 
    } 
} 

come richiesto, le immagini del segnale emesso con il semplice codice "0000 0070 0000 0003 0010 0020 0010 0020 0010 0020", ho andare avanti 4.4.2: Signal on Android 4.4.2

e su Android 5.0: Signal on Android 5.0

+0

Quello che avremmo davvero bisogno di vedere sarebbe un intreccio tra vecchio e nuovo, o ancora meglio, un modello molto semplice che non è trasmesso dalla nuova versione come dovrebbe essere. –

+0

Immagini del segnale emesso aggiunto nella domanda ... – VD63

+0

La tua base dei tempi è troppo lenta per verificare i dettagli, ma sembra abbastanza chiaro che il secondo grafico è un fallimento quasi totale. Forse puoi vedere se ci sono altre app o demo in grado di trasmettere forme d'onda più plausibili nella versione più recente? Si tratta di una build ufficiale Samsung di 5.0 OTA consegnata al tuo dispositivo, o qualcosa che hai acquistato da solo o una ROM/porta personalizzata? –

risposta

3

Questo metodo risolverà i problemi IR per tutte le versioni di Android

/* 
* preforms some calculations on the codesets we have in order to make them work with certain models of phone. 
* 
* HTC devices need formula 1 
* Samsungs want formula 2 
* 
* Samsung Pre-4.4.3 want nothing, so just return the input data 
* 
*/ 
private static int[] string2dec(int[] irData, int frequency) { 
    int formula = shouldEquationRun(); 

    //Should we run any computations on the irData? 
    if (formula != 0) { 
     for (int i = 0; i < irData.length; i++) { 
      if (formula == 1) { 
       irData[i] = irData[i] * (1000000/frequency);//the brackets should avoid an arithmetic overflow 
      } else if (formula == 2) { 
       irData[i] = (int) Math.ceil(irData[i] * 26.27272727272727); //this is the samsung formula as per http://developer.samsung.com/android/technical-docs/Workaround-to-solve-issues-with-the-ConsumerIrManager-in-Android-version-lower-than-4-4-3-KitKat 
      } 
     } 
    } 
    return irData; 
} 

/* 
* This method figures out if we should be running the equation in string2dec, 
* which is based on the type of device. Some need it to run in order to function, some need it NOT to run 
* 
* HTC needs it on (HTC One M8) 
* Samsung needs occasionally a special formula, depending on the version 
* Android 5.0+ need it on. 
* Other devices DO NOT need anything special. 
*/ 
private static int shouldEquationRun() { 
    //Some notes on what Build.X will return 
    //System.out.println(Build.MODEL); //One M8 
    //System.out.println(Build.MANUFACTURER); //htc 
    //System.out.println(Build.VERSION.SDK_INT); //19 

    //Samsung's way of finding out if their OS is too new to work without a formula: 
    //int lastIdx = Build.VERSION.RELEASE.lastIndexOf("."); 
    //System.out.println(Build.VERSION.RELEASE.substring(lastIdx+1)); //4 

    //handle HTC 
    if (Build.MANUFACTURER.equalsIgnoreCase("HTC")) { 
     return 1; 
    } 
    //handle Lollipop (Android 5.0.1 == SDK 21)/beyond 
    if (Build.VERSION.SDK_INT >= 21) { 
     return 1; 
    } 
    //handle Samsung PRE-Android 5 
    if (Build.MANUFACTURER.equalsIgnoreCase("SAMSUNG")) { 
     if (Build.VERSION.SDK_INT >= 19) { 
      int lastIdx = Build.VERSION.RELEASE.lastIndexOf("."); 
      int VERSION_MR = Integer.valueOf(Build.VERSION.RELEASE.substring(lastIdx + 1)); 
      if (VERSION_MR < 3) { 
       // Before version of Android 4.4.2 
       //Note: NO formula here, not even the other one 
       return 0; 
      } else { 
       // Later version of Android 4.4.3 
       //run the special samsung formula here 
       return 2; 
      } 
     } 
    } 
    //if something else... 
    return 0; 
} 

* Modifica: Grazie all'aiuto dell'OP, sono stato in grado di capire come risolvere il problema. Questa risposta dovrebbe ora risolvere questo problema.

+0

Secondo il link che hai fornito, il problema deriva dalla differenza nella codifica dei dati dal 4.4.3. Prima della 4.4.3, i dati IR sono stati espressi in periodi della frequenza portante e dal 4.4.3 sono espressi direttamente in μs. Con questa correzione fatta, ora ottengo la larghezza di impulso che voglio. Grazie! – VD63

+0

Che cosa significa @ VD63 "è espresso direttamente in μs"? Non ho completamente familiarità con la roba IR in generale .... C'è qualcosa di veloce che posso aggiungere a quel metodo sopra per risolverlo? C'è qualcosa che puoi indicarmi in modo da poterlo leggere? Grazie per avermi fatto sapere che ti ha aiutato, comunque. :) – Dwebtron

+0

Prima 4.4.3, i numeri sono la sequenza "" 0000 0070 0000 0032 0080 003F 0010 ... "rappresentano il numero di periodi di portante che gli impulsi On o OFF devono durare. Dal 4.4.3, questa stessa sequenza rappresenta i numeri di microsecondi, e è per questo che è necessaria una conversione: per passare da prima a dopo, devi dividere i tuoi numeri per la frequenza portante, che ti darà il risultato in secondi e moltiplicarlo per 1000000 per ottenerlo in microsecondi – VD63

Problemi correlati