1590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly/* 29024564107b58955f7bd257cab6fc6dfcb2e5ec2Daniel Tomas * Copyright (C) 2010 The Android Open Source Project 39024564107b58955f7bd257cab6fc6dfcb2e5ec2Daniel Tomas * 49024564107b58955f7bd257cab6fc6dfcb2e5ec2Daniel Tomas * Licensed under the Apache License, Version 2.0 (the "License"); 59024564107b58955f7bd257cab6fc6dfcb2e5ec2Daniel Tomas * you may not use this file except in compliance with the License. 69024564107b58955f7bd257cab6fc6dfcb2e5ec2Daniel Tomas * You may obtain a copy of the License at 79024564107b58955f7bd257cab6fc6dfcb2e5ec2Daniel Tomas * 89024564107b58955f7bd257cab6fc6dfcb2e5ec2Daniel Tomas * http://www.apache.org/licenses/LICENSE-2.0 99024564107b58955f7bd257cab6fc6dfcb2e5ec2Daniel Tomas * 109024564107b58955f7bd257cab6fc6dfcb2e5ec2Daniel Tomas * Unless required by applicable law or agreed to in writing, software 119024564107b58955f7bd257cab6fc6dfcb2e5ec2Daniel Tomas * distributed under the License is distributed on an "AS IS" BASIS, 129024564107b58955f7bd257cab6fc6dfcb2e5ec2Daniel Tomas * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139024564107b58955f7bd257cab6fc6dfcb2e5ec2Daniel Tomas * See the License for the specific language governing permissions and 149024564107b58955f7bd257cab6fc6dfcb2e5ec2Daniel Tomas * limitations under the License. 15590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly */ 16590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly 17590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pellypackage android.nfc; 18590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly 19bb951c893973691554f49d2e725985125f866b27Jeff Hamiltonimport java.util.HashMap; 20bb951c893973691554f49d2e725985125f866b27Jeff Hamilton 21590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pellyimport android.annotation.SdkConstant; 22590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pellyimport android.annotation.SdkConstant.SdkConstantType; 2329c2e3797a6c397fa7812bc4cf167a72dde28faaMartijn Coenenimport android.annotation.SystemApi; 2452d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamiltonimport android.app.Activity; 25fdf9086e24f4720ee9fbc852b980041f126aa3c2Nick Pellyimport android.app.ActivityThread; 2652d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamiltonimport android.app.OnActivityPausedListener; 2752d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamiltonimport android.app.PendingIntent; 2850b4d8f643f31b37e9872f562fb869059cf79c8aNick Pellyimport android.content.Context; 2952d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamiltonimport android.content.IntentFilter; 30fdf9086e24f4720ee9fbc852b980041f126aa3c2Nick Pellyimport android.content.pm.IPackageManager; 31fdf9086e24f4720ee9fbc852b980041f126aa3c2Nick Pellyimport android.content.pm.PackageManager; 321d7e9062330a5a02247752de32a68ecbeba82783Nick Pellyimport android.net.Uri; 3328319c0cec94977682db32b949628a8e4b8183dcJeff Hamiltonimport android.nfc.tech.MifareClassic; 3428319c0cec94977682db32b949628a8e4b8183dcJeff Hamiltonimport android.nfc.tech.Ndef; 3528319c0cec94977682db32b949628a8e4b8183dcJeff Hamiltonimport android.nfc.tech.NfcA; 3628319c0cec94977682db32b949628a8e4b8183dcJeff Hamiltonimport android.nfc.tech.NfcF; 375b1e032ea7c06ab11d778264dd950009fcb93cc5Martijn Coenenimport android.os.Bundle; 38590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pellyimport android.os.IBinder; 39590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pellyimport android.os.RemoteException; 40590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pellyimport android.os.ServiceManager; 41590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pellyimport android.util.Log; 42590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly 43590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly/** 4474fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * Represents the local NFC adapter. 45590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly * <p> 4650b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly * Use the helper {@link #getDefaultAdapter(Context)} to get the default NFC 4750b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly * adapter for this Android device. 483aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * 493aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <div class="special reference"> 503aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <h3>Developer Guides</h3> 513aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <p>For more information about using NFC, read the 523aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <a href="{@docRoot}guide/topics/nfc/index.html">Near Field Communication</a> developer guide.</p> 53b38ad76a829f9bdbc27e86647de31a5ad19f117aScott Main * <p>To perform basic file sharing between devices, read 54b38ad76a829f9bdbc27e86647de31a5ad19f117aScott Main * <a href="{@docRoot}training/beam-files/index.html">Sharing Files with NFC</a>. 553aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * </div> 56590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly */ 57590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pellypublic final class NfcAdapter { 58c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly static final String TAG = "NFC"; 5950b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly 60590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly /** 61641dd62155fd2eeddd93b2036154b13c05b70ba2Jeff Hamilton * Intent to start an activity when a tag with NDEF payload is discovered. 62641dd62155fd2eeddd93b2036154b13c05b70ba2Jeff Hamilton * 6328319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * <p>The system inspects the first {@link NdefRecord} in the first {@link NdefMessage} and 6428319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * looks for a URI, SmartPoster, or MIME record. If a URI or SmartPoster record is found the 6528319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * intent will contain the URI in its data field. If a MIME record is found the intent will 6628319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * contain the MIME type in its type field. This allows activities to register 6728319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * {@link IntentFilter}s targeting specific content on tags. Activities should register the 6828319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * most specific intent filters possible to avoid the activity chooser dialog, which can 6928319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * disrupt the interaction with the tag as the user interacts with the screen. 7028319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * 7128319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * <p>If the tag has an NDEF payload this intent is started before 7228319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * {@link #ACTION_TECH_DISCOVERED}. If any activities respond to this intent neither 73f003e26df96067b4b136f0859012cb7ec3ed930fNick Pelly * {@link #ACTION_TECH_DISCOVERED} or {@link #ACTION_TAG_DISCOVERED} will be started. 74c97a552023c3c71079b39092e80c9b44f25a789bNick Pelly * 75c97a552023c3c71079b39092e80c9b44f25a789bNick Pelly * <p>The MIME type or data URI of this intent are normalized before dispatch - 76c97a552023c3c71079b39092e80c9b44f25a789bNick Pelly * so that MIME, URI scheme and URI host are always lower-case. 77641dd62155fd2eeddd93b2036154b13c05b70ba2Jeff Hamilton */ 78641dd62155fd2eeddd93b2036154b13c05b70ba2Jeff Hamilton @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) 79641dd62155fd2eeddd93b2036154b13c05b70ba2Jeff Hamilton public static final String ACTION_NDEF_DISCOVERED = "android.nfc.action.NDEF_DISCOVERED"; 80641dd62155fd2eeddd93b2036154b13c05b70ba2Jeff Hamilton 81641dd62155fd2eeddd93b2036154b13c05b70ba2Jeff Hamilton /** 8228319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * Intent to start an activity when a tag is discovered and activities are registered for the 8328319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * specific technologies on the tag. 8428319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * 8528319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * <p>To receive this intent an activity must include an intent filter 8628319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * for this action and specify the desired tech types in a 8728319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * manifest <code>meta-data</code> entry. Here is an example manfiest entry: 8828319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * <pre> 8997e0a1c6f3b7ab8f0796931182f0343dd7e73782Scott Main * <activity android:name=".nfc.TechFilter" android:label="NFC/TechFilter"> 9097e0a1c6f3b7ab8f0796931182f0343dd7e73782Scott Main * <!-- Add a technology filter --> 9197e0a1c6f3b7ab8f0796931182f0343dd7e73782Scott Main * <intent-filter> 9297e0a1c6f3b7ab8f0796931182f0343dd7e73782Scott Main * <action android:name="android.nfc.action.TECH_DISCOVERED" /> 9397e0a1c6f3b7ab8f0796931182f0343dd7e73782Scott Main * </intent-filter> 9497e0a1c6f3b7ab8f0796931182f0343dd7e73782Scott Main * 9597e0a1c6f3b7ab8f0796931182f0343dd7e73782Scott Main * <meta-data android:name="android.nfc.action.TECH_DISCOVERED" 9697e0a1c6f3b7ab8f0796931182f0343dd7e73782Scott Main * android:resource="@xml/filter_nfc" 9797e0a1c6f3b7ab8f0796931182f0343dd7e73782Scott Main * /> 9897e0a1c6f3b7ab8f0796931182f0343dd7e73782Scott Main * </activity></pre> 9928319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * 10028319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * <p>The meta-data XML file should contain one or more <code>tech-list</code> entries 10128319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * each consisting or one or more <code>tech</code> entries. The <code>tech</code> entries refer 10228319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * to the qualified class name implementing the technology, for example "android.nfc.tech.NfcA". 103641dd62155fd2eeddd93b2036154b13c05b70ba2Jeff Hamilton * 10428319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * <p>A tag matches if any of the 10528319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * <code>tech-list</code> sets is a subset of {@link Tag#getTechList() Tag.getTechList()}. Each 10628319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * of the <code>tech-list</code>s is considered independently and the 10728319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * activity is considered a match is any single <code>tech-list</code> matches the tag that was 10828319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * discovered. This provides AND and OR semantics for filtering desired techs. Here is an 10928319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * example that will match any tag using {@link NfcF} or any tag using {@link NfcA}, 11028319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * {@link MifareClassic}, and {@link Ndef}: 111641dd62155fd2eeddd93b2036154b13c05b70ba2Jeff Hamilton * 11228319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * <pre> 11328319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> 11428319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * <!-- capture anything using NfcF --> 11528319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * <tech-list> 11628319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * <tech>android.nfc.tech.NfcF</tech> 11728319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * </tech-list> 11828319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * 11928319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * <!-- OR --> 12028319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * 12128319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * <!-- capture all MIFARE Classics with NDEF payloads --> 12228319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * <tech-list> 12328319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * <tech>android.nfc.tech.NfcA</tech> 12428319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * <tech>android.nfc.tech.MifareClassic</tech> 12528319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * <tech>android.nfc.tech.Ndef</tech> 12628319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * </tech-list> 12797e0a1c6f3b7ab8f0796931182f0343dd7e73782Scott Main * </resources></pre> 12828319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * 12928319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * <p>This intent is started after {@link #ACTION_NDEF_DISCOVERED} and before 13028319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * {@link #ACTION_TAG_DISCOVERED}. If any activities respond to {@link #ACTION_NDEF_DISCOVERED} 13128319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * this intent will not be started. If any activities respond to this intent 13228319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * {@link #ACTION_TAG_DISCOVERED} will not be started. 133641dd62155fd2eeddd93b2036154b13c05b70ba2Jeff Hamilton */ 134641dd62155fd2eeddd93b2036154b13c05b70ba2Jeff Hamilton @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) 135f003e26df96067b4b136f0859012cb7ec3ed930fNick Pelly public static final String ACTION_TECH_DISCOVERED = "android.nfc.action.TECH_DISCOVERED"; 136641dd62155fd2eeddd93b2036154b13c05b70ba2Jeff Hamilton 137641dd62155fd2eeddd93b2036154b13c05b70ba2Jeff Hamilton /** 13811b075e218b9921a953eeebe73fcd1a8a81f764bNick Pelly * Intent to start an activity when a tag is discovered. 13928319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * 14028319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * <p>This intent will not be started when a tag is discovered if any activities respond to 14101425365a85e605139f612502f68954cad869e5bJason parks * {@link #ACTION_NDEF_DISCOVERED} or {@link #ACTION_TECH_DISCOVERED} for the current tag. 142590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly */ 143590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) 144590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly public static final String ACTION_TAG_DISCOVERED = "android.nfc.action.TAG_DISCOVERED"; 145590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly 146590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly /** 1476be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton * Broadcast to only the activity that handles ACTION_TAG_DISCOVERED 1486be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton * @hide 1496be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton */ 1506be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton public static final String ACTION_TAG_LEFT_FIELD = "android.nfc.action.TAG_LOST"; 1516be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton 1526be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton /** 15328319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * Mandatory extra containing the {@link Tag} that was discovered for the 15428319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * {@link #ACTION_NDEF_DISCOVERED}, {@link #ACTION_TECH_DISCOVERED}, and 15528319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * {@link #ACTION_TAG_DISCOVERED} intents. 156590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly */ 15711b075e218b9921a953eeebe73fcd1a8a81f764bNick Pelly public static final String EXTRA_TAG = "android.nfc.extra.TAG"; 158590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly 159590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly /** 160c97a552023c3c71079b39092e80c9b44f25a789bNick Pelly * Extra containing an array of {@link NdefMessage} present on the discovered tag.<p> 161c97a552023c3c71079b39092e80c9b44f25a789bNick Pelly * This extra is mandatory for {@link #ACTION_NDEF_DISCOVERED} intents, 162c97a552023c3c71079b39092e80c9b44f25a789bNick Pelly * and optional for {@link #ACTION_TECH_DISCOVERED}, and 163c97a552023c3c71079b39092e80c9b44f25a789bNick Pelly * {@link #ACTION_TAG_DISCOVERED} intents.<p> 164c97a552023c3c71079b39092e80c9b44f25a789bNick Pelly * When this extra is present there will always be at least one 165c97a552023c3c71079b39092e80c9b44f25a789bNick Pelly * {@link NdefMessage} element. Most NDEF tags have only one NDEF message, 166c97a552023c3c71079b39092e80c9b44f25a789bNick Pelly * but we use an array for future compatibility. 167590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly */ 16811b075e218b9921a953eeebe73fcd1a8a81f764bNick Pelly public static final String EXTRA_NDEF_MESSAGES = "android.nfc.extra.NDEF_MESSAGES"; 16911b075e218b9921a953eeebe73fcd1a8a81f764bNick Pelly 17011b075e218b9921a953eeebe73fcd1a8a81f764bNick Pelly /** 17128319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * Optional extra containing a byte array containing the ID of the discovered tag for 17228319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * the {@link #ACTION_NDEF_DISCOVERED}, {@link #ACTION_TECH_DISCOVERED}, and 17328319c0cec94977682db32b949628a8e4b8183dcJeff Hamilton * {@link #ACTION_TAG_DISCOVERED} intents. 17411b075e218b9921a953eeebe73fcd1a8a81f764bNick Pelly */ 17511b075e218b9921a953eeebe73fcd1a8a81f764bNick Pelly public static final String EXTRA_ID = "android.nfc.extra.ID"; 176590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly 177590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly /** 1788d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly * Broadcast Action: The state of the local NFC adapter has been 1798d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly * changed. 1808d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly * <p>For example, NFC has been turned on or off. 1814ba5eaf7f3b92656311f1ea1869d359729ba88e4Martijn Coenen * <p>Always contains the extra field {@link #EXTRA_ADAPTER_STATE} 182afb082dba5232a45a7563e085f12284f7d5ffc1dBrad Fitzpatrick */ 1838d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 1848d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly public static final String ACTION_ADAPTER_STATE_CHANGED = 1858d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly "android.nfc.action.ADAPTER_STATE_CHANGED"; 186afb082dba5232a45a7563e085f12284f7d5ffc1dBrad Fitzpatrick 187afb082dba5232a45a7563e085f12284f7d5ffc1dBrad Fitzpatrick /** 1884ba5eaf7f3b92656311f1ea1869d359729ba88e4Martijn Coenen * Used as an int extra field in {@link #ACTION_ADAPTER_STATE_CHANGED} 1898d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly * intents to request the current power state. Possible values are: 1908d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly * {@link #STATE_OFF}, 1918d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly * {@link #STATE_TURNING_ON}, 1928d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly * {@link #STATE_ON}, 1938d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly * {@link #STATE_TURNING_OFF}, 194afb082dba5232a45a7563e085f12284f7d5ffc1dBrad Fitzpatrick */ 1958d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly public static final String EXTRA_ADAPTER_STATE = "android.nfc.extra.ADAPTER_STATE"; 1968d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly 1978d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly public static final int STATE_OFF = 1; 1988d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly public static final int STATE_TURNING_ON = 2; 1998d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly public static final int STATE_ON = 3; 2008d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly public static final int STATE_TURNING_OFF = 4; 201afb082dba5232a45a7563e085f12284f7d5ffc1dBrad Fitzpatrick 202c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen /** 2035b1e032ea7c06ab11d778264dd950009fcb93cc5Martijn Coenen * Flag for use with {@link #enableReaderMode(Activity, ReaderCallback, int, Bundle)}. 204c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen * <p> 205c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen * Setting this flag enables polling for Nfc-A technology. 206c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen */ 207c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen public static final int FLAG_READER_NFC_A = 0x1; 208c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen 209c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen /** 2105b1e032ea7c06ab11d778264dd950009fcb93cc5Martijn Coenen * Flag for use with {@link #enableReaderMode(Activity, ReaderCallback, int, Bundle)}. 211c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen * <p> 212c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen * Setting this flag enables polling for Nfc-B technology. 213c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen */ 214c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen public static final int FLAG_READER_NFC_B = 0x2; 215c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen 216c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen /** 2175b1e032ea7c06ab11d778264dd950009fcb93cc5Martijn Coenen * Flag for use with {@link #enableReaderMode(Activity, ReaderCallback, int, Bundle)}. 218c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen * <p> 219c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen * Setting this flag enables polling for Nfc-F technology. 220c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen */ 221c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen public static final int FLAG_READER_NFC_F = 0x4; 222c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen 223c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen /** 2245b1e032ea7c06ab11d778264dd950009fcb93cc5Martijn Coenen * Flag for use with {@link #enableReaderMode(Activity, ReaderCallback, int, Bundle)}. 225c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen * <p> 226c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen * Setting this flag enables polling for Nfc-V (ISO15693) technology. 227c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen */ 228c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen public static final int FLAG_READER_NFC_V = 0x8; 229c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen 230c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen /** 2315b1e032ea7c06ab11d778264dd950009fcb93cc5Martijn Coenen * Flag for use with {@link #enableReaderMode(Activity, ReaderCallback, int, Bundle)}. 232c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen * <p> 233b523bfa64d9304ef22d563f81defa48b047c623aMartijn Coenen * Setting this flag enables polling for NfcBarcode technology. 234c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen */ 235b523bfa64d9304ef22d563f81defa48b047c623aMartijn Coenen public static final int FLAG_READER_NFC_BARCODE = 0x10; 236c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen 237c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen /** 2385b1e032ea7c06ab11d778264dd950009fcb93cc5Martijn Coenen * Flag for use with {@link #enableReaderMode(Activity, ReaderCallback, int, Bundle)}. 239c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen * <p> 240c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen * Setting this flag allows the caller to prevent the 241c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen * platform from performing an NDEF check on the tags it 242c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen * finds. 243c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen */ 244c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen public static final int FLAG_READER_SKIP_NDEF_CHECK = 0x80; 245c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen 2465b1e032ea7c06ab11d778264dd950009fcb93cc5Martijn Coenen /** 2475b1e032ea7c06ab11d778264dd950009fcb93cc5Martijn Coenen * Flag for use with {@link #enableReaderMode(Activity, ReaderCallback, int, Bundle)}. 2485b1e032ea7c06ab11d778264dd950009fcb93cc5Martijn Coenen * <p> 2495b1e032ea7c06ab11d778264dd950009fcb93cc5Martijn Coenen * Setting this flag allows the caller to prevent the 2505b1e032ea7c06ab11d778264dd950009fcb93cc5Martijn Coenen * platform from playing sounds when it discovers a tag. 2515b1e032ea7c06ab11d778264dd950009fcb93cc5Martijn Coenen */ 2525b1e032ea7c06ab11d778264dd950009fcb93cc5Martijn Coenen public static final int FLAG_READER_NO_PLATFORM_SOUNDS = 0x100; 2535b1e032ea7c06ab11d778264dd950009fcb93cc5Martijn Coenen 2545b1e032ea7c06ab11d778264dd950009fcb93cc5Martijn Coenen /** 2555b1e032ea7c06ab11d778264dd950009fcb93cc5Martijn Coenen * Int Extra for use with {@link #enableReaderMode(Activity, ReaderCallback, int, Bundle)}. 2565b1e032ea7c06ab11d778264dd950009fcb93cc5Martijn Coenen * <p> 2575b1e032ea7c06ab11d778264dd950009fcb93cc5Martijn Coenen * Setting this integer extra allows the calling application to specify 2585b1e032ea7c06ab11d778264dd950009fcb93cc5Martijn Coenen * the delay that the platform will use for performing presence checks 2595b1e032ea7c06ab11d778264dd950009fcb93cc5Martijn Coenen * on any discovered tag. 2605b1e032ea7c06ab11d778264dd950009fcb93cc5Martijn Coenen */ 2615b1e032ea7c06ab11d778264dd950009fcb93cc5Martijn Coenen public static final String EXTRA_READER_PRESENCE_CHECK_DELAY = "presence"; 2625b1e032ea7c06ab11d778264dd950009fcb93cc5Martijn Coenen 26320e8dd9f9e7cff63c83e36a1761538a04c224cc1Martijn Coenen /** @hide */ 26429c2e3797a6c397fa7812bc4cf167a72dde28faaMartijn Coenen @SystemApi 2651fa2aff21bc4cb89a141828c2661530e6aa655ddMartijn Coenen public static final int FLAG_NDEF_PUSH_NO_CONFIRM = 0x1; 2661fa2aff21bc4cb89a141828c2661530e6aa655ddMartijn Coenen 2671fa2aff21bc4cb89a141828c2661530e6aa655ddMartijn Coenen /** @hide */ 26820e8dd9f9e7cff63c83e36a1761538a04c224cc1Martijn Coenen public static final String ACTION_HANDOVER_TRANSFER_STARTED = 26920e8dd9f9e7cff63c83e36a1761538a04c224cc1Martijn Coenen "android.nfc.action.HANDOVER_TRANSFER_STARTED"; 27020e8dd9f9e7cff63c83e36a1761538a04c224cc1Martijn Coenen 27120e8dd9f9e7cff63c83e36a1761538a04c224cc1Martijn Coenen /** @hide */ 27220e8dd9f9e7cff63c83e36a1761538a04c224cc1Martijn Coenen public static final String ACTION_HANDOVER_TRANSFER_DONE = 27320e8dd9f9e7cff63c83e36a1761538a04c224cc1Martijn Coenen "android.nfc.action.HANDOVER_TRANSFER_DONE"; 27420e8dd9f9e7cff63c83e36a1761538a04c224cc1Martijn Coenen 27520e8dd9f9e7cff63c83e36a1761538a04c224cc1Martijn Coenen /** @hide */ 27620e8dd9f9e7cff63c83e36a1761538a04c224cc1Martijn Coenen public static final String EXTRA_HANDOVER_TRANSFER_STATUS = 27720e8dd9f9e7cff63c83e36a1761538a04c224cc1Martijn Coenen "android.nfc.extra.HANDOVER_TRANSFER_STATUS"; 27820e8dd9f9e7cff63c83e36a1761538a04c224cc1Martijn Coenen 27920e8dd9f9e7cff63c83e36a1761538a04c224cc1Martijn Coenen /** @hide */ 28020e8dd9f9e7cff63c83e36a1761538a04c224cc1Martijn Coenen public static final int HANDOVER_TRANSFER_STATUS_SUCCESS = 0; 28120e8dd9f9e7cff63c83e36a1761538a04c224cc1Martijn Coenen /** @hide */ 28220e8dd9f9e7cff63c83e36a1761538a04c224cc1Martijn Coenen public static final int HANDOVER_TRANSFER_STATUS_FAILURE = 1; 28320e8dd9f9e7cff63c83e36a1761538a04c224cc1Martijn Coenen 28420e8dd9f9e7cff63c83e36a1761538a04c224cc1Martijn Coenen /** @hide */ 28520e8dd9f9e7cff63c83e36a1761538a04c224cc1Martijn Coenen public static final String EXTRA_HANDOVER_TRANSFER_URI = 28620e8dd9f9e7cff63c83e36a1761538a04c224cc1Martijn Coenen "android.nfc.extra.HANDOVER_TRANSFER_URI"; 28720e8dd9f9e7cff63c83e36a1761538a04c224cc1Martijn Coenen 288c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly // Guarded by NfcAdapter.class 289c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly static boolean sIsInitialized = false; 290590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly 291c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly // Final after first constructor, except for 292c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly // attemptDeadServiceRecovery() when NFC crashes - we accept a best effort 293c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly // recovery 294c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly static INfcAdapter sService; 295c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly static INfcTag sTagService; 296a7397883de67d674970d91f86d46ccf637e5e543Martijn Coenen static INfcCardEmulation sCardEmulationService; 297590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly 298590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly /** 299bb951c893973691554f49d2e725985125f866b27Jeff Hamilton * The NfcAdapter object for each application context. 300bb951c893973691554f49d2e725985125f866b27Jeff Hamilton * There is a 1-1 relationship between application context and 301bb951c893973691554f49d2e725985125f866b27Jeff Hamilton * NfcAdapter object. 302bb951c893973691554f49d2e725985125f866b27Jeff Hamilton */ 303bb951c893973691554f49d2e725985125f866b27Jeff Hamilton static HashMap<Context, NfcAdapter> sNfcAdapters = new HashMap(); //guard by NfcAdapter.class 304bb951c893973691554f49d2e725985125f866b27Jeff Hamilton 305bb951c893973691554f49d2e725985125f866b27Jeff Hamilton /** 306bb951c893973691554f49d2e725985125f866b27Jeff Hamilton * NfcAdapter used with a null context. This ctor was deprecated but we have 307bb951c893973691554f49d2e725985125f866b27Jeff Hamilton * to support it for backwards compatibility. New methods that require context 308bb951c893973691554f49d2e725985125f866b27Jeff Hamilton * might throw when called on the null-context NfcAdapter. 309590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly */ 310bb951c893973691554f49d2e725985125f866b27Jeff Hamilton static NfcAdapter sNullContextNfcAdapter; // protected by NfcAdapter.class 311590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly 312c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly final NfcActivityManager mNfcActivityManager; 313bb951c893973691554f49d2e725985125f866b27Jeff Hamilton final Context mContext; 314f9a97942e1b530cb87a8d7b28551889bc438a744Andres Morales final HashMap<NfcUnlockHandler, INfcUnlockHandler> mNfcUnlockHandlers; 31511d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales final Object mLock; 316590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly 317590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly /** 318b38ad76a829f9bdbc27e86647de31a5ad19f117aScott Main * A callback to be invoked when the system finds a tag while the foreground activity is 319b38ad76a829f9bdbc27e86647de31a5ad19f117aScott Main * operating in reader mode. 320b38ad76a829f9bdbc27e86647de31a5ad19f117aScott Main * <p>Register your {@code ReaderCallback} implementation with {@link 321b38ad76a829f9bdbc27e86647de31a5ad19f117aScott Main * NfcAdapter#enableReaderMode} and disable it with {@link 322b38ad76a829f9bdbc27e86647de31a5ad19f117aScott Main * NfcAdapter#disableReaderMode}. 323b38ad76a829f9bdbc27e86647de31a5ad19f117aScott Main * @see NfcAdapter#enableReaderMode 3245b1e032ea7c06ab11d778264dd950009fcb93cc5Martijn Coenen */ 3255b1e032ea7c06ab11d778264dd950009fcb93cc5Martijn Coenen public interface ReaderCallback { 3265b1e032ea7c06ab11d778264dd950009fcb93cc5Martijn Coenen public void onTagDiscovered(Tag tag); 3275b1e032ea7c06ab11d778264dd950009fcb93cc5Martijn Coenen } 3285b1e032ea7c06ab11d778264dd950009fcb93cc5Martijn Coenen 3295b1e032ea7c06ab11d778264dd950009fcb93cc5Martijn Coenen /** 3302d68a6ba3c1354f363e5ee77448f163664bf47d9Scott Main * A callback to be invoked when the system successfully delivers your {@link NdefMessage} 3312d68a6ba3c1354f363e5ee77448f163664bf47d9Scott Main * to another device. 3322d68a6ba3c1354f363e5ee77448f163664bf47d9Scott Main * @see #setOnNdefPushCompleteCallback 333590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly */ 334c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly public interface OnNdefPushCompleteCallback { 335c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly /** 336c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * Called on successful NDEF push. 337c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * 338c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * <p>This callback is usually made on a binder thread (not the UI thread). 339c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * 340c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * @param event {@link NfcEvent} with the {@link NfcEvent#nfcAdapter} field set 3412d68a6ba3c1354f363e5ee77448f163664bf47d9Scott Main * @see #setNdefPushMessageCallback 342c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly */ 343c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly public void onNdefPushComplete(NfcEvent event); 344c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly } 345590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly 34601425365a85e605139f612502f68954cad869e5bJason parks /** 3472d68a6ba3c1354f363e5ee77448f163664bf47d9Scott Main * A callback to be invoked when another NFC device capable of NDEF push (Android Beam) 3482d68a6ba3c1354f363e5ee77448f163664bf47d9Scott Main * is within range. 3492d68a6ba3c1354f363e5ee77448f163664bf47d9Scott Main * <p>Implement this interface and pass it to {@link 3502d68a6ba3c1354f363e5ee77448f163664bf47d9Scott Main * NfcAdapter#setNdefPushMessageCallback setNdefPushMessageCallback()} in order to create an 3512d68a6ba3c1354f363e5ee77448f163664bf47d9Scott Main * {@link NdefMessage} at the moment that another device is within range for NFC. Using this 3522d68a6ba3c1354f363e5ee77448f163664bf47d9Scott Main * callback allows you to create a message with data that might vary based on the 3532d68a6ba3c1354f363e5ee77448f163664bf47d9Scott Main * content currently visible to the user. Alternatively, you can call {@link 3542d68a6ba3c1354f363e5ee77448f163664bf47d9Scott Main * #setNdefPushMessage setNdefPushMessage()} if the {@link NdefMessage} always contains the 3552d68a6ba3c1354f363e5ee77448f163664bf47d9Scott Main * same data. 35601425365a85e605139f612502f68954cad869e5bJason parks */ 357c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly public interface CreateNdefMessageCallback { 35801425365a85e605139f612502f68954cad869e5bJason parks /** 359c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * Called to provide a {@link NdefMessage} to push. 360c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * 361c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * <p>This callback is usually made on a binder thread (not the UI thread). 362c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * 363c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * <p>Called when this device is in range of another device 364c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * that might support NDEF push. It allows the application to 365c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * create the NDEF message only when it is required. 366c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * 367c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * <p>NDEF push cannot occur until this method returns, so do not 368c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * block for too long. 369c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * 370c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * <p>The Android operating system will usually show a system UI 371c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * on top of your activity during this time, so do not try to request 372c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * input from the user to complete the callback, or provide custom NDEF 373c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * push UI. The user probably will not see it. 374c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * 375c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * @param event {@link NfcEvent} with the {@link NfcEvent#nfcAdapter} field set 376c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * @return NDEF message to push, or null to not provide a message 37701425365a85e605139f612502f68954cad869e5bJason parks */ 378c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly public NdefMessage createNdefMessage(NfcEvent event); 37901425365a85e605139f612502f68954cad869e5bJason parks } 38001425365a85e605139f612502f68954cad869e5bJason parks 38120e8dd9f9e7cff63c83e36a1761538a04c224cc1Martijn Coenen 38220e8dd9f9e7cff63c83e36a1761538a04c224cc1Martijn Coenen // TODO javadoc 38320e8dd9f9e7cff63c83e36a1761538a04c224cc1Martijn Coenen public interface CreateBeamUrisCallback { 38420e8dd9f9e7cff63c83e36a1761538a04c224cc1Martijn Coenen public Uri[] createBeamUris(NfcEvent event); 38520e8dd9f9e7cff63c83e36a1761538a04c224cc1Martijn Coenen } 38620e8dd9f9e7cff63c83e36a1761538a04c224cc1Martijn Coenen 387590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly /** 38811d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales * A callback to be invoked when an application has registered as a 38911d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales * handler to unlock the device given an NFC tag at the lockscreen. 39011d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales * @hide 39111d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales */ 39211d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales @SystemApi 39311d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales public interface NfcUnlockHandler { 39411d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales /** 39511d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales * Called at the lock screen to attempt to unlock the device with the given tag. 39611d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales * @param tag the detected tag, to be used to unlock the device 39711d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales * @return true if the device was successfully unlocked 39811d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales */ 39911d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales public boolean onUnlockAttempted(Tag tag); 40011d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales } 40111d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales 40211d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales 40311d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales /** 404fdf9086e24f4720ee9fbc852b980041f126aa3c2Nick Pelly * Helper to check if this device has FEATURE_NFC, but without using 405fdf9086e24f4720ee9fbc852b980041f126aa3c2Nick Pelly * a context. 406fdf9086e24f4720ee9fbc852b980041f126aa3c2Nick Pelly * Equivalent to 407fdf9086e24f4720ee9fbc852b980041f126aa3c2Nick Pelly * context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_NFC) 408fdf9086e24f4720ee9fbc852b980041f126aa3c2Nick Pelly */ 409fdf9086e24f4720ee9fbc852b980041f126aa3c2Nick Pelly private static boolean hasNfcFeature() { 410fdf9086e24f4720ee9fbc852b980041f126aa3c2Nick Pelly IPackageManager pm = ActivityThread.getPackageManager(); 411fdf9086e24f4720ee9fbc852b980041f126aa3c2Nick Pelly if (pm == null) { 412fdf9086e24f4720ee9fbc852b980041f126aa3c2Nick Pelly Log.e(TAG, "Cannot get package manager, assuming no NFC feature"); 413fdf9086e24f4720ee9fbc852b980041f126aa3c2Nick Pelly return false; 414fdf9086e24f4720ee9fbc852b980041f126aa3c2Nick Pelly } 415fdf9086e24f4720ee9fbc852b980041f126aa3c2Nick Pelly try { 416fdf9086e24f4720ee9fbc852b980041f126aa3c2Nick Pelly return pm.hasSystemFeature(PackageManager.FEATURE_NFC); 417fdf9086e24f4720ee9fbc852b980041f126aa3c2Nick Pelly } catch (RemoteException e) { 418fdf9086e24f4720ee9fbc852b980041f126aa3c2Nick Pelly Log.e(TAG, "Package manager query failed, assuming no NFC feature", e); 419fdf9086e24f4720ee9fbc852b980041f126aa3c2Nick Pelly return false; 420fdf9086e24f4720ee9fbc852b980041f126aa3c2Nick Pelly } 421fdf9086e24f4720ee9fbc852b980041f126aa3c2Nick Pelly } 422fdf9086e24f4720ee9fbc852b980041f126aa3c2Nick Pelly 423c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly /** 424bb951c893973691554f49d2e725985125f866b27Jeff Hamilton * Returns the NfcAdapter for application context, 425bb951c893973691554f49d2e725985125f866b27Jeff Hamilton * or throws if NFC is not available. 426bb951c893973691554f49d2e725985125f866b27Jeff Hamilton * @hide 427c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly */ 428bb951c893973691554f49d2e725985125f866b27Jeff Hamilton public static synchronized NfcAdapter getNfcAdapter(Context context) { 42950b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly if (!sIsInitialized) { 43050b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly /* is this device meant to have NFC */ 43150b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly if (!hasNfcFeature()) { 43250b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly Log.v(TAG, "this device does not have NFC support"); 433c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly throw new UnsupportedOperationException(); 43450b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly } 43550b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly 43650b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly sService = getServiceInterface(); 43750b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly if (sService == null) { 43850b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly Log.e(TAG, "could not retrieve NFC service"); 439c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly throw new UnsupportedOperationException(); 44050b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly } 4413dd6c458530476eccb33bc05c9c9cd83823bcf8dNick Pelly try { 4423dd6c458530476eccb33bc05c9c9cd83823bcf8dNick Pelly sTagService = sService.getNfcTagInterface(); 4433dd6c458530476eccb33bc05c9c9cd83823bcf8dNick Pelly } catch (RemoteException e) { 4443dd6c458530476eccb33bc05c9c9cd83823bcf8dNick Pelly Log.e(TAG, "could not retrieve NFC Tag service"); 445c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly throw new UnsupportedOperationException(); 4463dd6c458530476eccb33bc05c9c9cd83823bcf8dNick Pelly } 447bb951c893973691554f49d2e725985125f866b27Jeff Hamilton 448a7397883de67d674970d91f86d46ccf637e5e543Martijn Coenen try { 449a7397883de67d674970d91f86d46ccf637e5e543Martijn Coenen sCardEmulationService = sService.getNfcCardEmulationInterface(); 450a7397883de67d674970d91f86d46ccf637e5e543Martijn Coenen } catch (RemoteException e) { 451a7397883de67d674970d91f86d46ccf637e5e543Martijn Coenen Log.e(TAG, "could not retrieve card emulation service"); 452a7397883de67d674970d91f86d46ccf637e5e543Martijn Coenen throw new UnsupportedOperationException(); 453a7397883de67d674970d91f86d46ccf637e5e543Martijn Coenen } 454a7397883de67d674970d91f86d46ccf637e5e543Martijn Coenen 455bb951c893973691554f49d2e725985125f866b27Jeff Hamilton sIsInitialized = true; 456bb951c893973691554f49d2e725985125f866b27Jeff Hamilton } 457bb951c893973691554f49d2e725985125f866b27Jeff Hamilton if (context == null) { 458bb951c893973691554f49d2e725985125f866b27Jeff Hamilton if (sNullContextNfcAdapter == null) { 459bb951c893973691554f49d2e725985125f866b27Jeff Hamilton sNullContextNfcAdapter = new NfcAdapter(null); 460bb951c893973691554f49d2e725985125f866b27Jeff Hamilton } 461bb951c893973691554f49d2e725985125f866b27Jeff Hamilton return sNullContextNfcAdapter; 46250b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly } 463bb951c893973691554f49d2e725985125f866b27Jeff Hamilton NfcAdapter adapter = sNfcAdapters.get(context); 464bb951c893973691554f49d2e725985125f866b27Jeff Hamilton if (adapter == null) { 465bb951c893973691554f49d2e725985125f866b27Jeff Hamilton adapter = new NfcAdapter(context); 466bb951c893973691554f49d2e725985125f866b27Jeff Hamilton sNfcAdapters.put(context, adapter); 467c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly } 468bb951c893973691554f49d2e725985125f866b27Jeff Hamilton return adapter; 46950b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly } 47050b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly 4716d55e1342fc35c26dd97700ae791b34668266018Nick Pelly /** get handle to NFC service interface */ 47250b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly private static INfcAdapter getServiceInterface() { 4736d55e1342fc35c26dd97700ae791b34668266018Nick Pelly /* get a handle to NFC service */ 4746d55e1342fc35c26dd97700ae791b34668266018Nick Pelly IBinder b = ServiceManager.getService("nfc"); 4756d55e1342fc35c26dd97700ae791b34668266018Nick Pelly if (b == null) { 4766d55e1342fc35c26dd97700ae791b34668266018Nick Pelly return null; 4776d55e1342fc35c26dd97700ae791b34668266018Nick Pelly } 4786d55e1342fc35c26dd97700ae791b34668266018Nick Pelly return INfcAdapter.Stub.asInterface(b); 4796d55e1342fc35c26dd97700ae791b34668266018Nick Pelly } 4806d55e1342fc35c26dd97700ae791b34668266018Nick Pelly 481fdf9086e24f4720ee9fbc852b980041f126aa3c2Nick Pelly /** 48250b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly * Helper to get the default NFC Adapter. 48350b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly * <p> 48450b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly * Most Android devices will only have one NFC Adapter (NFC Controller). 48550b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly * <p> 48650b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly * This helper is the equivalent of: 48797e0a1c6f3b7ab8f0796931182f0343dd7e73782Scott Main * <pre> 48850b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly * NfcManager manager = (NfcManager) context.getSystemService(Context.NFC_SERVICE); 48997e0a1c6f3b7ab8f0796931182f0343dd7e73782Scott Main * NfcAdapter adapter = manager.getDefaultAdapter();</pre> 49050b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly * @param context the calling application's context 49150b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly * 49250b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly * @return the default NFC adapter, or null if no NFC adapter exists 49350b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly */ 49450b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly public static NfcAdapter getDefaultAdapter(Context context) { 495bb951c893973691554f49d2e725985125f866b27Jeff Hamilton if (context == null) { 496bb951c893973691554f49d2e725985125f866b27Jeff Hamilton throw new IllegalArgumentException("context cannot be null"); 497bb951c893973691554f49d2e725985125f866b27Jeff Hamilton } 498bb951c893973691554f49d2e725985125f866b27Jeff Hamilton context = context.getApplicationContext(); 499b04cce0eb5917db436b7db39eb67c064df2e015aNick Pelly if (context == null) { 500b04cce0eb5917db436b7db39eb67c064df2e015aNick Pelly throw new IllegalArgumentException( 501b04cce0eb5917db436b7db39eb67c064df2e015aNick Pelly "context not associated with any application (using a mock context?)"); 502b04cce0eb5917db436b7db39eb67c064df2e015aNick Pelly } 503b04cce0eb5917db436b7db39eb67c064df2e015aNick Pelly /* use getSystemService() for consistency */ 50450b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly NfcManager manager = (NfcManager) context.getSystemService(Context.NFC_SERVICE); 505a5193b24c1c944331f329eca1d4f85df3a024b1dNick Pelly if (manager == null) { 506a5193b24c1c944331f329eca1d4f85df3a024b1dNick Pelly // NFC not available 507a5193b24c1c944331f329eca1d4f85df3a024b1dNick Pelly return null; 508a5193b24c1c944331f329eca1d4f85df3a024b1dNick Pelly } 50950b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly return manager.getDefaultAdapter(); 51050b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly } 51150b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly 51250b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly /** 513bb951c893973691554f49d2e725985125f866b27Jeff Hamilton * Legacy NfcAdapter getter, always use {@link #getDefaultAdapter(Context)} instead.<p> 514bb951c893973691554f49d2e725985125f866b27Jeff Hamilton * This method was deprecated at API level 10 (Gingerbread MR1) because a context is required 515bb951c893973691554f49d2e725985125f866b27Jeff Hamilton * for many NFC API methods. Those methods will fail when called on an NfcAdapter 516bb951c893973691554f49d2e725985125f866b27Jeff Hamilton * object created from this method.<p> 51750b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly * @deprecated use {@link #getDefaultAdapter(Context)} 518a356bf1cd81614a94ef6c720998792480ade4c84Nick Pelly * @hide 519590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly */ 52050b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly @Deprecated 521590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly public static NfcAdapter getDefaultAdapter() { 522c97a552023c3c71079b39092e80c9b44f25a789bNick Pelly // introduced in API version 9 (GB 2.3) 523a356bf1cd81614a94ef6c720998792480ade4c84Nick Pelly // deprecated in API version 10 (GB 2.3.3) 524a356bf1cd81614a94ef6c720998792480ade4c84Nick Pelly // removed from public API in version 16 (ICS MR2) 525c97a552023c3c71079b39092e80c9b44f25a789bNick Pelly // should maintain as a hidden API for binary compatibility for a little longer 52650b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly Log.w(TAG, "WARNING: NfcAdapter.getDefaultAdapter() is deprecated, use " + 52750b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly "NfcAdapter.getDefaultAdapter(Context) instead", new Exception()); 528bb951c893973691554f49d2e725985125f866b27Jeff Hamilton 529bb951c893973691554f49d2e725985125f866b27Jeff Hamilton return NfcAdapter.getNfcAdapter(null); 530bb951c893973691554f49d2e725985125f866b27Jeff Hamilton } 531bb951c893973691554f49d2e725985125f866b27Jeff Hamilton 532bb951c893973691554f49d2e725985125f866b27Jeff Hamilton NfcAdapter(Context context) { 533bb951c893973691554f49d2e725985125f866b27Jeff Hamilton mContext = context; 534bb951c893973691554f49d2e725985125f866b27Jeff Hamilton mNfcActivityManager = new NfcActivityManager(this); 535f9a97942e1b530cb87a8d7b28551889bc438a744Andres Morales mNfcUnlockHandlers = new HashMap<NfcUnlockHandler, INfcUnlockHandler>(); 53611d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales mLock = new Object(); 53750b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly } 538590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly 539c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly /** 540bb951c893973691554f49d2e725985125f866b27Jeff Hamilton * @hide 541c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly */ 542bb951c893973691554f49d2e725985125f866b27Jeff Hamilton public Context getContext() { 543bb951c893973691554f49d2e725985125f866b27Jeff Hamilton return mContext; 54450b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly } 54550b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly 54650b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly /** 54750b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly * Returns the binder interface to the service. 54850b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly * @hide 54950b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly */ 55050b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly public INfcAdapter getService() { 551253c509cb0d36b39c3d878c0caf7f1eca194068aNick Pelly isEnabled(); // NOP call to recover sService if it is stale 55250b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly return sService; 553590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly } 554590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly 5556be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton /** 5563dd6c458530476eccb33bc05c9c9cd83823bcf8dNick Pelly * Returns the binder interface to the tag service. 5573dd6c458530476eccb33bc05c9c9cd83823bcf8dNick Pelly * @hide 5583dd6c458530476eccb33bc05c9c9cd83823bcf8dNick Pelly */ 5593dd6c458530476eccb33bc05c9c9cd83823bcf8dNick Pelly public INfcTag getTagService() { 560253c509cb0d36b39c3d878c0caf7f1eca194068aNick Pelly isEnabled(); // NOP call to recover sTagService if it is stale 5613dd6c458530476eccb33bc05c9c9cd83823bcf8dNick Pelly return sTagService; 5623dd6c458530476eccb33bc05c9c9cd83823bcf8dNick Pelly } 5633dd6c458530476eccb33bc05c9c9cd83823bcf8dNick Pelly 5643dd6c458530476eccb33bc05c9c9cd83823bcf8dNick Pelly /** 565a7397883de67d674970d91f86d46ccf637e5e543Martijn Coenen * Returns the binder interface to the card emulation service. 566a7397883de67d674970d91f86d46ccf637e5e543Martijn Coenen * @hide 567a7397883de67d674970d91f86d46ccf637e5e543Martijn Coenen */ 568a7397883de67d674970d91f86d46ccf637e5e543Martijn Coenen public INfcCardEmulation getCardEmulationService() { 569a7397883de67d674970d91f86d46ccf637e5e543Martijn Coenen isEnabled(); 570a7397883de67d674970d91f86d46ccf637e5e543Martijn Coenen return sCardEmulationService; 571a7397883de67d674970d91f86d46ccf637e5e543Martijn Coenen } 572a7397883de67d674970d91f86d46ccf637e5e543Martijn Coenen 573a7397883de67d674970d91f86d46ccf637e5e543Martijn Coenen /** 5746be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton * NFC service dead - attempt best effort recovery 5756be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton * @hide 5766be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton */ 5776be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton public void attemptDeadServiceRecovery(Exception e) { 5786d55e1342fc35c26dd97700ae791b34668266018Nick Pelly Log.e(TAG, "NFC service dead - attempting to recover", e); 5796d55e1342fc35c26dd97700ae791b34668266018Nick Pelly INfcAdapter service = getServiceInterface(); 5806d55e1342fc35c26dd97700ae791b34668266018Nick Pelly if (service == null) { 5816d55e1342fc35c26dd97700ae791b34668266018Nick Pelly Log.e(TAG, "could not retrieve NFC service during service recovery"); 5823dd6c458530476eccb33bc05c9c9cd83823bcf8dNick Pelly // nothing more can be done now, sService is still stale, we'll hit 5833dd6c458530476eccb33bc05c9c9cd83823bcf8dNick Pelly // this recovery path again later 5846d55e1342fc35c26dd97700ae791b34668266018Nick Pelly return; 5856d55e1342fc35c26dd97700ae791b34668266018Nick Pelly } 5863dd6c458530476eccb33bc05c9c9cd83823bcf8dNick Pelly // assigning to sService is not thread-safe, but this is best-effort code 5873dd6c458530476eccb33bc05c9c9cd83823bcf8dNick Pelly // and on a well-behaved system should never happen 58850b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly sService = service; 5893dd6c458530476eccb33bc05c9c9cd83823bcf8dNick Pelly try { 5903dd6c458530476eccb33bc05c9c9cd83823bcf8dNick Pelly sTagService = service.getNfcTagInterface(); 5913dd6c458530476eccb33bc05c9c9cd83823bcf8dNick Pelly } catch (RemoteException ee) { 5923dd6c458530476eccb33bc05c9c9cd83823bcf8dNick Pelly Log.e(TAG, "could not retrieve NFC tag service during service recovery"); 5933dd6c458530476eccb33bc05c9c9cd83823bcf8dNick Pelly // nothing more can be done now, sService is still stale, we'll hit 5943dd6c458530476eccb33bc05c9c9cd83823bcf8dNick Pelly // this recovery path again later 595a7397883de67d674970d91f86d46ccf637e5e543Martijn Coenen return; 596a7397883de67d674970d91f86d46ccf637e5e543Martijn Coenen } 597a7397883de67d674970d91f86d46ccf637e5e543Martijn Coenen 598a7397883de67d674970d91f86d46ccf637e5e543Martijn Coenen try { 599a7397883de67d674970d91f86d46ccf637e5e543Martijn Coenen sCardEmulationService = service.getNfcCardEmulationInterface(); 600a7397883de67d674970d91f86d46ccf637e5e543Martijn Coenen } catch (RemoteException ee) { 601a7397883de67d674970d91f86d46ccf637e5e543Martijn Coenen Log.e(TAG, "could not retrieve NFC card emulation service during service recovery"); 6023dd6c458530476eccb33bc05c9c9cd83823bcf8dNick Pelly } 6033dd6c458530476eccb33bc05c9c9cd83823bcf8dNick Pelly 6046d55e1342fc35c26dd97700ae791b34668266018Nick Pelly return; 6056d55e1342fc35c26dd97700ae791b34668266018Nick Pelly } 6066d55e1342fc35c26dd97700ae791b34668266018Nick Pelly 607590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly /** 6087ea5c45e8d89f59065f088d4e11cceeeed9d64d1Nick Pelly * Return true if this NFC Adapter has any features enabled. 609590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly * 61074fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * <p>If this method returns false, the NFC hardware is guaranteed not to 611cccf01d3e270bbf53ae6601698109ac4ef461076Nick Pelly * generate or respond to any NFC communication over its NFC radio. 612cccf01d3e270bbf53ae6601698109ac4ef461076Nick Pelly * <p>Applications can use this to check if NFC is enabled. Applications 613cccf01d3e270bbf53ae6601698109ac4ef461076Nick Pelly * can request Settings UI allowing the user to toggle NFC using: 614cccf01d3e270bbf53ae6601698109ac4ef461076Nick Pelly * <p><pre>startActivity(new Intent(Settings.ACTION_NFC_SETTINGS))</pre> 61574fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * 616cccf01d3e270bbf53ae6601698109ac4ef461076Nick Pelly * @see android.provider.Settings#ACTION_NFC_SETTINGS 61774fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * @return true if this NFC Adapter has any features enabled 618590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly */ 6197ea5c45e8d89f59065f088d4e11cceeeed9d64d1Nick Pelly public boolean isEnabled() { 620590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly try { 6218d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly return sService.getState() == STATE_ON; 622590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly } catch (RemoteException e) { 6236d55e1342fc35c26dd97700ae791b34668266018Nick Pelly attemptDeadServiceRecovery(e); 624590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly return false; 625590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly } 626590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly } 627590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly 628590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly /** 6298d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly * Return the state of this NFC Adapter. 6308d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly * 6318d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly * <p>Returns one of {@link #STATE_ON}, {@link #STATE_TURNING_ON}, 6328d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly * {@link #STATE_OFF}, {@link #STATE_TURNING_OFF}. 6338d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly * 6348d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly * <p>{@link #isEnabled()} is equivalent to 6358d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly * <code>{@link #getAdapterState()} == {@link #STATE_ON}</code> 6368d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly * 6378d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly * @return the current state of this NFC adapter 6388d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly * 6398d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly * @hide 6408d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly */ 6418d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly public int getAdapterState() { 6428d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly try { 6438d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly return sService.getState(); 6448d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly } catch (RemoteException e) { 6458d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly attemptDeadServiceRecovery(e); 6468d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly return NfcAdapter.STATE_OFF; 6478d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly } 6488d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly } 6498d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly 6508d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly /** 6517ea5c45e8d89f59065f088d4e11cceeeed9d64d1Nick Pelly * Enable NFC hardware. 6528d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly * 6538d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly * <p>This call is asynchronous. Listen for 6548d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly * {@link #ACTION_ADAPTER_STATE_CHANGED} broadcasts to find out when the 6558d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly * operation is complete. 6568d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly * 6578d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly * <p>If this returns true, then either NFC is already on, or 6588d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly * a {@link #ACTION_ADAPTER_STATE_CHANGED} broadcast will be sent 6598d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly * to indicate a state transition. If this returns false, then 6608d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly * there is some problem that prevents an attempt to turn 6618d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly * NFC on (for example we are in airplane mode and NFC is not 6628d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly * toggleable in airplane mode on this platform). 663afb082dba5232a45a7563e085f12284f7d5ffc1dBrad Fitzpatrick * 664590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly * @hide 665590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly */ 66629c2e3797a6c397fa7812bc4cf167a72dde28faaMartijn Coenen @SystemApi 6677ea5c45e8d89f59065f088d4e11cceeeed9d64d1Nick Pelly public boolean enable() { 668590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly try { 66950b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly return sService.enable(); 670590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly } catch (RemoteException e) { 6716d55e1342fc35c26dd97700ae791b34668266018Nick Pelly attemptDeadServiceRecovery(e); 672590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly return false; 673590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly } 674590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly } 675590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly 676590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly /** 6777ea5c45e8d89f59065f088d4e11cceeeed9d64d1Nick Pelly * Disable NFC hardware. 6788d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly * 6798d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly * <p>No NFC features will work after this call, and the hardware 6807ea5c45e8d89f59065f088d4e11cceeeed9d64d1Nick Pelly * will not perform or respond to any NFC communication. 6818d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly * 6828d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly * <p>This call is asynchronous. Listen for 6838d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly * {@link #ACTION_ADAPTER_STATE_CHANGED} broadcasts to find out when the 6848d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly * operation is complete. 6858d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly * 6868d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly * <p>If this returns true, then either NFC is already off, or 6878d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly * a {@link #ACTION_ADAPTER_STATE_CHANGED} broadcast will be sent 6888d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly * to indicate a state transition. If this returns false, then 6898d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly * there is some problem that prevents an attempt to turn 6908d32a01bd24b8a0d1a98f0581b3394a78fab8242Nick Pelly * NFC off. 691afb082dba5232a45a7563e085f12284f7d5ffc1dBrad Fitzpatrick * 692590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly * @hide 693590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly */ 69429c2e3797a6c397fa7812bc4cf167a72dde28faaMartijn Coenen @SystemApi 6957ea5c45e8d89f59065f088d4e11cceeeed9d64d1Nick Pelly public boolean disable() { 696590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly try { 6973bba8d0457408421a6468f03bbb36e9ff32b81cfSunil Jogi return sService.disable(true); 698590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly } catch (RemoteException e) { 6996d55e1342fc35c26dd97700ae791b34668266018Nick Pelly attemptDeadServiceRecovery(e); 700590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly return false; 701590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly } 702590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly } 7031d7e9062330a5a02247752de32a68ecbeba82783Nick Pelly 7042c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen /** 70556a3e67433fe1d6649c7665d58e913e784a0ea1cMartijn Coenen * Disable NFC hardware. 70656a3e67433fe1d6649c7665d58e913e784a0ea1cMartijn Coenen * @hide 70756a3e67433fe1d6649c7665d58e913e784a0ea1cMartijn Coenen */ 70856a3e67433fe1d6649c7665d58e913e784a0ea1cMartijn Coenen @SystemApi 70956a3e67433fe1d6649c7665d58e913e784a0ea1cMartijn Coenen public boolean disable(boolean persist) { 71056a3e67433fe1d6649c7665d58e913e784a0ea1cMartijn Coenen try { 71156a3e67433fe1d6649c7665d58e913e784a0ea1cMartijn Coenen return sService.disable(persist); 71256a3e67433fe1d6649c7665d58e913e784a0ea1cMartijn Coenen } catch (RemoteException e) { 71356a3e67433fe1d6649c7665d58e913e784a0ea1cMartijn Coenen attemptDeadServiceRecovery(e); 71456a3e67433fe1d6649c7665d58e913e784a0ea1cMartijn Coenen return false; 71556a3e67433fe1d6649c7665d58e913e784a0ea1cMartijn Coenen } 71656a3e67433fe1d6649c7665d58e913e784a0ea1cMartijn Coenen } 71756a3e67433fe1d6649c7665d58e913e784a0ea1cMartijn Coenen 71856a3e67433fe1d6649c7665d58e913e784a0ea1cMartijn Coenen /** 7199c4f400aac00b1cdc665bece0c1315fccaa86d8bAndres Morales * Pauses polling for a {@code timeoutInMs} millis. If polling must be resumed before timeout, 7209c4f400aac00b1cdc665bece0c1315fccaa86d8bAndres Morales * use {@link #resumePolling()}. 7219c4f400aac00b1cdc665bece0c1315fccaa86d8bAndres Morales * @hide 7229c4f400aac00b1cdc665bece0c1315fccaa86d8bAndres Morales */ 7239c4f400aac00b1cdc665bece0c1315fccaa86d8bAndres Morales public void pausePolling(int timeoutInMs) { 7249c4f400aac00b1cdc665bece0c1315fccaa86d8bAndres Morales try { 7259c4f400aac00b1cdc665bece0c1315fccaa86d8bAndres Morales sService.pausePolling(timeoutInMs); 7269c4f400aac00b1cdc665bece0c1315fccaa86d8bAndres Morales } catch (RemoteException e) { 7279c4f400aac00b1cdc665bece0c1315fccaa86d8bAndres Morales attemptDeadServiceRecovery(e); 7289c4f400aac00b1cdc665bece0c1315fccaa86d8bAndres Morales } 7299c4f400aac00b1cdc665bece0c1315fccaa86d8bAndres Morales } 7309c4f400aac00b1cdc665bece0c1315fccaa86d8bAndres Morales 7319c4f400aac00b1cdc665bece0c1315fccaa86d8bAndres Morales /** 7329c4f400aac00b1cdc665bece0c1315fccaa86d8bAndres Morales * Resumes default polling for the current device state if polling is paused. Calling 7339c4f400aac00b1cdc665bece0c1315fccaa86d8bAndres Morales * this while polling is not paused is a no-op. 7349c4f400aac00b1cdc665bece0c1315fccaa86d8bAndres Morales * 7359c4f400aac00b1cdc665bece0c1315fccaa86d8bAndres Morales * @hide 7369c4f400aac00b1cdc665bece0c1315fccaa86d8bAndres Morales */ 7379c4f400aac00b1cdc665bece0c1315fccaa86d8bAndres Morales public void resumePolling() { 7389c4f400aac00b1cdc665bece0c1315fccaa86d8bAndres Morales try { 7399c4f400aac00b1cdc665bece0c1315fccaa86d8bAndres Morales sService.resumePolling(); 7409c4f400aac00b1cdc665bece0c1315fccaa86d8bAndres Morales } catch (RemoteException e) { 7419c4f400aac00b1cdc665bece0c1315fccaa86d8bAndres Morales attemptDeadServiceRecovery(e); 7429c4f400aac00b1cdc665bece0c1315fccaa86d8bAndres Morales } 7439c4f400aac00b1cdc665bece0c1315fccaa86d8bAndres Morales } 7449c4f400aac00b1cdc665bece0c1315fccaa86d8bAndres Morales 7459c4f400aac00b1cdc665bece0c1315fccaa86d8bAndres Morales /** 7462c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * Set one or more {@link Uri}s to send using Android Beam (TM). Every 7472c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * Uri you provide must have either scheme 'file' or scheme 'content'. 7482c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * 7492c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * <p>For the data provided through this method, Android Beam tries to 7502c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * switch to alternate transports such as Bluetooth to achieve a fast 7512c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * transfer speed. Hence this method is very suitable 7522c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * for transferring large files such as pictures or songs. 7532c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * 7542c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * <p>The receiving side will store the content of each Uri in 7552c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * a file and present a notification to the user to open the file 7562c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * with a {@link android.content.Intent} with action 7572c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * {@link android.content.Intent#ACTION_VIEW}. 7582c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * If multiple URIs are sent, the {@link android.content.Intent} will refer 7592c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * to the first of the stored files. 7602c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * 7612c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * <p>This method may be called at any time before {@link Activity#onDestroy}, 7622c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * but the URI(s) are only made available for Android Beam when the 7632c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * specified activity(s) are in resumed (foreground) state. The recommended 7642c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * approach is to call this method during your Activity's 7652c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * {@link Activity#onCreate} - see sample 7662c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * code below. This method does not immediately perform any I/O or blocking work, 7672c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * so is safe to call on your main thread. 7682c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * 7692c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * <p>{@link #setBeamPushUris} and {@link #setBeamPushUrisCallback} 7702c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * have priority over both {@link #setNdefPushMessage} and 7712c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * {@link #setNdefPushMessageCallback}. 7722c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * 7732c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * <p>If {@link #setBeamPushUris} is called with a null Uri array, 7742c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * and/or {@link #setBeamPushUrisCallback} is called with a null callback, 7752c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * then the Uri push will be completely disabled for the specified activity(s). 7762c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * 7772c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * <p>Code example: 7782c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * <pre> 7792c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * protected void onCreate(Bundle savedInstanceState) { 7802c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * super.onCreate(savedInstanceState); 7812c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this); 7822c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * if (nfcAdapter == null) return; // NFC not available on this device 7832c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * nfcAdapter.setBeamPushUris(new Uri[] {uri1, uri2}, this); 78497e0a1c6f3b7ab8f0796931182f0343dd7e73782Scott Main * }</pre> 7852c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * And that is it. Only one call per activity is necessary. The Android 7862c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * OS will automatically release its references to the Uri(s) and the 7872c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * Activity object when it is destroyed if you follow this pattern. 7882c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * 7892c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * <p>If your Activity wants to dynamically supply Uri(s), 7902c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * then set a callback using {@link #setBeamPushUrisCallback} instead 7912c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * of using this method. 7922c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * 7932c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * <p class="note">Do not pass in an Activity that has already been through 7942c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * {@link Activity#onDestroy}. This is guaranteed if you call this API 7952c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * during {@link Activity#onCreate}. 7962c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * 7973b6ecf0ec1a6822577450908f46496cbe121202eMartijn Coenen * <p class="note">If this device does not support alternate transports 7983b6ecf0ec1a6822577450908f46496cbe121202eMartijn Coenen * such as Bluetooth or WiFI, calling this method does nothing. 7993b6ecf0ec1a6822577450908f46496cbe121202eMartijn Coenen * 8002c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * <p class="note">Requires the {@link android.Manifest.permission#NFC} permission. 8012c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * 8022c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * @param uris an array of Uri(s) to push over Android Beam 8032c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * @param activity activity for which the Uri(s) will be pushed 8042c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen */ 80520e8dd9f9e7cff63c83e36a1761538a04c224cc1Martijn Coenen public void setBeamPushUris(Uri[] uris, Activity activity) { 80620e8dd9f9e7cff63c83e36a1761538a04c224cc1Martijn Coenen if (activity == null) { 80720e8dd9f9e7cff63c83e36a1761538a04c224cc1Martijn Coenen throw new NullPointerException("activity cannot be null"); 80820e8dd9f9e7cff63c83e36a1761538a04c224cc1Martijn Coenen } 8092c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen if (uris != null) { 8102c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen for (Uri uri : uris) { 8112c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen if (uri == null) throw new NullPointerException("Uri not " + 8122c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen "allowed to be null"); 8132c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen String scheme = uri.getScheme(); 8142c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen if (scheme == null || (!scheme.equalsIgnoreCase("file") && 8152c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen !scheme.equalsIgnoreCase("content"))) { 8162c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen throw new IllegalArgumentException("URI needs to have " + 8172c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen "either scheme file or scheme content"); 8182c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen } 8192c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen } 8202c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen } 82120e8dd9f9e7cff63c83e36a1761538a04c224cc1Martijn Coenen mNfcActivityManager.setNdefPushContentUri(activity, uris); 82220e8dd9f9e7cff63c83e36a1761538a04c224cc1Martijn Coenen } 82320e8dd9f9e7cff63c83e36a1761538a04c224cc1Martijn Coenen 8242c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen /** 8252c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * Set a callback that will dynamically generate one or more {@link Uri}s 8262c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * to send using Android Beam (TM). Every Uri the callback provides 8272c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * must have either scheme 'file' or scheme 'content'. 8282c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * 8292c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * <p>For the data provided through this callback, Android Beam tries to 8302c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * switch to alternate transports such as Bluetooth to achieve a fast 8312c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * transfer speed. Hence this method is very suitable 8322c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * for transferring large files such as pictures or songs. 8332c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * 8342c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * <p>The receiving side will store the content of each Uri in 8352c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * a file and present a notification to the user to open the file 8362c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * with a {@link android.content.Intent} with action 8372c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * {@link android.content.Intent#ACTION_VIEW}. 8382c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * If multiple URIs are sent, the {@link android.content.Intent} will refer 8392c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * to the first of the stored files. 8402c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * 8412c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * <p>This method may be called at any time before {@link Activity#onDestroy}, 8422c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * but the URI(s) are only made available for Android Beam when the 8432c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * specified activity(s) are in resumed (foreground) state. The recommended 8442c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * approach is to call this method during your Activity's 8452c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * {@link Activity#onCreate} - see sample 8462c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * code below. This method does not immediately perform any I/O or blocking work, 8472c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * so is safe to call on your main thread. 8482c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * 8492c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * <p>{@link #setBeamPushUris} and {@link #setBeamPushUrisCallback} 8502c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * have priority over both {@link #setNdefPushMessage} and 8512c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * {@link #setNdefPushMessageCallback}. 8522c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * 8532c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * <p>If {@link #setBeamPushUris} is called with a null Uri array, 8542c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * and/or {@link #setBeamPushUrisCallback} is called with a null callback, 8552c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * then the Uri push will be completely disabled for the specified activity(s). 8562c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * 8572c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * <p>Code example: 8582c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * <pre> 8592c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * protected void onCreate(Bundle savedInstanceState) { 8602c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * super.onCreate(savedInstanceState); 8612c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this); 8622c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * if (nfcAdapter == null) return; // NFC not available on this device 8632c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * nfcAdapter.setBeamPushUrisCallback(callback, this); 86497e0a1c6f3b7ab8f0796931182f0343dd7e73782Scott Main * }</pre> 8652c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * And that is it. Only one call per activity is necessary. The Android 8662c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * OS will automatically release its references to the Uri(s) and the 8672c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * Activity object when it is destroyed if you follow this pattern. 8682c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * 8692c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * <p class="note">Do not pass in an Activity that has already been through 8702c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * {@link Activity#onDestroy}. This is guaranteed if you call this API 8712c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * during {@link Activity#onCreate}. 8722c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * 8733b6ecf0ec1a6822577450908f46496cbe121202eMartijn Coenen * <p class="note">If this device does not support alternate transports 8743b6ecf0ec1a6822577450908f46496cbe121202eMartijn Coenen * such as Bluetooth or WiFI, calling this method does nothing. 8753b6ecf0ec1a6822577450908f46496cbe121202eMartijn Coenen * 8762c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * <p class="note">Requires the {@link android.Manifest.permission#NFC} permission. 8772c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * 8782c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * @param callback callback, or null to disable 8792c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * @param activity activity for which the Uri(s) will be pushed 8802c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen */ 88120e8dd9f9e7cff63c83e36a1761538a04c224cc1Martijn Coenen public void setBeamPushUrisCallback(CreateBeamUrisCallback callback, Activity activity) { 8821d7e9062330a5a02247752de32a68ecbeba82783Nick Pelly if (activity == null) { 8831d7e9062330a5a02247752de32a68ecbeba82783Nick Pelly throw new NullPointerException("activity cannot be null"); 8841d7e9062330a5a02247752de32a68ecbeba82783Nick Pelly } 88520e8dd9f9e7cff63c83e36a1761538a04c224cc1Martijn Coenen mNfcActivityManager.setNdefPushContentUriCallback(activity, callback); 8861d7e9062330a5a02247752de32a68ecbeba82783Nick Pelly } 887590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly 88852d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton /** 8898ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * Set a static {@link NdefMessage} to send using Android Beam (TM). 890c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * 8918ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * <p>This method may be called at any time before {@link Activity#onDestroy}, 8928ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * but the NDEF message is only made available for NDEF push when the 8938ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * specified activity(s) are in resumed (foreground) state. The recommended 8948ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * approach is to call this method during your Activity's 8958ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * {@link Activity#onCreate} - see sample 8968ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * code below. This method does not immediately perform any I/O or blocking work, 8978ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * so is safe to call on your main thread. 898c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * 899c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * <p>Only one NDEF message can be pushed by the currently resumed activity. 900c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * If both {@link #setNdefPushMessage} and 9018ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * {@link #setNdefPushMessageCallback} are set, then 902c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * the callback will take priority. 903c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * 9048ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * <p>If neither {@link #setNdefPushMessage} or 9058ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * {@link #setNdefPushMessageCallback} have been called for your activity, then 9068ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * the Android OS may choose to send a default NDEF message on your behalf, 9078ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * such as a URI for your application. 908c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * 9098ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * <p>If {@link #setNdefPushMessage} is called with a null NDEF message, 9108ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * and/or {@link #setNdefPushMessageCallback} is called with a null callback, 9118ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * then NDEF push will be completely disabled for the specified activity(s). 9128ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * This also disables any default NDEF message the Android OS would have 913854e077555ce5b606c6a688dd5fd0594be02b9f8Martijn Coenen * otherwise sent on your behalf for those activity(s). 914854e077555ce5b606c6a688dd5fd0594be02b9f8Martijn Coenen * 915854e077555ce5b606c6a688dd5fd0594be02b9f8Martijn Coenen * <p>If you want to prevent the Android OS from sending default NDEF 916854e077555ce5b606c6a688dd5fd0594be02b9f8Martijn Coenen * messages completely (for all activities), you can include a 91797e0a1c6f3b7ab8f0796931182f0343dd7e73782Scott Main * {@code <meta-data>} element inside the {@code <application>} 918854e077555ce5b606c6a688dd5fd0594be02b9f8Martijn Coenen * element of your AndroidManifest.xml file, like this: 91997e0a1c6f3b7ab8f0796931182f0343dd7e73782Scott Main * <pre> 92097e0a1c6f3b7ab8f0796931182f0343dd7e73782Scott Main * <application ...> 92197e0a1c6f3b7ab8f0796931182f0343dd7e73782Scott Main * <meta-data android:name="android.nfc.disable_beam_default" 92297e0a1c6f3b7ab8f0796931182f0343dd7e73782Scott Main * android:value="true" /> 92397e0a1c6f3b7ab8f0796931182f0343dd7e73782Scott Main * </application></pre> 9248ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * 9258ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * <p>The API allows for multiple activities to be specified at a time, 9268ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * but it is strongly recommended to just register one at a time, 9278ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * and to do so during the activity's {@link Activity#onCreate}. For example: 9288ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * <pre> 9298ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * protected void onCreate(Bundle savedInstanceState) { 9308ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * super.onCreate(savedInstanceState); 9318ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this); 9328ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * if (nfcAdapter == null) return; // NFC not available on this device 9338ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * nfcAdapter.setNdefPushMessage(ndefMessage, this); 93497e0a1c6f3b7ab8f0796931182f0343dd7e73782Scott Main * }</pre> 9358ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * And that is it. Only one call per activity is necessary. The Android 9368ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * OS will automatically release its references to the NDEF message and the 9378ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * Activity object when it is destroyed if you follow this pattern. 9388ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * 9398ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * <p>If your Activity wants to dynamically generate an NDEF message, 9408ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * then set a callback using {@link #setNdefPushMessageCallback} instead 9418ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * of a static message. 9428ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * 9438ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * <p class="note">Do not pass in an Activity that has already been through 9448ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * {@link Activity#onDestroy}. This is guaranteed if you call this API 9458ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * during {@link Activity#onCreate}. 94682328bfd40008d85917cc01a1b2eb8eed1f23ec4Nick Pelly * 9472c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * <p class="note">For sending large content such as pictures and songs, 9482c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * consider using {@link #setBeamPushUris}, which switches to alternate transports 9492c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * such as Bluetooth to achieve a fast transfer rate. 9502c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * 951c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * <p class="note">Requires the {@link android.Manifest.permission#NFC} permission. 952c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * 953c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * @param message NDEF message to push over NFC, or null to disable 9548ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * @param activity activity for which the NDEF message will be pushed 9558ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * @param activities optional additional activities, however we strongly recommend 9568ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * to only register one at a time, and to do so in that activity's 9578ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * {@link Activity#onCreate} 958c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly */ 95982328bfd40008d85917cc01a1b2eb8eed1f23ec4Nick Pelly public void setNdefPushMessage(NdefMessage message, Activity activity, 96082328bfd40008d85917cc01a1b2eb8eed1f23ec4Nick Pelly Activity ... activities) { 9618ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly int targetSdkVersion = getSdkVersion(); 9628ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly try { 9638ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly if (activity == null) { 9648ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly throw new NullPointerException("activity cannot be null"); 9658ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly } 9661fa2aff21bc4cb89a141828c2661530e6aa655ddMartijn Coenen mNfcActivityManager.setNdefPushMessage(activity, message, 0); 9678ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly for (Activity a : activities) { 9688ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly if (a == null) { 9698ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly throw new NullPointerException("activities cannot contain null"); 9708ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly } 9711fa2aff21bc4cb89a141828c2661530e6aa655ddMartijn Coenen mNfcActivityManager.setNdefPushMessage(a, message, 0); 9728ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly } 9738ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly } catch (IllegalStateException e) { 9748ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly if (targetSdkVersion < android.os.Build.VERSION_CODES.JELLY_BEAN) { 9758ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly // Less strict on old applications - just log the error 9768ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly Log.e(TAG, "Cannot call API with Activity that has already " + 9778ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly "been destroyed", e); 9788ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly } else { 9798ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly // Prevent new applications from making this mistake, re-throw 9808ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly throw(e); 98182328bfd40008d85917cc01a1b2eb8eed1f23ec4Nick Pelly } 982c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly } 983c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly } 984c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly 985c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly /** 9861fa2aff21bc4cb89a141828c2661530e6aa655ddMartijn Coenen * @hide 9871fa2aff21bc4cb89a141828c2661530e6aa655ddMartijn Coenen */ 98829c2e3797a6c397fa7812bc4cf167a72dde28faaMartijn Coenen @SystemApi 9891fa2aff21bc4cb89a141828c2661530e6aa655ddMartijn Coenen public void setNdefPushMessage(NdefMessage message, Activity activity, int flags) { 9901fa2aff21bc4cb89a141828c2661530e6aa655ddMartijn Coenen if (activity == null) { 9911fa2aff21bc4cb89a141828c2661530e6aa655ddMartijn Coenen throw new NullPointerException("activity cannot be null"); 9921fa2aff21bc4cb89a141828c2661530e6aa655ddMartijn Coenen } 9931fa2aff21bc4cb89a141828c2661530e6aa655ddMartijn Coenen mNfcActivityManager.setNdefPushMessage(activity, message, flags); 9941fa2aff21bc4cb89a141828c2661530e6aa655ddMartijn Coenen } 9951fa2aff21bc4cb89a141828c2661530e6aa655ddMartijn Coenen 9961fa2aff21bc4cb89a141828c2661530e6aa655ddMartijn Coenen /** 9978ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * Set a callback that dynamically generates NDEF messages to send using Android Beam (TM). 998c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * 9998ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * <p>This method may be called at any time before {@link Activity#onDestroy}, 10008ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * but the NDEF message callback can only occur when the 10018ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * specified activity(s) are in resumed (foreground) state. The recommended 10028ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * approach is to call this method during your Activity's 10038ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * {@link Activity#onCreate} - see sample 10048ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * code below. This method does not immediately perform any I/O or blocking work, 10058ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * so is safe to call on your main thread. 1006c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * 1007c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * <p>Only one NDEF message can be pushed by the currently resumed activity. 1008c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * If both {@link #setNdefPushMessage} and 10098ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * {@link #setNdefPushMessageCallback} are set, then 1010c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * the callback will take priority. 1011c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * 10128ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * <p>If neither {@link #setNdefPushMessage} or 10138ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * {@link #setNdefPushMessageCallback} have been called for your activity, then 10148ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * the Android OS may choose to send a default NDEF message on your behalf, 10158ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * such as a URI for your application. 1016c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * 10178ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * <p>If {@link #setNdefPushMessage} is called with a null NDEF message, 10188ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * and/or {@link #setNdefPushMessageCallback} is called with a null callback, 10198ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * then NDEF push will be completely disabled for the specified activity(s). 10208ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * This also disables any default NDEF message the Android OS would have 1021854e077555ce5b606c6a688dd5fd0594be02b9f8Martijn Coenen * otherwise sent on your behalf for those activity(s). 1022854e077555ce5b606c6a688dd5fd0594be02b9f8Martijn Coenen * 1023854e077555ce5b606c6a688dd5fd0594be02b9f8Martijn Coenen * <p>If you want to prevent the Android OS from sending default NDEF 1024854e077555ce5b606c6a688dd5fd0594be02b9f8Martijn Coenen * messages completely (for all activities), you can include a 102597e0a1c6f3b7ab8f0796931182f0343dd7e73782Scott Main * {@code <meta-data>} element inside the {@code <application>} 1026854e077555ce5b606c6a688dd5fd0594be02b9f8Martijn Coenen * element of your AndroidManifest.xml file, like this: 102797e0a1c6f3b7ab8f0796931182f0343dd7e73782Scott Main * <pre> 102897e0a1c6f3b7ab8f0796931182f0343dd7e73782Scott Main * <application ...> 102997e0a1c6f3b7ab8f0796931182f0343dd7e73782Scott Main * <meta-data android:name="android.nfc.disable_beam_default" 103097e0a1c6f3b7ab8f0796931182f0343dd7e73782Scott Main * android:value="true" /> 103197e0a1c6f3b7ab8f0796931182f0343dd7e73782Scott Main * </application></pre> 10328ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * 10338ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * <p>The API allows for multiple activities to be specified at a time, 10348ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * but it is strongly recommended to just register one at a time, 10358ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * and to do so during the activity's {@link Activity#onCreate}. For example: 10368ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * <pre> 10378ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * protected void onCreate(Bundle savedInstanceState) { 10388ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * super.onCreate(savedInstanceState); 10398ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this); 10408ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * if (nfcAdapter == null) return; // NFC not available on this device 10418ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * nfcAdapter.setNdefPushMessageCallback(callback, this); 104297e0a1c6f3b7ab8f0796931182f0343dd7e73782Scott Main * }</pre> 10438ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * And that is it. Only one call per activity is necessary. The Android 10448ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * OS will automatically release its references to the callback and the 10458ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * Activity object when it is destroyed if you follow this pattern. 10468ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * 10478ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * <p class="note">Do not pass in an Activity that has already been through 10488ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * {@link Activity#onDestroy}. This is guaranteed if you call this API 10498ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * during {@link Activity#onCreate}. 10502c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * <p class="note">For sending large content such as pictures and songs, 10512c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * consider using {@link #setBeamPushUris}, which switches to alternate transports 10522c10311a01a9414a8efcedb267a45289a1617888Martijn Coenen * such as Bluetooth to achieve a fast transfer rate. 1053c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * <p class="note">Requires the {@link android.Manifest.permission#NFC} permission. 1054c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * 1055c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * @param callback callback, or null to disable 10568ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * @param activity activity for which the NDEF message will be pushed 10578ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * @param activities optional additional activities, however we strongly recommend 10588ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * to only register one at a time, and to do so in that activity's 10598ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * {@link Activity#onCreate} 1060c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly */ 106182328bfd40008d85917cc01a1b2eb8eed1f23ec4Nick Pelly public void setNdefPushMessageCallback(CreateNdefMessageCallback callback, Activity activity, 1062c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly Activity ... activities) { 10638ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly int targetSdkVersion = getSdkVersion(); 10648ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly try { 10658ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly if (activity == null) { 10668ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly throw new NullPointerException("activity cannot be null"); 10678ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly } 10681fa2aff21bc4cb89a141828c2661530e6aa655ddMartijn Coenen mNfcActivityManager.setNdefPushMessageCallback(activity, callback, 0); 10698ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly for (Activity a : activities) { 10708ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly if (a == null) { 10718ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly throw new NullPointerException("activities cannot contain null"); 10728ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly } 10731fa2aff21bc4cb89a141828c2661530e6aa655ddMartijn Coenen mNfcActivityManager.setNdefPushMessageCallback(a, callback, 0); 10748ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly } 10758ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly } catch (IllegalStateException e) { 10768ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly if (targetSdkVersion < android.os.Build.VERSION_CODES.JELLY_BEAN) { 10778ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly // Less strict on old applications - just log the error 10788ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly Log.e(TAG, "Cannot call API with Activity that has already " + 10798ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly "been destroyed", e); 10808ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly } else { 10818ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly // Prevent new applications from making this mistake, re-throw 10828ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly throw(e); 108382328bfd40008d85917cc01a1b2eb8eed1f23ec4Nick Pelly } 1084c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly } 1085c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly } 1086c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly 1087c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly /** 10881fa2aff21bc4cb89a141828c2661530e6aa655ddMartijn Coenen * @hide 10891fa2aff21bc4cb89a141828c2661530e6aa655ddMartijn Coenen */ 10901fa2aff21bc4cb89a141828c2661530e6aa655ddMartijn Coenen public void setNdefPushMessageCallback(CreateNdefMessageCallback callback, Activity activity, 10911fa2aff21bc4cb89a141828c2661530e6aa655ddMartijn Coenen int flags) { 10921fa2aff21bc4cb89a141828c2661530e6aa655ddMartijn Coenen if (activity == null) { 10931fa2aff21bc4cb89a141828c2661530e6aa655ddMartijn Coenen throw new NullPointerException("activity cannot be null"); 10941fa2aff21bc4cb89a141828c2661530e6aa655ddMartijn Coenen } 10951fa2aff21bc4cb89a141828c2661530e6aa655ddMartijn Coenen mNfcActivityManager.setNdefPushMessageCallback(activity, callback, flags); 10961fa2aff21bc4cb89a141828c2661530e6aa655ddMartijn Coenen } 10971fa2aff21bc4cb89a141828c2661530e6aa655ddMartijn Coenen 10981fa2aff21bc4cb89a141828c2661530e6aa655ddMartijn Coenen /** 10998ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * Set a callback on successful Android Beam (TM). 11008ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * 11018ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * <p>This method may be called at any time before {@link Activity#onDestroy}, 11028ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * but the callback can only occur when the 11038ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * specified activity(s) are in resumed (foreground) state. The recommended 11048ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * approach is to call this method during your Activity's 11058ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * {@link Activity#onCreate} - see sample 11068ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * code below. This method does not immediately perform any I/O or blocking work, 11078ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * so is safe to call on your main thread. 11088ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * 11098ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * <p>The API allows for multiple activities to be specified at a time, 11108ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * but it is strongly recommended to just register one at a time, 11118ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * and to do so during the activity's {@link Activity#onCreate}. For example: 11128ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * <pre> 11138ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * protected void onCreate(Bundle savedInstanceState) { 11148ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * super.onCreate(savedInstanceState); 11158ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this); 11168ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * if (nfcAdapter == null) return; // NFC not available on this device 11178ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * nfcAdapter.setOnNdefPushCompleteCallback(callback, this); 111897e0a1c6f3b7ab8f0796931182f0343dd7e73782Scott Main * }</pre> 11198ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * And that is it. Only one call per activity is necessary. The Android 11208ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * OS will automatically release its references to the callback and the 11218ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * Activity object when it is destroyed if you follow this pattern. 1122c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * 11238ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * <p class="note">Do not pass in an Activity that has already been through 11248ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * {@link Activity#onDestroy}. This is guaranteed if you call this API 11258ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * during {@link Activity#onCreate}. 112682328bfd40008d85917cc01a1b2eb8eed1f23ec4Nick Pelly * 1127c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * <p class="note">Requires the {@link android.Manifest.permission#NFC} permission. 1128c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * 1129c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * @param callback callback, or null to disable 11308ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * @param activity activity for which the NDEF message will be pushed 11318ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * @param activities optional additional activities, however we strongly recommend 11328ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * to only register one at a time, and to do so in that activity's 11338ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly * {@link Activity#onCreate} 1134c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly */ 1135c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly public void setOnNdefPushCompleteCallback(OnNdefPushCompleteCallback callback, 113682328bfd40008d85917cc01a1b2eb8eed1f23ec4Nick Pelly Activity activity, Activity ... activities) { 11378ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly int targetSdkVersion = getSdkVersion(); 11388ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly try { 11398ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly if (activity == null) { 11408ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly throw new NullPointerException("activity cannot be null"); 11418ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly } 11428ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly mNfcActivityManager.setOnNdefPushCompleteCallback(activity, callback); 11438ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly for (Activity a : activities) { 11448ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly if (a == null) { 11458ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly throw new NullPointerException("activities cannot contain null"); 11468ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly } 11478ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly mNfcActivityManager.setOnNdefPushCompleteCallback(a, callback); 11488ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly } 11498ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly } catch (IllegalStateException e) { 11508ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly if (targetSdkVersion < android.os.Build.VERSION_CODES.JELLY_BEAN) { 11518ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly // Less strict on old applications - just log the error 11528ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly Log.e(TAG, "Cannot call API with Activity that has already " + 11538ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly "been destroyed", e); 11548ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly } else { 11558ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly // Prevent new applications from making this mistake, re-throw 11568ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly throw(e); 115782328bfd40008d85917cc01a1b2eb8eed1f23ec4Nick Pelly } 1158c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly } 1159c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly } 1160c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly 1161c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly /** 116274fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * Enable foreground dispatch to the given Activity. 116374fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * 116474fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * <p>This will give give priority to the foreground activity when 116574fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * dispatching a discovered {@link Tag} to an application. 116674fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * 1167167d9e473f9240d452b25218625c326f31eebbaaJeff Hamilton * <p>If any IntentFilters are provided to this method they are used to match dispatch Intents 1168167d9e473f9240d452b25218625c326f31eebbaaJeff Hamilton * for both the {@link NfcAdapter#ACTION_NDEF_DISCOVERED} and 1169167d9e473f9240d452b25218625c326f31eebbaaJeff Hamilton * {@link NfcAdapter#ACTION_TAG_DISCOVERED}. Since {@link NfcAdapter#ACTION_TECH_DISCOVERED} 1170167d9e473f9240d452b25218625c326f31eebbaaJeff Hamilton * relies on meta data outside of the IntentFilter matching for that dispatch Intent is handled 1171167d9e473f9240d452b25218625c326f31eebbaaJeff Hamilton * by passing in the tech lists separately. Each first level entry in the tech list represents 1172167d9e473f9240d452b25218625c326f31eebbaaJeff Hamilton * an array of technologies that must all be present to match. If any of the first level sets 1173167d9e473f9240d452b25218625c326f31eebbaaJeff Hamilton * match then the dispatch is routed through the given PendingIntent. In other words, the second 1174167d9e473f9240d452b25218625c326f31eebbaaJeff Hamilton * level is ANDed together and the first level entries are ORed together. 117574fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * 1176167d9e473f9240d452b25218625c326f31eebbaaJeff Hamilton * <p>If you pass {@code null} for both the {@code filters} and {@code techLists} parameters 1177167d9e473f9240d452b25218625c326f31eebbaaJeff Hamilton * that acts a wild card and will cause the foreground activity to receive all tags via the 1178167d9e473f9240d452b25218625c326f31eebbaaJeff Hamilton * {@link NfcAdapter#ACTION_TAG_DISCOVERED} intent. 117952d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton * 1180167d9e473f9240d452b25218625c326f31eebbaaJeff Hamilton * <p>This method must be called from the main thread, and only when the activity is in the 1181167d9e473f9240d452b25218625c326f31eebbaaJeff Hamilton * foreground (resumed). Also, activities must call {@link #disableForegroundDispatch} before 1182167d9e473f9240d452b25218625c326f31eebbaaJeff Hamilton * the completion of their {@link Activity#onPause} callback to disable foreground dispatch 1183167d9e473f9240d452b25218625c326f31eebbaaJeff Hamilton * after it has been enabled. 118452d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton * 118539cf3a445e507f219ecc8a476f6038f095d9d520Nick Pelly * <p class="note">Requires the {@link android.Manifest.permission#NFC} permission. 118639cf3a445e507f219ecc8a476f6038f095d9d520Nick Pelly * 118752d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton * @param activity the Activity to dispatch to 118852d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton * @param intent the PendingIntent to start for the dispatch 11899f20cd7ff26548e98d7b8412807720c7b340133dJeff Hamilton * @param filters the IntentFilters to override dispatching for, or null to always dispatch 1190167d9e473f9240d452b25218625c326f31eebbaaJeff Hamilton * @param techLists the tech lists used to perform matching for dispatching of the 1191167d9e473f9240d452b25218625c326f31eebbaaJeff Hamilton * {@link NfcAdapter#ACTION_TECH_DISCOVERED} intent 119274fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * @throws IllegalStateException if the Activity is not currently in the foreground 119352d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton */ 119452d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton public void enableForegroundDispatch(Activity activity, PendingIntent intent, 1195d88e9aa575eb3a9d20cdb0e8918d54993e1ce1e0Jeff Hamilton IntentFilter[] filters, String[][] techLists) { 11969f20cd7ff26548e98d7b8412807720c7b340133dJeff Hamilton if (activity == null || intent == null) { 119752d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton throw new NullPointerException(); 119852d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton } 119952d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton if (!activity.isResumed()) { 1200c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly throw new IllegalStateException("Foreground dispatch can only be enabled " + 120152d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton "when your activity is resumed"); 120252d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton } 120352d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton try { 1204d88e9aa575eb3a9d20cdb0e8918d54993e1ce1e0Jeff Hamilton TechListParcel parcel = null; 1205d88e9aa575eb3a9d20cdb0e8918d54993e1ce1e0Jeff Hamilton if (techLists != null && techLists.length > 0) { 1206d88e9aa575eb3a9d20cdb0e8918d54993e1ce1e0Jeff Hamilton parcel = new TechListParcel(techLists); 1207d88e9aa575eb3a9d20cdb0e8918d54993e1ce1e0Jeff Hamilton } 120852d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton ActivityThread.currentActivityThread().registerOnActivityPausedListener(activity, 1209ce3224cda51f946871daa1e11e3976e25c59e6faJeff Hamilton mForegroundDispatchListener); 1210c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly sService.setForegroundDispatch(intent, filters, parcel); 121152d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton } catch (RemoteException e) { 121252d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton attemptDeadServiceRecovery(e); 121352d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton } 121452d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton } 121552d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton 121652d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton /** 121774fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * Disable foreground dispatch to the given activity. 121833ff2405581271adf14ed4e45597a3b0b80a46abJeff Hamilton * 121974fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * <p>After calling {@link #enableForegroundDispatch}, an activity 122074fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * must call this method before its {@link Activity#onPause} callback 122174fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * completes. 122252d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton * 122333ff2405581271adf14ed4e45597a3b0b80a46abJeff Hamilton * <p>This method must be called from the main thread. 122474fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * 122539cf3a445e507f219ecc8a476f6038f095d9d520Nick Pelly * <p class="note">Requires the {@link android.Manifest.permission#NFC} permission. 122639cf3a445e507f219ecc8a476f6038f095d9d520Nick Pelly * 122774fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * @param activity the Activity to disable dispatch to 122874fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * @throws IllegalStateException if the Activity has already been paused 122952d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton */ 123052d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton public void disableForegroundDispatch(Activity activity) { 1231ce3224cda51f946871daa1e11e3976e25c59e6faJeff Hamilton ActivityThread.currentActivityThread().unregisterOnActivityPausedListener(activity, 1232ce3224cda51f946871daa1e11e3976e25c59e6faJeff Hamilton mForegroundDispatchListener); 123352d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton disableForegroundDispatchInternal(activity, false); 123452d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton } 123552d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton 1236ce3224cda51f946871daa1e11e3976e25c59e6faJeff Hamilton OnActivityPausedListener mForegroundDispatchListener = new OnActivityPausedListener() { 123733ff2405581271adf14ed4e45597a3b0b80a46abJeff Hamilton @Override 123833ff2405581271adf14ed4e45597a3b0b80a46abJeff Hamilton public void onPaused(Activity activity) { 123933ff2405581271adf14ed4e45597a3b0b80a46abJeff Hamilton disableForegroundDispatchInternal(activity, true); 124033ff2405581271adf14ed4e45597a3b0b80a46abJeff Hamilton } 1241ce3224cda51f946871daa1e11e3976e25c59e6faJeff Hamilton }; 124233ff2405581271adf14ed4e45597a3b0b80a46abJeff Hamilton 124352d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton void disableForegroundDispatchInternal(Activity activity, boolean force) { 124452d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton try { 1245c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly sService.setForegroundDispatch(null, null, null); 124652d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton if (!force && !activity.isResumed()) { 1247c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly throw new IllegalStateException("You must disable foreground dispatching " + 124852d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton "while your activity is still resumed"); 124952d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton } 125052d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton } catch (RemoteException e) { 125152d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton attemptDeadServiceRecovery(e); 125233ff2405581271adf14ed4e45597a3b0b80a46abJeff Hamilton } 125333ff2405581271adf14ed4e45597a3b0b80a46abJeff Hamilton } 125433ff2405581271adf14ed4e45597a3b0b80a46abJeff Hamilton 125533ff2405581271adf14ed4e45597a3b0b80a46abJeff Hamilton /** 1256c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen * Limit the NFC controller to reader mode while this Activity is in the foreground. 1257c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen * 1258c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen * <p>In this mode the NFC controller will only act as an NFC tag reader/writer, 1259c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen * thus disabling any peer-to-peer (Android Beam) and card-emulation modes of 1260c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen * the NFC adapter on this device. 1261c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen * 1262c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen * <p>Use {@link #FLAG_READER_SKIP_NDEF_CHECK} to prevent the platform from 1263c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen * performing any NDEF checks in reader mode. Note that this will prevent the 1264c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen * {@link Ndef} tag technology from being enumerated on the tag, and that 1265c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen * NDEF-based tag dispatch will not be functional. 1266c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen * 1267c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen * <p>For interacting with tags that are emulated on another Android device 1268c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen * using Android's host-based card-emulation, the recommended flags are 1269c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen * {@link #FLAG_READER_NFC_A} and {@link #FLAG_READER_SKIP_NDEF_CHECK}. 1270c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen * 1271c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen * @param activity the Activity that requests the adapter to be in reader mode 12725b1e032ea7c06ab11d778264dd950009fcb93cc5Martijn Coenen * @param callback the callback to be called when a tag is discovered 1273c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen * @param flags Flags indicating poll technologies and other optional parameters 12745b1e032ea7c06ab11d778264dd950009fcb93cc5Martijn Coenen * @param extras Additional extras for configuring reader mode. 1275c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen */ 12765b1e032ea7c06ab11d778264dd950009fcb93cc5Martijn Coenen public void enableReaderMode(Activity activity, ReaderCallback callback, int flags, 12775b1e032ea7c06ab11d778264dd950009fcb93cc5Martijn Coenen Bundle extras) { 12785b1e032ea7c06ab11d778264dd950009fcb93cc5Martijn Coenen mNfcActivityManager.enableReaderMode(activity, callback, flags, extras); 1279c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen } 1280c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen 1281c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen /** 1282c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen * Restore the NFC adapter to normal mode of operation: supporting 1283c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen * peer-to-peer (Android Beam), card emulation, and polling for 1284c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen * all supported tag technologies. 1285c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen * 1286c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen * @param activity the Activity that currently has reader mode enabled 1287c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen */ 1288c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen public void disableReaderMode(Activity activity) { 1289c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen mNfcActivityManager.disableReaderMode(activity); 1290c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen } 1291c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen 1292c20ed2ff125fd23bed25df8172bf24db84c5a352Martijn Coenen /** 12937fe9fa163ccd2ec34cbf533be4422aa66356431fMartijn Coenen * Manually invoke Android Beam to share data. 12947fe9fa163ccd2ec34cbf533be4422aa66356431fMartijn Coenen * 12957fe9fa163ccd2ec34cbf533be4422aa66356431fMartijn Coenen * <p>The Android Beam animation is normally only shown when two NFC-capable 12967fe9fa163ccd2ec34cbf533be4422aa66356431fMartijn Coenen * devices come into range. 12977fe9fa163ccd2ec34cbf533be4422aa66356431fMartijn Coenen * By calling this method, an Activity can invoke the Beam animation directly 12987fe9fa163ccd2ec34cbf533be4422aa66356431fMartijn Coenen * even if no other NFC device is in range yet. The Beam animation will then 12997fe9fa163ccd2ec34cbf533be4422aa66356431fMartijn Coenen * prompt the user to tap another NFC-capable device to complete the data 13007fe9fa163ccd2ec34cbf533be4422aa66356431fMartijn Coenen * transfer. 13017fe9fa163ccd2ec34cbf533be4422aa66356431fMartijn Coenen * 13027fe9fa163ccd2ec34cbf533be4422aa66356431fMartijn Coenen * <p>The main advantage of using this method is that it avoids the need for the 13037fe9fa163ccd2ec34cbf533be4422aa66356431fMartijn Coenen * user to tap the screen to complete the transfer, as this method already 13047fe9fa163ccd2ec34cbf533be4422aa66356431fMartijn Coenen * establishes the direction of the transfer and the consent of the user to 13057fe9fa163ccd2ec34cbf533be4422aa66356431fMartijn Coenen * share data. Callers are responsible for making sure that the user has 13067fe9fa163ccd2ec34cbf533be4422aa66356431fMartijn Coenen * consented to sharing data on NFC tap. 13077fe9fa163ccd2ec34cbf533be4422aa66356431fMartijn Coenen * 13087fe9fa163ccd2ec34cbf533be4422aa66356431fMartijn Coenen * <p>Note that to use this method, the passed in Activity must have already 13097fe9fa163ccd2ec34cbf533be4422aa66356431fMartijn Coenen * set data to share over Beam by using method calls such as 13106924c4ef8db3ffd80b35f2b736b7ea9577148e9eMartijn Coenen * {@link #setNdefPushMessageCallback} or 13116924c4ef8db3ffd80b35f2b736b7ea9577148e9eMartijn Coenen * {@link #setBeamPushUrisCallback}. 13127fe9fa163ccd2ec34cbf533be4422aa66356431fMartijn Coenen * 13137fe9fa163ccd2ec34cbf533be4422aa66356431fMartijn Coenen * @param activity the current foreground Activity that has registered data to share 13147fe9fa163ccd2ec34cbf533be4422aa66356431fMartijn Coenen * @return whether the Beam animation was successfully invoked 13157fe9fa163ccd2ec34cbf533be4422aa66356431fMartijn Coenen */ 13167fe9fa163ccd2ec34cbf533be4422aa66356431fMartijn Coenen public boolean invokeBeam(Activity activity) { 13177fe9fa163ccd2ec34cbf533be4422aa66356431fMartijn Coenen if (activity == null) { 13187fe9fa163ccd2ec34cbf533be4422aa66356431fMartijn Coenen throw new NullPointerException("activity may not be null."); 13197fe9fa163ccd2ec34cbf533be4422aa66356431fMartijn Coenen } 13207fe9fa163ccd2ec34cbf533be4422aa66356431fMartijn Coenen enforceResumed(activity); 13217fe9fa163ccd2ec34cbf533be4422aa66356431fMartijn Coenen try { 13227fe9fa163ccd2ec34cbf533be4422aa66356431fMartijn Coenen sService.invokeBeam(); 13237fe9fa163ccd2ec34cbf533be4422aa66356431fMartijn Coenen return true; 13247fe9fa163ccd2ec34cbf533be4422aa66356431fMartijn Coenen } catch (RemoteException e) { 13257fe9fa163ccd2ec34cbf533be4422aa66356431fMartijn Coenen Log.e(TAG, "invokeBeam: NFC process has died."); 13267fe9fa163ccd2ec34cbf533be4422aa66356431fMartijn Coenen attemptDeadServiceRecovery(e); 13277fe9fa163ccd2ec34cbf533be4422aa66356431fMartijn Coenen return false; 13287fe9fa163ccd2ec34cbf533be4422aa66356431fMartijn Coenen } 13297fe9fa163ccd2ec34cbf533be4422aa66356431fMartijn Coenen } 13307fe9fa163ccd2ec34cbf533be4422aa66356431fMartijn Coenen 13317fe9fa163ccd2ec34cbf533be4422aa66356431fMartijn Coenen /** 1332dbedb4cc0f6c64705c16396bdd34445dd8191cadMartijn Coenen * @hide 1333dbedb4cc0f6c64705c16396bdd34445dd8191cadMartijn Coenen */ 1334dbedb4cc0f6c64705c16396bdd34445dd8191cadMartijn Coenen public boolean invokeBeam(BeamShareData shareData) { 1335dbedb4cc0f6c64705c16396bdd34445dd8191cadMartijn Coenen try { 1336dbedb4cc0f6c64705c16396bdd34445dd8191cadMartijn Coenen Log.e(TAG, "invokeBeamInternal()"); 1337dbedb4cc0f6c64705c16396bdd34445dd8191cadMartijn Coenen sService.invokeBeamInternal(shareData); 1338dbedb4cc0f6c64705c16396bdd34445dd8191cadMartijn Coenen return true; 1339dbedb4cc0f6c64705c16396bdd34445dd8191cadMartijn Coenen } catch (RemoteException e) { 1340dbedb4cc0f6c64705c16396bdd34445dd8191cadMartijn Coenen Log.e(TAG, "invokeBeam: NFC process has died."); 1341dbedb4cc0f6c64705c16396bdd34445dd8191cadMartijn Coenen attemptDeadServiceRecovery(e); 1342dbedb4cc0f6c64705c16396bdd34445dd8191cadMartijn Coenen return false; 1343dbedb4cc0f6c64705c16396bdd34445dd8191cadMartijn Coenen } 1344dbedb4cc0f6c64705c16396bdd34445dd8191cadMartijn Coenen } 1345dbedb4cc0f6c64705c16396bdd34445dd8191cadMartijn Coenen 1346dbedb4cc0f6c64705c16396bdd34445dd8191cadMartijn Coenen /** 1347c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * Enable NDEF message push over NFC while this Activity is in the foreground. 134874fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * 1349c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * <p>You must explicitly call this method every time the activity is 1350c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * resumed, and you must call {@link #disableForegroundNdefPush} before 1351c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * your activity completes {@link Activity#onPause}. 13529f20cd7ff26548e98d7b8412807720c7b340133dJeff Hamilton * 1353c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * <p>Strongly recommend to use the new {@link #setNdefPushMessage} 1354c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * instead: it automatically hooks into your activity life-cycle, 1355c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * so you do not need to call enable/disable in your onResume/onPause. 135674fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * 1357c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * <p>For NDEF push to function properly the other NFC device must 1358c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * support either NFC Forum's SNEP (Simple Ndef Exchange Protocol), or 1359c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * Android's "com.android.npp" (Ndef Push Protocol). This was optional 1360c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * on Gingerbread level Android NFC devices, but SNEP is mandatory on 1361c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * Ice-Cream-Sandwich and beyond. 136201425365a85e605139f612502f68954cad869e5bJason parks * 136301425365a85e605139f612502f68954cad869e5bJason parks * <p>This method must be called from the main thread. 136401425365a85e605139f612502f68954cad869e5bJason parks * 136501425365a85e605139f612502f68954cad869e5bJason parks * <p class="note">Requires the {@link android.Manifest.permission#NFC} permission. 136601425365a85e605139f612502f68954cad869e5bJason parks * 1367c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * @param activity foreground activity 1368c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * @param message a NDEF Message to push over NFC 1369c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * @throws IllegalStateException if the activity is not currently in the foreground 1370c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * @deprecated use {@link #setNdefPushMessage} instead 137101425365a85e605139f612502f68954cad869e5bJason parks */ 1372c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly @Deprecated 1373c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly public void enableForegroundNdefPush(Activity activity, NdefMessage message) { 1374c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly if (activity == null || message == null) { 137501425365a85e605139f612502f68954cad869e5bJason parks throw new NullPointerException(); 137601425365a85e605139f612502f68954cad869e5bJason parks } 1377c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly enforceResumed(activity); 13781fa2aff21bc4cb89a141828c2661530e6aa655ddMartijn Coenen mNfcActivityManager.setNdefPushMessage(activity, message, 0); 137901425365a85e605139f612502f68954cad869e5bJason parks } 138001425365a85e605139f612502f68954cad869e5bJason parks 138101425365a85e605139f612502f68954cad869e5bJason parks /** 138274fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * Disable NDEF message push over P2P. 138333ff2405581271adf14ed4e45597a3b0b80a46abJeff Hamilton * 138474fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * <p>After calling {@link #enableForegroundNdefPush}, an activity 138574fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * must call this method before its {@link Activity#onPause} callback 138674fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * completes. 138733ff2405581271adf14ed4e45597a3b0b80a46abJeff Hamilton * 1388c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * <p>Strongly recommend to use the new {@link #setNdefPushMessage} 1389c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * instead: it automatically hooks into your activity life-cycle, 1390c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * so you do not need to call enable/disable in your onResume/onPause. 1391c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * 139233ff2405581271adf14ed4e45597a3b0b80a46abJeff Hamilton * <p>This method must be called from the main thread. 139374fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * 139439cf3a445e507f219ecc8a476f6038f095d9d520Nick Pelly * <p class="note">Requires the {@link android.Manifest.permission#NFC} permission. 139539cf3a445e507f219ecc8a476f6038f095d9d520Nick Pelly * 139674fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * @param activity the Foreground activity 139774fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * @throws IllegalStateException if the Activity has already been paused 1398c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * @deprecated use {@link #setNdefPushMessage} instead 139933ff2405581271adf14ed4e45597a3b0b80a46abJeff Hamilton */ 1400c97a552023c3c71079b39092e80c9b44f25a789bNick Pelly @Deprecated 1401ce3224cda51f946871daa1e11e3976e25c59e6faJeff Hamilton public void disableForegroundNdefPush(Activity activity) { 1402c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly if (activity == null) { 1403c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly throw new NullPointerException(); 1404c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly } 1405c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly enforceResumed(activity); 14061fa2aff21bc4cb89a141828c2661530e6aa655ddMartijn Coenen mNfcActivityManager.setNdefPushMessage(activity, null, 0); 14071fa2aff21bc4cb89a141828c2661530e6aa655ddMartijn Coenen mNfcActivityManager.setNdefPushMessageCallback(activity, null, 0); 1408c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly mNfcActivityManager.setOnNdefPushCompleteCallback(activity, null); 140933ff2405581271adf14ed4e45597a3b0b80a46abJeff Hamilton } 141033ff2405581271adf14ed4e45597a3b0b80a46abJeff Hamilton 1411c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly /** 1412c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * Enable NDEF Push feature. 1413c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * <p>This API is for the Settings application. 14146d7489407995210f3f01690d1f0c8b970362d8aeMartijn Coenen * @hide 14156d7489407995210f3f01690d1f0c8b970362d8aeMartijn Coenen */ 141629c2e3797a6c397fa7812bc4cf167a72dde28faaMartijn Coenen @SystemApi 1417c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly public boolean enableNdefPush() { 14186d7489407995210f3f01690d1f0c8b970362d8aeMartijn Coenen try { 1419c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly return sService.enableNdefPush(); 14206d7489407995210f3f01690d1f0c8b970362d8aeMartijn Coenen } catch (RemoteException e) { 14216d7489407995210f3f01690d1f0c8b970362d8aeMartijn Coenen attemptDeadServiceRecovery(e); 14226d7489407995210f3f01690d1f0c8b970362d8aeMartijn Coenen return false; 14236d7489407995210f3f01690d1f0c8b970362d8aeMartijn Coenen } 14246d7489407995210f3f01690d1f0c8b970362d8aeMartijn Coenen } 14256d7489407995210f3f01690d1f0c8b970362d8aeMartijn Coenen 14266d7489407995210f3f01690d1f0c8b970362d8aeMartijn Coenen /** 1427c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * Disable NDEF Push feature. 1428c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * <p>This API is for the Settings application. 14296d7489407995210f3f01690d1f0c8b970362d8aeMartijn Coenen * @hide 14306d7489407995210f3f01690d1f0c8b970362d8aeMartijn Coenen */ 143129c2e3797a6c397fa7812bc4cf167a72dde28faaMartijn Coenen @SystemApi 1432c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly public boolean disableNdefPush() { 14336d7489407995210f3f01690d1f0c8b970362d8aeMartijn Coenen try { 1434c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly return sService.disableNdefPush(); 14356d7489407995210f3f01690d1f0c8b970362d8aeMartijn Coenen } catch (RemoteException e) { 14366d7489407995210f3f01690d1f0c8b970362d8aeMartijn Coenen attemptDeadServiceRecovery(e); 14376d7489407995210f3f01690d1f0c8b970362d8aeMartijn Coenen return false; 14386d7489407995210f3f01690d1f0c8b970362d8aeMartijn Coenen } 14396d7489407995210f3f01690d1f0c8b970362d8aeMartijn Coenen } 14406d7489407995210f3f01690d1f0c8b970362d8aeMartijn Coenen 14416d7489407995210f3f01690d1f0c8b970362d8aeMartijn Coenen /** 1442cccf01d3e270bbf53ae6601698109ac4ef461076Nick Pelly * Return true if the NDEF Push (Android Beam) feature is enabled. 1443cccf01d3e270bbf53ae6601698109ac4ef461076Nick Pelly * <p>This function will return true only if both NFC is enabled, and the 1444cccf01d3e270bbf53ae6601698109ac4ef461076Nick Pelly * NDEF Push feature is enabled. 1445cccf01d3e270bbf53ae6601698109ac4ef461076Nick Pelly * <p>Note that if NFC is enabled but NDEF Push is disabled then this 1446cccf01d3e270bbf53ae6601698109ac4ef461076Nick Pelly * device can still <i>receive</i> NDEF messages, it just cannot send them. 1447cccf01d3e270bbf53ae6601698109ac4ef461076Nick Pelly * <p>Applications cannot directly toggle the NDEF Push feature, but they 1448cccf01d3e270bbf53ae6601698109ac4ef461076Nick Pelly * can request Settings UI allowing the user to toggle NDEF Push using 1449cccf01d3e270bbf53ae6601698109ac4ef461076Nick Pelly * <code>startActivity(new Intent(Settings.ACTION_NFCSHARING_SETTINGS))</code> 1450cccf01d3e270bbf53ae6601698109ac4ef461076Nick Pelly * <p>Example usage in an Activity that requires NDEF Push: 1451cccf01d3e270bbf53ae6601698109ac4ef461076Nick Pelly * <p><pre> 1452cccf01d3e270bbf53ae6601698109ac4ef461076Nick Pelly * protected void onResume() { 1453cccf01d3e270bbf53ae6601698109ac4ef461076Nick Pelly * super.onResume(); 1454cccf01d3e270bbf53ae6601698109ac4ef461076Nick Pelly * if (!nfcAdapter.isEnabled()) { 1455cccf01d3e270bbf53ae6601698109ac4ef461076Nick Pelly * startActivity(new Intent(Settings.ACTION_NFC_SETTINGS)); 1456cccf01d3e270bbf53ae6601698109ac4ef461076Nick Pelly * } else if (!nfcAdapter.isNdefPushEnabled()) { 1457cccf01d3e270bbf53ae6601698109ac4ef461076Nick Pelly * startActivity(new Intent(Settings.ACTION_NFCSHARING_SETTINGS)); 1458cccf01d3e270bbf53ae6601698109ac4ef461076Nick Pelly * } 145997e0a1c6f3b7ab8f0796931182f0343dd7e73782Scott Main * }</pre> 14606d7489407995210f3f01690d1f0c8b970362d8aeMartijn Coenen * 1461cccf01d3e270bbf53ae6601698109ac4ef461076Nick Pelly * @see android.provider.Settings#ACTION_NFCSHARING_SETTINGS 1462c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly * @return true if NDEF Push feature is enabled 14636d7489407995210f3f01690d1f0c8b970362d8aeMartijn Coenen */ 1464c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly public boolean isNdefPushEnabled() { 14656d7489407995210f3f01690d1f0c8b970362d8aeMartijn Coenen try { 1466c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly return sService.isNdefPushEnabled(); 14676d7489407995210f3f01690d1f0c8b970362d8aeMartijn Coenen } catch (RemoteException e) { 14686d7489407995210f3f01690d1f0c8b970362d8aeMartijn Coenen attemptDeadServiceRecovery(e); 14696d7489407995210f3f01690d1f0c8b970362d8aeMartijn Coenen return false; 14706d7489407995210f3f01690d1f0c8b970362d8aeMartijn Coenen } 14716d7489407995210f3f01690d1f0c8b970362d8aeMartijn Coenen } 14726d7489407995210f3f01690d1f0c8b970362d8aeMartijn Coenen 14736d7489407995210f3f01690d1f0c8b970362d8aeMartijn Coenen /** 1474c97a552023c3c71079b39092e80c9b44f25a789bNick Pelly * Inject a mock NFC tag.<p> 1475c97a552023c3c71079b39092e80c9b44f25a789bNick Pelly * Used for testing purposes. 1476c97a552023c3c71079b39092e80c9b44f25a789bNick Pelly * <p class="note">Requires the 1477c97a552023c3c71079b39092e80c9b44f25a789bNick Pelly * {@link android.Manifest.permission#WRITE_SECURE_SETTINGS} permission. 1478c97a552023c3c71079b39092e80c9b44f25a789bNick Pelly * @hide 1479c97a552023c3c71079b39092e80c9b44f25a789bNick Pelly */ 14801f5badc1cb08f10ddf4b09aaaf34060a23999a51Nick Pelly public void dispatch(Tag tag) { 1481c97a552023c3c71079b39092e80c9b44f25a789bNick Pelly if (tag == null) { 1482c97a552023c3c71079b39092e80c9b44f25a789bNick Pelly throw new NullPointerException("tag cannot be null"); 1483c97a552023c3c71079b39092e80c9b44f25a789bNick Pelly } 1484c97a552023c3c71079b39092e80c9b44f25a789bNick Pelly try { 14851f5badc1cb08f10ddf4b09aaaf34060a23999a51Nick Pelly sService.dispatch(tag); 1486c97a552023c3c71079b39092e80c9b44f25a789bNick Pelly } catch (RemoteException e) { 1487c97a552023c3c71079b39092e80c9b44f25a789bNick Pelly attemptDeadServiceRecovery(e); 1488c97a552023c3c71079b39092e80c9b44f25a789bNick Pelly } 1489c97a552023c3c71079b39092e80c9b44f25a789bNick Pelly } 1490c97a552023c3c71079b39092e80c9b44f25a789bNick Pelly 1491c97a552023c3c71079b39092e80c9b44f25a789bNick Pelly /** 14929024564107b58955f7bd257cab6fc6dfcb2e5ec2Daniel Tomas * @hide 14939024564107b58955f7bd257cab6fc6dfcb2e5ec2Daniel Tomas */ 1494188cddb1d8c89749618401e371a7e7900cb58d6dMartijn Coenen public void setP2pModes(int initiatorModes, int targetModes) { 1495188cddb1d8c89749618401e371a7e7900cb58d6dMartijn Coenen try { 1496188cddb1d8c89749618401e371a7e7900cb58d6dMartijn Coenen sService.setP2pModes(initiatorModes, targetModes); 1497188cddb1d8c89749618401e371a7e7900cb58d6dMartijn Coenen } catch (RemoteException e) { 1498188cddb1d8c89749618401e371a7e7900cb58d6dMartijn Coenen attemptDeadServiceRecovery(e); 1499188cddb1d8c89749618401e371a7e7900cb58d6dMartijn Coenen } 1500188cddb1d8c89749618401e371a7e7900cb58d6dMartijn Coenen } 1501188cddb1d8c89749618401e371a7e7900cb58d6dMartijn Coenen 150211d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales /** 150311d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales * Registers a new NFC unlock handler with the NFC service. 150411d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales * 150511d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales * <p />NFC unlock handlers are intended to unlock the keyguard in the presence of a trusted 150611d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales * NFC device. The handler should return true if it successfully authenticates the user and 150711d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales * unlocks the keyguard. 150811d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales * 150911d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales * <p /> The parameter {@code tagTechnologies} determines which Tag technologies will be polled for 151011d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales * at the lockscreen. Polling for less tag technologies reduces latency, and so it is 151111d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales * strongly recommended to only provide the Tag technologies that the handler is expected to 1512f9a97942e1b530cb87a8d7b28551889bc438a744Andres Morales * receive. There must be at least one tag technology provided, otherwise the unlock handler 1513f9a97942e1b530cb87a8d7b28551889bc438a744Andres Morales * is ignored. 151411d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales * 151511d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales * @hide 151611d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales */ 151711d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales @SystemApi 151811d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales public boolean addNfcUnlockHandler(final NfcUnlockHandler unlockHandler, 151911d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales String[] tagTechnologies) { 1520f9a97942e1b530cb87a8d7b28551889bc438a744Andres Morales // If there are no tag technologies, don't bother adding unlock handler 1521f9a97942e1b530cb87a8d7b28551889bc438a744Andres Morales if (tagTechnologies.length == 0) { 1522f9a97942e1b530cb87a8d7b28551889bc438a744Andres Morales return false; 1523f9a97942e1b530cb87a8d7b28551889bc438a744Andres Morales } 152411d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales 1525f9a97942e1b530cb87a8d7b28551889bc438a744Andres Morales try { 152611d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales synchronized (mLock) { 152711d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales if (mNfcUnlockHandlers.containsKey(unlockHandler)) { 1528f9a97942e1b530cb87a8d7b28551889bc438a744Andres Morales // update the tag technologies 1529f9a97942e1b530cb87a8d7b28551889bc438a744Andres Morales sService.removeNfcUnlockHandler(mNfcUnlockHandlers.get(unlockHandler)); 1530f9a97942e1b530cb87a8d7b28551889bc438a744Andres Morales mNfcUnlockHandlers.remove(unlockHandler); 153111d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales } 1532f9a97942e1b530cb87a8d7b28551889bc438a744Andres Morales 1533f9a97942e1b530cb87a8d7b28551889bc438a744Andres Morales INfcUnlockHandler.Stub iHandler = new INfcUnlockHandler.Stub() { 1534f9a97942e1b530cb87a8d7b28551889bc438a744Andres Morales @Override 1535f9a97942e1b530cb87a8d7b28551889bc438a744Andres Morales public boolean onUnlockAttempted(Tag tag) throws RemoteException { 1536f9a97942e1b530cb87a8d7b28551889bc438a744Andres Morales return unlockHandler.onUnlockAttempted(tag); 1537f9a97942e1b530cb87a8d7b28551889bc438a744Andres Morales } 1538f9a97942e1b530cb87a8d7b28551889bc438a744Andres Morales }; 1539f9a97942e1b530cb87a8d7b28551889bc438a744Andres Morales 1540f9a97942e1b530cb87a8d7b28551889bc438a744Andres Morales sService.addNfcUnlockHandler(iHandler, 1541f9a97942e1b530cb87a8d7b28551889bc438a744Andres Morales Tag.getTechCodesFromStrings(tagTechnologies)); 1542f9a97942e1b530cb87a8d7b28551889bc438a744Andres Morales mNfcUnlockHandlers.put(unlockHandler, iHandler); 154311d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales } 15443b33fd283c32a8fb707a23d25f3f3cf13e8b046fAndres Morales } catch (RemoteException e) { 15453b33fd283c32a8fb707a23d25f3f3cf13e8b046fAndres Morales attemptDeadServiceRecovery(e); 15463b33fd283c32a8fb707a23d25f3f3cf13e8b046fAndres Morales return false; 1547d8cf53f87d1416613aa34cfb28f5042033e3299cAndres Morales } catch (IllegalArgumentException e) { 1548d8cf53f87d1416613aa34cfb28f5042033e3299cAndres Morales Log.e(TAG, "Unable to register LockscreenDispatch", e); 1549d8cf53f87d1416613aa34cfb28f5042033e3299cAndres Morales return false; 15503b33fd283c32a8fb707a23d25f3f3cf13e8b046fAndres Morales } 15513b33fd283c32a8fb707a23d25f3f3cf13e8b046fAndres Morales 15523b33fd283c32a8fb707a23d25f3f3cf13e8b046fAndres Morales return true; 15533b33fd283c32a8fb707a23d25f3f3cf13e8b046fAndres Morales } 15543b33fd283c32a8fb707a23d25f3f3cf13e8b046fAndres Morales 1555188cddb1d8c89749618401e371a7e7900cb58d6dMartijn Coenen /** 155611d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales * Removes a previously registered unlock handler. Also removes the tag technologies 155711d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales * associated with the removed unlock handler. 155811d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales * 155911d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales * @hide 156011d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales */ 156111d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales @SystemApi 156211d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales public boolean removeNfcUnlockHandler(NfcUnlockHandler unlockHandler) { 156311d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales try { 156411d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales synchronized (mLock) { 156511d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales if (mNfcUnlockHandlers.containsKey(unlockHandler)) { 1566f9a97942e1b530cb87a8d7b28551889bc438a744Andres Morales sService.removeNfcUnlockHandler(mNfcUnlockHandlers.remove(unlockHandler)); 156711d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales } 156811d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales 156911d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales return true; 157011d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales } 157111d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales } catch (RemoteException e) { 157211d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales attemptDeadServiceRecovery(e); 157311d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales return false; 157411d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales } 157511d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales } 157611d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales 157711d2e53dc0d2682f66f8dcbd8f0ad52432cb4aa7Andres Morales /** 1578188cddb1d8c89749618401e371a7e7900cb58d6dMartijn Coenen * @hide 1579188cddb1d8c89749618401e371a7e7900cb58d6dMartijn Coenen */ 1580367f41f8f61126c2ab34a34cc676756a9fc23ac2Nick Pelly public INfcAdapterExtras getNfcAdapterExtrasInterface() { 1581bb951c893973691554f49d2e725985125f866b27Jeff Hamilton if (mContext == null) { 1582bb951c893973691554f49d2e725985125f866b27Jeff Hamilton throw new UnsupportedOperationException("You need a context on NfcAdapter to use the " 1583bb951c893973691554f49d2e725985125f866b27Jeff Hamilton + " NFC extras APIs"); 1584bb951c893973691554f49d2e725985125f866b27Jeff Hamilton } 15859024564107b58955f7bd257cab6fc6dfcb2e5ec2Daniel Tomas try { 1586bb951c893973691554f49d2e725985125f866b27Jeff Hamilton return sService.getNfcAdapterExtrasInterface(mContext.getPackageName()); 15879024564107b58955f7bd257cab6fc6dfcb2e5ec2Daniel Tomas } catch (RemoteException e) { 1588367f41f8f61126c2ab34a34cc676756a9fc23ac2Nick Pelly attemptDeadServiceRecovery(e); 15899024564107b58955f7bd257cab6fc6dfcb2e5ec2Daniel Tomas return null; 15909024564107b58955f7bd257cab6fc6dfcb2e5ec2Daniel Tomas } 15919024564107b58955f7bd257cab6fc6dfcb2e5ec2Daniel Tomas } 1592c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly 1593c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly void enforceResumed(Activity activity) { 1594c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly if (!activity.isResumed()) { 1595c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly throw new IllegalStateException("API cannot be called while activity is paused"); 1596c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly } 1597c84c89a6cacaf16c1ba41f57cc1aecdb150e85f9Nick Pelly } 15988ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly 15998ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly int getSdkVersion() { 16008ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly if (mContext == null) { 16018ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly return android.os.Build.VERSION_CODES.GINGERBREAD; // best guess 16028ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly } else { 16038ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly return mContext.getApplicationInfo().targetSdkVersion; 16048ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly } 16058ce7a27770735791b5c38e4128f4ab9cee86bc43Nick Pelly } 1606590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly} 1607