/*
 * Copyright (C) 2010 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.nfc.tech;

import android.nfc.Tag;

import java.io.Closeable;
import java.io.IOException;

TagTechnology is an interface to a technology in a Tag.

Obtain a TagTechnology implementation by calling the static method get() on the implementation class.

NFC tags are based on a number of independently developed technologies and offer a wide range of capabilities. The TagTechnology implementations provide access to these different technologies and capabilities. Some sub-classes map to technology specification (for example NfcA, IsoDep, others map to pseudo-technologies or capabilities (for example Ndef, NdefFormatable).

It is mandatory for all Android NFC devices to provide the following TagTechnology implementations.

  • NfcA (also known as ISO 14443-3A)
  • NfcB (also known as ISO 14443-3B)
  • NfcF (also known as JIS 6319-4)
  • NfcV (also known as ISO 15693)
  • IsoDep
  • Ndef on NFC Forum Type 1, Type 2, Type 3 or Type 4 compliant tags
It is optional for Android NFC devices to provide the following TagTechnology implementations. If it is not provided, the Android device will never enumerate that class via Tag.getTechList.

TagTechnology implementations provide methods that fall into two classes: cached getters and I/O operations.

Cached getters

These methods (usually prefixed by get or is) return properties of the tag, as determined at discovery time. These methods will never block or cause RF activity, and do not require connect to have been called. They also never update, for example if a property is changed by an I/O operation with a tag then the cached getter will still return the result from tag discovery time.

I/O operations

I/O operations may require RF activity, and may block. They have the following semantics.
  • connect must be called before using any other I/O operation.
  • close must be called after completing I/O operations with a TagTechnology, and it will cancel all other blocked I/O operations on other threads (including connect with IOException.
  • Only one TagTechnology can be connected at a time. Other calls to connect will return IOException.
  • I/O operations may block, and should never be called on the main application thread.

Note: Methods that perform I/O operations require the NFC.NFC permission.

/** * {@link TagTechnology} is an interface to a technology in a {@link Tag}. * <p> * Obtain a {@link TagTechnology} implementation by calling the static method <code>get()</code> * on the implementation class. * <p> * NFC tags are based on a number of independently developed technologies and offer a * wide range of capabilities. The * {@link TagTechnology} implementations provide access to these different * technologies and capabilities. Some sub-classes map to technology * specification (for example {@link NfcA}, {@link IsoDep}, others map to * pseudo-technologies or capabilities (for example {@link Ndef}, {@link NdefFormatable}). * <p> * It is mandatory for all Android NFC devices to provide the following * {@link TagTechnology} implementations. * <ul> * <li>{@link NfcA} (also known as ISO 14443-3A) * <li>{@link NfcB} (also known as ISO 14443-3B) * <li>{@link NfcF} (also known as JIS 6319-4) * <li>{@link NfcV} (also known as ISO 15693) * <li>{@link IsoDep} * <li>{@link Ndef} on NFC Forum Type 1, Type 2, Type 3 or Type 4 compliant tags * </ul> * It is optional for Android NFC devices to provide the following * {@link TagTechnology} implementations. If it is not provided, the * Android device will never enumerate that class via {@link Tag#getTechList}. * <ul> * <li>{@link MifareClassic} * <li>{@link MifareUltralight} * <li>{@link NfcBarcode} * <li>{@link NdefFormatable} must only be enumerated on tags for which this Android device * is capable of formatting. Proprietary knowledge is often required to format a tag * to make it NDEF compatible. * </ul> * <p> * {@link TagTechnology} implementations provide methods that fall into two classes: * <em>cached getters</em> and <em>I/O operations</em>. * <h4>Cached getters</h4> * These methods (usually prefixed by <code>get</code> or <code>is</code>) return * properties of the tag, as determined at discovery time. These methods will never * block or cause RF activity, and do not require {@link #connect} to have been called. * They also never update, for example if a property is changed by an I/O operation with a tag * then the cached getter will still return the result from tag discovery time. * <h4>I/O operations</h4> * I/O operations may require RF activity, and may block. They have the following semantics. * <ul> * <li>{@link #connect} must be called before using any other I/O operation. * <li>{@link #close} must be called after completing I/O operations with a * {@link TagTechnology}, and it will cancel all other blocked I/O operations on other threads * (including {@link #connect} with {@link IOException}. * <li>Only one {@link TagTechnology} can be connected at a time. Other calls to * {@link #connect} will return {@link IOException}. * <li>I/O operations may block, and should never be called on the main application * thread. * </ul> * * <p class="note"><strong>Note:</strong> Methods that perform I/O operations * require the {@link android.Manifest.permission#NFC} permission. */
public interface TagTechnology extends Closeable {
This technology is an instance of NfcA.

Support for this technology type is mandatory.

@hide
/** * This technology is an instance of {@link NfcA}. * <p>Support for this technology type is mandatory. * @hide */
public static final int NFC_A = 1;
This technology is an instance of NfcB.

Support for this technology type is mandatory.

@hide
/** * This technology is an instance of {@link NfcB}. * <p>Support for this technology type is mandatory. * @hide */
public static final int NFC_B = 2;
This technology is an instance of IsoDep.

Support for this technology type is mandatory.

@hide
/** * This technology is an instance of {@link IsoDep}. * <p>Support for this technology type is mandatory. * @hide */
public static final int ISO_DEP = 3;
This technology is an instance of NfcF.

Support for this technology type is mandatory.

@hide
/** * This technology is an instance of {@link NfcF}. * <p>Support for this technology type is mandatory. * @hide */
public static final int NFC_F = 4;
This technology is an instance of NfcV.

Support for this technology type is mandatory.

@hide
/** * This technology is an instance of {@link NfcV}. * <p>Support for this technology type is mandatory. * @hide */
public static final int NFC_V = 5;
This technology is an instance of Ndef.

Support for this technology type is mandatory.

@hide
/** * This technology is an instance of {@link Ndef}. * <p>Support for this technology type is mandatory. * @hide */
public static final int NDEF = 6;
This technology is an instance of NdefFormatable.

Support for this technology type is mandatory.

@hide
/** * This technology is an instance of {@link NdefFormatable}. * <p>Support for this technology type is mandatory. * @hide */
public static final int NDEF_FORMATABLE = 7;
This technology is an instance of MifareClassic.

Support for this technology type is optional. If a stack doesn't support this technology type tags using it must still be discovered and present the lower level radio interface technologies in use.

@hide
/** * This technology is an instance of {@link MifareClassic}. * <p>Support for this technology type is optional. If a stack doesn't support this technology * type tags using it must still be discovered and present the lower level radio interface * technologies in use. * @hide */
public static final int MIFARE_CLASSIC = 8;
This technology is an instance of MifareUltralight.

Support for this technology type is optional. If a stack doesn't support this technology type tags using it must still be discovered and present the lower level radio interface technologies in use.

@hide
/** * This technology is an instance of {@link MifareUltralight}. * <p>Support for this technology type is optional. If a stack doesn't support this technology * type tags using it must still be discovered and present the lower level radio interface * technologies in use. * @hide */
public static final int MIFARE_ULTRALIGHT = 9;
This technology is an instance of NfcBarcode.

Support for this technology type is optional. If a stack doesn't support this technology type tags using it must still be discovered and present the lower level radio interface technologies in use.

@hide
/** * This technology is an instance of {@link NfcBarcode}. * <p>Support for this technology type is optional. If a stack doesn't support this technology * type tags using it must still be discovered and present the lower level radio interface * technologies in use. * @hide */
public static final int NFC_BARCODE = 10;
Get the Tag object backing this TagTechnology object.
Returns:the Tag backing this TagTechnology object.
/** * Get the {@link Tag} object backing this {@link TagTechnology} object. * @return the {@link Tag} backing this {@link TagTechnology} object. */
public Tag getTag();
Enable I/O operations to the tag from this TagTechnology object.

May cause RF activity and may block. Must not be called from the main application thread. A blocked call will be canceled with IOException by calling close from another thread.

Only one TagTechnology object can be connected to a Tag at a time.

Applications must call close when I/O operations are complete.

Requires the NFC.NFC permission.

Throws:
  • TagLostException – if the tag leaves the field
  • IOException – if there is an I/O failure, or connect is canceled
See Also:
/** * Enable I/O operations to the tag from this {@link TagTechnology} object. * <p>May cause RF activity and may block. Must not be called * from the main application thread. A blocked call will be canceled with * {@link IOException} by calling {@link #close} from another thread. * <p>Only one {@link TagTechnology} object can be connected to a {@link Tag} at a time. * <p>Applications must call {@link #close} when I/O operations are complete. * * <p class="note">Requires the {@link android.Manifest.permission#NFC} permission. * * @see #close() * @throws TagLostException if the tag leaves the field * @throws IOException if there is an I/O failure, or connect is canceled */
public void connect() throws IOException;
Re-connect to the Tag associated with this connection. Reconnecting to a tag can be used to reset the state of the tag itself.

May cause RF activity and may block. Must not be called from the main application thread. A blocked call will be canceled with IOException by calling close from another thread.

Requires the NFC.NFC permission.

Throws:
  • TagLostException – if the tag leaves the field
  • IOException – if there is an I/O failure, or connect is canceled
See Also:
@hide
/** * Re-connect to the {@link Tag} associated with this connection. Reconnecting to a tag can be * used to reset the state of the tag itself. * * <p>May cause RF activity and may block. Must not be called * from the main application thread. A blocked call will be canceled with * {@link IOException} by calling {@link #close} from another thread. * * <p class="note">Requires the {@link android.Manifest.permission#NFC} permission. * * @see #connect() * @see #close() * @throws TagLostException if the tag leaves the field * @throws IOException if there is an I/O failure, or connect is canceled * @hide */
public void reconnect() throws IOException;
Disable I/O operations to the tag from this TagTechnology object, and release resources.

Also causes all blocked I/O operations on other thread to be canceled and return with IOException.

Requires the NFC.NFC permission.

See Also:
/** * Disable I/O operations to the tag from this {@link TagTechnology} object, and release resources. * <p>Also causes all blocked I/O operations on other thread to be canceled and * return with {@link IOException}. * * <p class="note">Requires the {@link android.Manifest.permission#NFC} permission. * * @see #connect() */
public void close() throws IOException;
Helper to indicate if I/O operations should be possible.

Returns true if connect has completed, and close has not been called, and the Tag is not known to be out of range.

Does not cause RF activity, and does not block.

Returns:true if I/O operations should be possible
/** * Helper to indicate if I/O operations should be possible. * * <p>Returns true if {@link #connect} has completed, and {@link #close} has not been * called, and the {@link Tag} is not known to be out of range. * <p>Does not cause RF activity, and does not block. * * @return true if I/O operations should be possible */
public boolean isConnected(); }