NfcF.java revision 20e62c9f1466ace5771e244f03a995dc0939b11b
15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/*
25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * Copyright (C) 2010 The Android Open Source Project
35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *
45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * Licensed under the Apache License, Version 2.0 (the "License");
55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * you may not use this file except in compliance with the License.
65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * You may obtain a copy of the License at
75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *
85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *      http://www.apache.org/licenses/LICENSE-2.0
95460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *
10f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * Unless required by applicable law or agreed to in writing, software
115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * distributed under the License is distributed on an "AS IS" BASIS,
125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * See the License for the specific language governing permissions and
145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * limitations under the License.
155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */
165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopackage android.nfc.tech;
185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoimport android.nfc.ErrorCodes;
205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoimport android.nfc.Tag;
215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoimport android.os.Bundle;
225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoimport android.os.RemoteException;
235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoimport android.util.Log;
245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
25f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesimport java.io.IOException;
26f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
27f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines/**
28f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * Provides access to NFC-F (JIS 6319-4) properties and I/O operations on a {@link Tag}.
295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *
305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * <p>Acquire a {@link NfcF} object using {@link #get}.
315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * <p>The primary NFC-F I/O operation is {@link #transceive}. Applications must
325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * implement their own protocol stack on top of {@link #transceive}.
335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *
345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * <p class="note"><strong>Note:</strong> Methods that perform I/O operations
355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * require the {@link android.Manifest.permission#NFC} permission.
365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */
375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic final class NfcF extends BasicTagTechnology {
385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    private static final String TAG = "NFC";
395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    /** @hide */
415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    public static final String EXTRA_SC = "systemcode";
425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    /** @hide */
435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    public static final String EXTRA_PMM = "pmm";
445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    private byte[] mSystemCode = null;
465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    private byte[] mManufacturer = null;
475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    /**
495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     * Get an instance of {@link NfcF} for the given tag.
505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     * <p>Returns null if {@link NfcF} was not enumerated in {@link Tag#getTechList}.
515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     * This indicates the tag does not support NFC-F.
525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     * <p>Does not cause any RF activity and does not block.
535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     *
545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     * @param tag an NFC-F compatible tag
555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     * @return NFC-F object
565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     */
575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    public static NfcF get(Tag tag) {
585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        if (!tag.hasTech(TagTechnology.NFC_F)) return null;
595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        try {
605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao            return new NfcF(tag);
615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        } catch (RemoteException e) {
625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao            return null;
635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        }
645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    }
655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    /** @hide */
675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    public NfcF(Tag tag) throws RemoteException {
685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        super(tag, TagTechnology.NFC_F);
695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        Bundle extras = tag.getTechExtras(TagTechnology.NFC_F);
705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        if (extras != null) {
715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao            mSystemCode = extras.getByteArray(EXTRA_SC);
725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao            mManufacturer = extras.getByteArray(EXTRA_PMM);
735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        }
745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    }
755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    /**
775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     * Return the System Code bytes from tag discovery.
785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     *
795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     * <p>Does not cause any RF activity and does not block.
805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     *
815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     * @return System Code bytes
825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     */
835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    public byte[] getSystemCode() {
845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      return mSystemCode;
855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    }
865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    /**
885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     * Return the Manufacturer bytes from tag discovery.
895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     *
905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     * <p>Does not cause any RF activity and does not block.
915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     *
925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     * @return Manufacturer bytes
935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     */
945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    public byte[] getManufacturer() {
955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      return mManufacturer;
965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    }
975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    /**
995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     * Send raw NFC-F commands to the tag and receive the response.
1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     *
1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     * <p>Applications must not append the SoD (length) or EoD (CRC) to the payload,
1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     * it will be automatically calculated.
1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     *
1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     * <p>This is an I/O operation and will block until complete. It must
1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     * not be called from the main application thread. A blocked call will be canceled with
1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     * {@link IOException} if {@link #close} is called from another thread.
1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     *
1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     * <p class="note">Requires the {@link android.Manifest.permission#NFC} permission.
1095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     *
1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     * @param data bytes to send
1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     * @return bytes received in response
1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     * @throws TagLostException if the tag leaves the field
1135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     * @throws IOException if there is an I/O failure, or this operation is canceled
1145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     */
1155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    public byte[] transceive(byte[] data) throws IOException {
1165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        return transceive(data, true);
1175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    }
1185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    /**
1205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     * Set the timeout of {@link #transceive} in milliseconds.
1215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     * <p>The timeout only applies to NfcF {@link #transceive}, and is
1225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     * reset to a default value when {@link #close} is called.
1235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     * <p>Setting a longer timeout may be useful when performing
1245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     * transactions that require a long processing time on the tag
1255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     * such as key generation.
1265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     *
1275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     * <p class="note">Requires the {@link android.Manifest.permission#NFC} permission.
1285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     *
1295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     * @param timeout timeout value in milliseconds
1305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     * @hide
1315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     */
1325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    // TODO Unhide for ICS
1335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    public void setTimeout(int timeout) {
1345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        try {
1355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao            int err = mTag.getTagService().setTimeout(TagTechnology.NFC_F, timeout);
1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao            if (err != ErrorCodes.SUCCESS) {
1375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                throw new IllegalArgumentException("The supplied timeout is not valid");
1385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao            }
1395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        } catch (RemoteException e) {
1405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao            Log.e(TAG, "NFC service dead", e);
1415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        }
1425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    }
1435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    /**
1455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     * Gets the currently set timeout of {@link #transceive} in milliseconds.
1465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     *
1475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     * <p class="note">Requires the {@link android.Manifest.permission#NFC} permission.
1485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     *
1495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     * @return timeout value in milliseconds
1505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     * @hide
1515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     */
1525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    // TODO Unhide for ICS
1535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    public int getTimeout() {
1545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        try {
1555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao            return mTag.getTagService().getTimeout(TagTechnology.NFC_F);
1565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        } catch (RemoteException e) {
1575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao            Log.e(TAG, "NFC service dead", e);
1585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao            return 0;
1595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        }
1605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    }
1615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao