Android44_NFC

本文深入探讨NFC(近场通信)技术的基础知识,重点介绍如何在安卓系统中开发利用NFC的APP。文章讲解了NFC标记的读写原理,包括NDEF数据格式,以及如何通过NFC过滤器实现APP对NFC标记的响应。同时,介绍了NFC前台调度技术和NFCAdapter的使用方法。

 NFC (近场通信)。

NFC 科技代表近场通信,你可以在 NFC 论坛上找到 NFC 的详细信息。在本文中,我们将分析 NFC 的一些基础知识,并且我们还将描述如何在安卓系统中实现一个利用 NFC 的 APP(应用程序)。

如果你想做 NFC 实验,那么你在几个网站上花费几欧元就能买到 NFC 。

NFC 可以用于不同的情景:在家中时,我们可以使用它来打开 WiFi 或者执行一些任务操作等等。

本文中,我们将注意力集中在 NDEF 数据,它是一种特殊类型的 NFC 标记。不过,在使用 NFC 之前,我们必须遵循一些基本步骤。

NFC 过滤器

当我们使用 NFC 标记时,我们要做的第一件事就是,当我们接近一个 NFC 标记的时候,我们的 APP 可以收到通知。为了实现这个目的,我们需要使用一个意图过滤器。安卓 SDK 中提供了三种不同的过滤器,我们可以以不同的优先级来使用它们:

ACTION_NDEF_DISCOVERED

ACTION_TECH_DISCOVERED

ACTION_TAG_DISCOVERED

我们重点关注 ACTION_NDEF_DISCOVERED,它拥有最高的优先级。正如前面所说的,我们的目的是,当智能手机接近一个 NFC 标记时能够收到通知,并且如果我们只安装了这一个 APP,并且它能够处理这个 NFC 标记,那么我们希望该 APP 能够立即开始处理。为了实现这一点,我们在 Manifest.xml 中注册过滤器:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="com.survivingwithandroid.nfc">

....

<intent-filter>

<action android:name="android.nfc.action.NDEF_DISCOVERED"/>

<category android:name="android.intent.category.DEFAULT"/>

<data android:mimeType="text/plain"/>

</intent-filter>

<manifest>

在第 6 行,我们注册了 APP,以使得它可以收到 ACTION_NDEF_DISCOVERED 通知。我们使用不同类型的过滤器,在这个例子中(第 8 行)我们使用了 mine 类型。换句话说,当发现一个 NFC 标记 NDEF 并且它的 mine 类型为“text/plain”时,我们的 APP 将会启动。其实,我们可以使用几种 mine 类型来过滤,而不仅仅是 text/plain。此外,我们还能以协议或一个字符串模式来使用其他类型的过滤器(如 android:scheme)来过滤。

NFC 前台调度

如果我们的 APP 没处于前台,就会开始意图过滤。如果我们的应用程序运行在前台,那么当我们的智能手机移动到一个 NFC 标记时,它将不会收到通知。在这种情况下,我们必须使用一种称为NFC前台调度的技术。第一步是,在我们的代码中定义意图过滤器(正如我们在 Manifest.xml 中做的那样):

@Override

protectedvoidonCreate(Bundle savedInstanceState){

...

Intent nfcIntent=newIntent(this,getClass());

nfcIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

nfcPendingIntent=

PendingIntent.getActivity(this,0,nfcIntent,0);

IntentFilter tagIntentFilter=

newIntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);

try{

tagIntentFilter.addDataType("text/plain");

intentFiltersArray=newIntentFilter[]{tagIntentFilter};

}

catch(Throwablet){

t.printStackTrace();

}

}

现在,我们必须注册我们的过滤器,在 onResume 方法中以这种方式实现它:

protectedvoidonResume(){

super.onResume();

nfcAdpt.enableForegroundDispatch(

this,

nfcPendingIntent,

intentFiltersArray,

null);

handleIntent(getIntent());

}

此外,也应该记住,只要 APP 退回到后台,我们就应该关闭前台调度,而要实现这一点,最好的地方是在 onPause 方法中。

@Override

protectedvoidonPause(){

super.onPause();

nfcAdpt.disableForegroundDispatch(this);

}

其中,nfcAdpt 是 NFC 适配器。

使用 NFCAdapter 处理 NFC

一旦我们创建了过滤器,我们必须与智能手机中的 NFC 组件交互。为此,我们使用安卓 SDK 提供的 NfcAdapter。使用这个类,我们能够检测智能手机是否支持 NFC,或者 NFC 功能是否开启或关闭。

@Override

protectedvoidonCreate(Bundle savedInstanceState){

...

nfcAdpt=NfcAdapter.getDefaultAdapter(this);

// Check if the smartphone has NFC

if(nfcAdpt==null){

Toast.makeText(this,"NFC not supported",Toast.LENGTH_LONG).show();

finish();

}

// Check if NFC is enabled

if(!nfcAdpt.isEnabled()){

Toast.makeText(this,"Enable NFC before using the app",Toast.LENGTH_LONG).show();

}

}

NFC 数据:负载

既然我们知道了如何处理 NFC 标记,接着我们就想读取标记内容。在 NFC 说明文档中,定义了几种类型的内容:

NFC Forum well-known type

Media-type

Absolute URI

NFC Forum external type

每种类型都有它自己的有效负载。一般来说,一个 NFC NDEF 数据由一条信息组成,一条信息可以包含一个或多个记录,每个记录由一个头和一个负载(真正的信息)组成。现在,如果我们想读取 NFC NDEF 标记中的数据,我们可以使用下面的代码:

@Override

publicvoidonNewIntent(Intent intent){

Log.d("Nfc","New intent");

getTag(intent);

}

privatevoidgetTag(Intenti){

if(i==null)

return;

Stringtype=i.getType();

Stringaction=i.getAction();

List dataList=newArrayList();

if(NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)){

Log.d("Nfc","Action NDEF Found");

Parcelable[]parcs=i.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);

for(Parcelablep:parcs){

recNumberTxt.setText(String.valueOf(numRec));

NdefRecord[]records=msg.getRecords();

for(NdefRecord record:records){

shorttnf=record.getTnf();

// Here we handle the payload

}

}

}

}

### Makefile 中 ifeq 条件判断与变量赋值逻辑解析 Makefile 是一种用于自动化构建的工具,其中 `ifeq` 是一种条件判断语句,用于在构建过程中根据条件执行不同的操作。以下是关于 `ifeq` 语法和变量赋值逻辑的详细解析。 #### 1. `ifeq` 语法解析 `ifeq` 是 Makefile 中的一种条件语句,用于比较两个字符串是否相等。其基本语法如下: ```makefile ifeq (arg1, arg2) # 如果 arg1 和 arg2 相等,则执行这里的命令 endif ``` 或 ```makefile ifeq ($(var1),$(var2)) # 如果 var1 和 var2 的值相等,则执行这里的命令 endif ``` 在评估 `ifeq` 条件时,Makefile 会逐字记录所有参数,包括空格和换行符。如果用户希望将这些空白字符作为测试的一部分,则需要确保这些空白字符被正确保留[^2]。 #### 2. 变量赋值逻辑 在 Makefile 中,变量可以通过多种方式进行赋值,常见的有以下几种方式: - **简单赋值 (`=`)**:变量在第一次赋值后会被立即计算,并且后续对该变量的引用都会使用其计算后的值。 ```makefile TARGET_FWK_SUPPORTS_FULL_VALUEADDS = true ``` - **递归赋值 (`:=`)**:变量在赋值时会被立即计算,但其值不会包含任何未展开的变量。 ```makefile TARGET_USES_QSSI_NQ_NFC := false ``` - **条件赋值 (`?=`)**:仅当变量尚未定义时才进行赋值。 ```makefile NQ_SYSTEM_NFC ?= true ``` - **追加赋值 (`+=`)**:向已有的变量值追加内容。 ```makefile PRODUCT_PACKAGES += NFCApp ``` #### 3. 示例分析 以下是一个结合 `ifeq` 和变量赋值的完整示例: ```makefile TARGET_FWK_SUPPORTS_FULL_VALUEADDS = true TARGET_USES_QSSI_NQ_NFC := false NQ_SYSTEM_NFC ?= true ifeq ($(TARGET_FWK_SUPPORTS_FULL_VALUEADDS),true) PRODUCT_PACKAGES += FullValueAddsPackage endif ifeq ($(TARGET_USES_QSSI_NQ_NFC),false) PRODUCT_PACKAGES += QssiNqNfcPackage endif ifeq ($(NQ_SYSTEM_NFC),true) PRODUCT_PACKAGES += SystemNfcPackage endif ``` 在上述示例中: - 如果 `TARGET_FWK_SUPPORTS_FULL_VALUEADDS` 的值为 `true`,则将 `FullValueAddsPackage` 添加到 `PRODUCT_PACKAGES` 中。 - 如果 `TARGET_USES_QSSI_NQ_NFC` 的值为 `false`,则将 `QssiNqNfcPackage` 添加到 `PRODUCT_PACKAGES` 中。 - 如果 `NQ_SYSTEM_NFC` 的值为 `true`,则将 `SystemNfcPackage` 添加到 `PRODUCT_PACKAGES` 中。 #### 4. 错误处理与调试 在某些情况下,可能需要对变量是否存在或是否为空进行检查。例如: ```makefile ifeq ($(strip $(KBUILD_OUTPUT)),) $(error output directory "$(saved-output)" does not exist) endif ``` 上述代码片段中,`strip` 函数用于去除变量中的多余空格,如果 `KBUILD_OUTPUT` 为空,则触发错误提示[^3]。 #### 5. 注意事项 - 在 `ifeq` 条件中,字符串比较是严格区分大小写的。 - 空白字符(如空格、制表符)会影响条件判断的结果,因此需要特别注意。 - 使用 `$(error ...)` 可以在条件不满足时终止构建并输出错误信息。 ### 总结 通过合理使用 `ifeq` 条件语句和变量赋值逻辑,可以灵活地控制 Makefile 的构建行为。在实际应用中,建议对变量的值进行充分验证,以避免因空值或错误值导致的构建失败。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值