android - 如果附近没有可读/可写设备,如何激活 NFC?

标签 android nfc nfc-p2p android-beam open-nfc

对于一个工程项目,我基本上需要欺骗我的手机,使其退出 NFC 搜索模式并进入手机不断释放能量的模式。显然我已经在设置中激活了 NFC,但我可以让它离开搜索模式并让它持续输出能量的唯一方法是将它放在空白标签上。

我正在考虑实现这个NFC beam函数:public boolean invokeBeam(Activity Activity )并将其植入到Android studio中提供的BeamLargeFiles示例代码中,贴在下面。

我是应用程序开发的新手(虽然我有相当多的编码经验)所以我不确定它是否可行,或者我是否正在寻找正确的地方。任何想法、想法和帮助都将不胜感激!

package com.example.android.beamlargefiles;

import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.FragmentTransaction;
import android.text.Html;
import android.widget.TextView;
import android.view.Menu;

import com.example.android.common.activities.SampleActivityBase;
import com.example.android.common.logger.Log;
import com.example.android.common.logger.LogFragment;
import com.example.android.common.logger.LogWrapper;
import com.example.android.common.logger.MessageOnlyLogFilter;

/**
 * A simple launcher activity containing a summary sample description
 * and a few action bar buttons.
 */
public class MainActivity extends SampleActivityBase {

    public static final String TAG = "MainActivity";

    public static final String FRAGTAG = "BeamLargeFilesFragment";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView sampleOutput = (TextView) findViewById(R.id.sample_output);
        sampleOutput.setText(Html.fromHtml(getString(R.string.intro_message)));

        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        BeamLargeFilesFragment fragment = new BeamLargeFilesFragment();
        transaction.add(fragment, FRAGTAG);
        transaction.commit();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    /** Create a chain of targets that will receive log data */
    @Override
    public void initializeLogging() {
        // Wraps Android's native log framework.
        LogWrapper logWrapper = new LogWrapper();
        // Using Log, front-end to the logging chain, emulates android.util.log method signatures.
        Log.setLogNode(logWrapper);

        // Filter strips out everything except the message text.
        MessageOnlyLogFilter msgFilter = new MessageOnlyLogFilter();
        logWrapper.setNext(msgFilter);

        // On screen logging via a fragment with a TextView.
        LogFragment logFragment = (LogFragment) getSupportFragmentManager()
                .findFragmentById(R.id.log_fragment);
        msgFilter.setNext(logFragment.getLogView());
        logFragment.getLogView().setTextAppearance(this, R.style.Log);
        logFragment.getLogView().setBackgroundColor(Color.WHITE);

        Log.i(TAG, "Ready");
    }
}

来自android studio提供的beamlargedata示例代码

最佳答案

当范围内没有合适的 NFC 设备时,NFC Controller 将不断搜索所有技术以寻找标签或点对点设备。它通过发送没有场 Activity 的短脉冲来实现这一点(以节省电力)。

如果您有较新的设备,NFC Controller 也很可能只会产生非常微弱的 RF 场以节省电量。这个磁场不足以为 NFC 标签供电,但足以让芯片检测是否有东西在 13.56Mhz 共振。

使用标准 Android,您无法更改此行为。 API 中没有编程方式来启用您正在寻找的模式。

但是,如果您可以稍微扩展您的要求,您可能会得到接近您想要的东西。

选项 1:

启用阅读器模式。使用 EXTRA_READER_PRESENCE_CHECK_DELAY 额外调用 enableReaderMode。将此设置为非常高的值。

现在,如果标签进入 RF 场,NFC Controller 将不再经常检查是否存在。您可以通过触摸标签然后将其移除来激活您的 RF 场。

RF 场将保持稳定,直到存在检查延迟到期。

选项 2:

如果可以选择 root 设备,您可以侵入低级 NFC 堆栈。到目前为止,我使用过的每个 NFC Controller 都有一种或多种天线校准测试模式。仅输出射频场是一种非常常见的测试模式。

阅读 nfc-stack 的源代码可能会告诉您如何启用这种模式。这需要深入挖掘源代码,不适合胆小的人,但它是可行的。

关于android - 如果附近没有可读/可写设备,如何激活 NFC?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33322751/

相关文章:

android - 在 JAR 文件中包含 Android Activity (及其布局)

android - 扩展 View 并使用 onLongclick

android - 如何处理读者收到的S-block?

javascript - 直接在浏览器窗口中读取 NFC 标签

android - P2P通信/LLCP NFC读写器-NFC手机

android - 如何检测位图中的红色像素

android - 蓝牙 LE 扫描在后台失败 - 权限

android - 如何正确启动与 Mifare Ultralight C 的连接?

安卓NFC重启App

android - 安卓NFC编程和ACR122U读写器