8

OK, vielleicht ist es sehr einfach, aber ich kann es gerade jetzt nicht herausfinden.Wie kann Android-Projekt kompilieren, wenn importierte Klasse im SDK fehlt?

Ich habe Google Beispielprojekt Card Reader in Android Studio 1.5.1 importiert, kompiliert es bei compileSdkVerison 23, funktioniert es auf meinem Mobile.

Dann ging ich durch das SDK, während auf den Quellcode kam zu android.nfc.tech.BasicTagTechnology, ich ich gefunden TransceiveResult innerhalb android.nfc.tech.BasicTagTechnology#transceive konnte nicht nicht aufgelöst gefunden dann die Klasse TransceiveResult ist in meinem D:\Android\sdk\platforms\android-23\android.jar, sondern präsentiert in Android-Quellcode hier D:\Android\sdk\sources\android-23\android\nfc\TransceiveResult.java dann fehlt ich erkannte, dass es von der Öffentlichkeit verborgen werden konnte, nicht exportiert, es tatsächlich

/** 
* Class used to pipe transceive result from the NFC service. 
* 
* @hide 
*/ 

public final class TransceiveResult implements Parcelable 

Dann habe ich einige zufällige Dinge getan, nachdem ich das Projekt synchronisieren haben, sauber und neu zu erstellen, ungültig Caches/neu gestartet wird, nach wie vor nicht in der Lage Auflösung TransceiveResult übrigens, frage ich mich seit dem Symbol hat verloren in SDK, wie kann das Projekt reibungslos kompilieren?

EDIT ich endlich Aha

Wir android.nfc.tech.BasicTagTechnology#transceive in unserem Code aufrufen, anstatt TransceiveResult, in der Kompilierung-wir keine Notwendigkeit TransceiveResult zu lösen, brauchen wir nur android.nfc.tech.BasicTagTechnology#transceive zu lösen, die in unserem Code verwiesen wird, Ich war in diesem Moment verloren.

+0

Ich verstehe nicht ganz Ihre Frage. Wo nimmt die Kartenleseprobe-App Bezug auf 'TransceiveResult'? – ozbek

+0

@ozbek es war in android.nfc.tech.BasicTagTechnology # transceive – hylepo

+0

OK, aber wie ist 'android.nfc.tech.BasicTagTechnology' im Zusammenhang mit Kartenleser Beispiel App? – ozbek

Antwort

6

@hide bedeutet, dass es nicht in der Dokumentation enthalten ist, wie beschrieben here und es ist auch von den Klassen innerhalb Ihrer android.jar entfernt, die in Kompilierung verwendet wird. Diese stehen jedoch zur Laufzeit zur Verfügung.

Update: Um in Ihrer IDE zu klären, wenn Sie in Ihre SDK-Klassen graben, sehen Sie möglicherweise Verweise auf versteckte Mitglieder, die Sie nicht lösen können. Das ist OK und es wird weiterhin kompilieren, solange sich diese in den SDK-Klassen befinden, die sich nicht in Ihrem Code befinden.

Wenn Sie diese verborgenen Klassen/Methoden/Felder verwenden möchten, haben Sie zwei Optionen vor:

1) holen eine Vollversion von Android-framework.jar und in der Lage zu kompilieren. Dies hat jedoch den Nachteil, dass der kompilierte Code wahrscheinlich nicht in anderen Android-Versionen ausgeführt wird, da die Klasse oder die Methode möglicherweise gar nicht da ist. und auch BasicTagTechnology zum Beispiel tatsächlich privat ist verpacken, so dass Sie nicht es so, dass sowieso zugreifen können

2) verwenden Reflexion:

Class tr = Class.forName("android.nfc.TransceiveResult"); 
     Constructor constructor = 
       tr.getConstructor(new Class[]{int.class, byte[].class}); 
     Object trObj = constructor.newInstance(1, new byte[]{1,2}); 

dies eine bessere Option in dem Sinne, dass es flexibler ist und Sie können Überprüfen Sie, ob die Klasse/Methode existiert, um sie zu init/call, Ausnahme zu fangen usw.

+0

Es sollte 'tr.getConstructor (int.class, byte []. Class)', nicht 'tr.getConstructor (neue Klasse [] {int.class, byte []. Class}) ' –

+0

sie beide arbeiten :) http://docs.oracle.com/javase/1.5.0/docs/guide/language/varargs.html – djodjo

+0

Gut zu wissen, mein Schlechter. :) –