8

OK, może jest to bardzo proste, ale po prostu nie mogę tego teraz rozgryźć.Jak można skompilować projekt Androida, gdy w SDK brakuje importowanej klasy?

Mam zaimportowany projekt przykładowy Google Card Reader w Android Studio 1.5.1, kompiluje się na compileSdkVerison 23, działa na moim telefonie komórkowym.

Potem przeszedł przez chwilę SDK przyszedł do kodu źródłowego android.nfc.tech.BasicTagTechnology znalazłem TransceiveResult wewnątrz android.nfc.tech.BasicTagTechnology#transceive nie mógł nie zostać rozwiązane potem znalazłem klasę TransceiveResult brakuje w moim D:\Android\sdk\platforms\android-23\android.jar, ale zawiera w kodzie źródłowym Androida tutaj D:\Android\sdk\sources\android-23\android\nfc\TransceiveResult.java następnie Zdałem sobie sprawę, to może być ukryte przed publicznym, nie na eksport, w rzeczywistości jest to

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

public final class TransceiveResult implements Parcelable 

Potem zrobiłem kilka przypadkowych rzeczy, po tym, jak zsynchronizować projekt, czyste i odbudować, utratę pamięci podręcznej/ponownym uruchomieniu nadal nie można rozwiązać przy okazji TransceiveResult, zastanawiam się, ponieważ symbol ma zagubieni w SDK, w jaki sposób projekt może się płynnie kompilować?

EDIT bo wreszcie Aha

Nazywamy android.nfc.tech.BasicTagTechnology#transceive w naszym kodzie zamiast TransceiveResult w czasie kompilacji my nie trzeba rozwiązać TransceiveResult, tylko musimy rozwiązać android.nfc.tech.BasicTagTechnology#transceive który jest wymieniony w naszym kodzie, Zgubiłem się w tym momencie.

+0

Nie bardzo rozumiem. Gdzie przykładowa aplikacja czytnika kart odwołuje się do 'TransceiveResult'? – ozbek

+0

@ozbek to było wewnątrz android.nfc.tech.BasicTagTechnology # transceive – hylepo

+0

OK, ale jak to jest "android.nfc.tech.BasicTagTechnology" związane z przykładową aplikacją czytnika kart? – ozbek

Odpowiedz

6

@hide oznacza, że ​​nie jest ona zawarta w dokumentacji opisanej jako here i jest również usunięta z klas w pliku android.jar, który jest używany w kompilacji. Są one jednak dostępne w środowisku wykonawczym.

Aktualizacja: Aby wyjaśnić w swoim IDE kiedy kopiesz do swoich klas SDK można zobaczyć odniesienia do ukrytych elementów, których nie można rozwiązać. To jest w porządku i nadal będzie się kompilować, o ile są w klasach SDK, a nie w kodzie.

Jeśli chcesz korzystać z tych ukrytych klas/metod/pól masz 2 główne opcje:

1) Pobiera pełną wersję Android framework.jar i móc skompilować. ma to jednak wadę, że skompilowany kod prawdopodobnie nie będzie działał w innych wersjach systemu Android jako klasa lub metoda może tam nie występować. a także BasicTagTechnology na przykład właściwie zapakować prywatny, więc nie można uzyskać do niego dostęp tak zresztą

2) użyć refleksji:

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}); 

ten jest lepszym rozwiązaniem w tym sensie, że jest bardziej elastyczny i można sprawdź czy istnieje klasa/metoda, aby zainicjować/zadzwonić, złapać wyjątek itp.

+0

Powinien to być 'tr.getConstructor (int.class, byte []. Class)', a nie 'tr.getConstructor (new Class [] {int.class, byte []. Class})' –

+0

oba działają :) http://docs.oracle.com/javase/1.5.0/docs/guide/language/varargs.html – djodjo

+0

Dobrze wiedzieć, moje złe. :) –

Powiązane problemy