NdefFormatable.java revision e3f6336bcffc250da90ec864bccfa73ad1d016b9
139f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen/* 239f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen * Copyright (C) 2010 The Android Open Source Project 339f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen * 439f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen * Licensed under the Apache License, Version 2.0 (the "License"); 539f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen * you may not use this file except in compliance with the License. 639f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen * You may obtain a copy of the License at 739f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen * 839f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen * http://www.apache.org/licenses/LICENSE-2.0 939f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen * 1039f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen * Unless required by applicable law or agreed to in writing, software 1139f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen * distributed under the License is distributed on an "AS IS" BASIS, 1239f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1339f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen * See the License for the specific language governing permissions and 1439f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen * limitations under the License. 1539f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen */ 1639f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen 1739f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenenpackage android.nfc.technology; 1839f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen 1939f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenenimport android.nfc.ErrorCodes; 2039f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenenimport android.nfc.FormatException; 2139f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenenimport android.nfc.NdefMessage; 2239f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenenimport android.nfc.NfcAdapter; 2339f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenenimport android.nfc.Tag; 2439f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenenimport android.os.Bundle; 2539f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenenimport android.os.RemoteException; 2639f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen 2739f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenenimport java.io.IOException; 2839f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen 2939f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen/** 3039f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen * An interface to a {@link Tag} allowing to format the tag as NDEF. 3139f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen * 3239f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen * <p>You can acquire this kind of interface with {@link Tag#getTechnology(int)}. 3339f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen * 3439f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen * <p class="note"><strong>Note:</strong> 3539f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen * Use of this class requires the {@link android.Manifest.permission#NFC} 3639f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen * permission. 3739f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen */ 3839f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenenpublic final class NdefFormatable extends BasicTagTechnology { 3939f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen /** 4039f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen * Internal constructor, to be used by NfcAdapter 4139f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen * @hide 4239f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen */ 4339f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen public NdefFormatable(NfcAdapter adapter, Tag tag, int tech, Bundle extras) throws RemoteException { 4439f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen super(adapter, tag, tech); 4539f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen } 4639f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen 4739f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen /** 4839f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen * Returns whether a tag can be formatted with {@link 4939f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen * NdefFormatable#format(NdefMessage)} 5039f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen */ 5139f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen public boolean canBeFormatted() throws IOException { 5239f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen throw new UnsupportedOperationException(); 5339f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen } 5439f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen 5539f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen /** 5639f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen * Formats a tag as NDEF, if possible. You may supply a first 5739f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen * NdefMessage to be written on the tag. 5839f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen */ 595289b91c885158094988a9a7b51b3139565eb639Martijn Coenen public void format(NdefMessage firstMessage) throws IOException, FormatException { 605289b91c885158094988a9a7b51b3139565eb639Martijn Coenen try { 615289b91c885158094988a9a7b51b3139565eb639Martijn Coenen byte[] DEFAULT_KEY = {(byte)0xFF,(byte)0xFF,(byte)0xFF, 625289b91c885158094988a9a7b51b3139565eb639Martijn Coenen (byte)0xFF,(byte)0xFF,(byte)0xFF}; 635289b91c885158094988a9a7b51b3139565eb639Martijn Coenen int serviceHandle = mTag.getServiceHandle(); 645289b91c885158094988a9a7b51b3139565eb639Martijn Coenen int errorCode = mTagService.formatNdef(serviceHandle, DEFAULT_KEY); 655289b91c885158094988a9a7b51b3139565eb639Martijn Coenen switch (errorCode) { 665289b91c885158094988a9a7b51b3139565eb639Martijn Coenen case ErrorCodes.SUCCESS: 675289b91c885158094988a9a7b51b3139565eb639Martijn Coenen break; 685289b91c885158094988a9a7b51b3139565eb639Martijn Coenen case ErrorCodes.ERROR_IO: 695289b91c885158094988a9a7b51b3139565eb639Martijn Coenen throw new IOException(); 705289b91c885158094988a9a7b51b3139565eb639Martijn Coenen case ErrorCodes.ERROR_INVALID_PARAM: 715289b91c885158094988a9a7b51b3139565eb639Martijn Coenen throw new FormatException(); 725289b91c885158094988a9a7b51b3139565eb639Martijn Coenen default: 735289b91c885158094988a9a7b51b3139565eb639Martijn Coenen // Should not happen 745289b91c885158094988a9a7b51b3139565eb639Martijn Coenen throw new IOException(); 755289b91c885158094988a9a7b51b3139565eb639Martijn Coenen } 76e3f6336bcffc250da90ec864bccfa73ad1d016b9Martijn Coenen // Now check and see if the format worked 77e3f6336bcffc250da90ec864bccfa73ad1d016b9Martijn Coenen if (mTagService.isNdef(serviceHandle)) { 78e3f6336bcffc250da90ec864bccfa73ad1d016b9Martijn Coenen errorCode = mTagService.ndefWrite(serviceHandle, firstMessage); 79e3f6336bcffc250da90ec864bccfa73ad1d016b9Martijn Coenen switch (errorCode) { 80e3f6336bcffc250da90ec864bccfa73ad1d016b9Martijn Coenen case ErrorCodes.SUCCESS: 81e3f6336bcffc250da90ec864bccfa73ad1d016b9Martijn Coenen break; 82e3f6336bcffc250da90ec864bccfa73ad1d016b9Martijn Coenen case ErrorCodes.ERROR_IO: 83e3f6336bcffc250da90ec864bccfa73ad1d016b9Martijn Coenen throw new IOException(); 84e3f6336bcffc250da90ec864bccfa73ad1d016b9Martijn Coenen case ErrorCodes.ERROR_INVALID_PARAM: 85e3f6336bcffc250da90ec864bccfa73ad1d016b9Martijn Coenen throw new FormatException(); 86e3f6336bcffc250da90ec864bccfa73ad1d016b9Martijn Coenen default: 87e3f6336bcffc250da90ec864bccfa73ad1d016b9Martijn Coenen // Should not happen 88e3f6336bcffc250da90ec864bccfa73ad1d016b9Martijn Coenen throw new IOException(); 89e3f6336bcffc250da90ec864bccfa73ad1d016b9Martijn Coenen } 90e3f6336bcffc250da90ec864bccfa73ad1d016b9Martijn Coenen } else { 91e3f6336bcffc250da90ec864bccfa73ad1d016b9Martijn Coenen throw new IOException(); 925289b91c885158094988a9a7b51b3139565eb639Martijn Coenen } 935289b91c885158094988a9a7b51b3139565eb639Martijn Coenen } catch (RemoteException e) { 945289b91c885158094988a9a7b51b3139565eb639Martijn Coenen attemptDeadServiceRecovery(e); 955289b91c885158094988a9a7b51b3139565eb639Martijn Coenen } 9639f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen } 97fc5a3b6cfb85679e82a39730c7154b55b0711a0cMartijn Coenen 98fc5a3b6cfb85679e82a39730c7154b55b0711a0cMartijn Coenen @Override 99fc5a3b6cfb85679e82a39730c7154b55b0711a0cMartijn Coenen public byte[] transceive(byte[] data) { 100fc5a3b6cfb85679e82a39730c7154b55b0711a0cMartijn Coenen throw new UnsupportedOperationException(); 101fc5a3b6cfb85679e82a39730c7154b55b0711a0cMartijn Coenen } 10239f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen} 103