¿Cómo puede compilar el proyecto de Android cuando falta la clase importada en SDK?

OK, tal vez es muy simple, pero simplemente no puedo entenderlo ahora mismo.

He importado google muestra proyecto lector de tarjetas en Android Studio 1.5.1, compila en compileSdkVerison 23, funciona en mi móvil.

Entonces caminé a través del SDK mientras llegaba al código fuente a android.nfc.tech.BasicTagTechnology , encontré TransceiveResult dentro android.nfc.tech.BasicTagTechnology#transceive no podía ser resuelto entonces encontré la clase TransceiveResult falta en mi D:\Android\sdk\platforms\android-23\android.jar , pero se presenta en el código fuente de Android aquí D:\Android\sdk\sources\android-23\android\nfc\TransceiveResult.java entonces me di cuenta de que podría estar oculto Público, no exportado, en realidad es

 /** * Class used to pipe transceive result from the NFC service. * * @hide */ public final class TransceiveResult implements Parcelable 

Luego he hecho algunas cosas al azar, después de haber sincronizado el proyecto, limpio y reconstruir, invalidar cachés / reiniciado, todavía no es capaz de resolver TransceiveResult por cierto, me pregunto ya que el símbolo se ha perdido en SDK, ¿cómo puede el proyecto Compilar suavemente

EDIT para finalmente Aha

Llamamos android.nfc.tech.BasicTagTechnology#transceive en nuestro código en lugar de TransceiveResult , en la compilación de tiempo que no hay necesidad de resolver TransceiveResult , sólo tenemos que resolver android.nfc.tech.BasicTagTechnology#transceive que se hace referencia en nuestro código , Yo estaba perdido en ese momento.

@ Oculta significa que no está incluido en los documentos como se describe aquí y también se despoja de las clases dentro de su android.jar que se utiliza en la compilación. Sin embargo, estos están disponibles en tiempo de ejecución.

Actualización: para aclarar en su IDE cuando se encuentra en sus clases de SDK, es posible que vea referencias a miembros ocultos que no puede resolver. Esto está bien y seguirá compilando siempre y cuando estén en las clases SDK no en su código.

Si desea utilizar esas clases / métodos / campos ocultos tiene 2 opciones principales:

1) buscar una versión completa de android-framework.jar y ser capaz de compilar. Esto sin embargo tiene un inconveniente que el código compilado probablemente no se ejecutará en otras versiones de Android como la clase o el método no puede ser incluso allí. Y también BasicTagTechnology por ejemplo es en realidad el paquete privado por lo que no puede acceder a él como que de todos modos

2) utilizar la reflexión:

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

Esta es una mejor opción en el sentido de que es más flexible y puede comprobar si la clase / método existe para init / call them, catch exception etc.

  • Restaurar la ventana LogCat dentro de Android Studio
  • Significado de los iconos en HPROF Viewer en Android Studio
  • La inspección muestra la excepción de puntero nulo mientras compruebo la probabilidad nula
  • Mi aplicación tarda tanto en lanzar la pantalla Primera actividad
  • Crear una biblioteca con dependencias en android
  • Tutorial la primera vez que ingresa a una aplicación?
  • Error de Gradle "Atributo" xxx "ya se ha definido" en Android Studio
  • ¿Cómo habilitar el teclado físico en Emulator en Android Studio? (Solía ​​trabajar)
  • Error en la configuración de Android Studio JDK
  • Android studio 1.1 - cambiar JRE utilizado para ejecutar el estudio
  • Java.lang.NoClassDefFoundError en la versión de Android inferior a Lollipop
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.