如何在附近没有可读/可写设备的情况下激活NFC?

时间:2015-10-24 20:05:52

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

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

我正在考虑实施此NFC波束功能:public boolean invokeBeam(活动活动)并将其植入Android工作室提供的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示例代码

1 个答案:

答案 0 :(得分:1)

当没有合适的NFC设备在范围内时,NFC控制器将不断搜索所有技术以寻找标签或对等设备。它通过发送由无字段活动分隔的短突发来实现此目的(以节省电力)。

如果您有更新的设备,NFC控制器很可能只会产生非常弱的RF场以节省电量。该字段不足以为NFC标签供电,但强度足以让芯片检测到是否存在13.56Mhz的共振信号。

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

但是,如果你可以稍微延长你的要求,你可能会得到一些接近你想要的东西。

选项1:

启用阅读器模式。使用enableReaderMode附加电话拨打EXTRA_READER_PRESENCE_CHECK_DELAY。将此值设置为非常高的值。

现在,如果标签进入射频场,NFC控制器将不再检查是否存在。您可以通过触摸标签激活RF场,然后将其移除。

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

选项2:

如果选择root设备,您可以自己进入低级NFC堆栈。到目前为止,我使用过的每个NFC控制器都有一个或多个用于天线校准的测试模式。输出RF场是一种非常常见的测试模式。

读取nfc-stack的源代码可能会告诉你如何启用这种模式。这需要在源代码中进行一些挖掘,并不适合胆小的人,但它是可行的。