为什么Android设备在长时间睡眠后无法读取NFC标签?

时间:2013-11-26 08:43:23

标签: android nfc lockscreen

我很抱歉我的英语不好。

我使用NFC开发Android应用。我添加了一种方法,可以将不安全的密钥保护暂时停止到应用程序,以便快速使用NFC标记。 但是,我认为在睡觉时停止键控器会导致电池耗尽,所以我添加了一种方法,可以在设备休眠时恢复键盘保护。

结果,我编写了如下所示的代码。

public class MainActivity extends Activity {

private NfcAdapter      mAdapter;
private PowerManager    mPowerManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // regist screen on / off actions receiver
    IntentFilter scFilter = new IntentFilter();
    scFilter.addAction(Intent.ACTION_SCREEN_ON);
    scFilter.addAction(Intent.ACTION_SCREEN_OFF);
    scFilter.addAction(Intent.ACTION_USER_PRESENT);
    registerReceiver(mScreenReceiver, scFilter);
}

@Override
public void onNewIntent(Intent intent) {
    super.onNewIntent(intent);

    String action = intent.getAction();
    if (action != null && (action.equals(NfcAdapter.ACTION_TAG_DISCOVERED)
            || action.equals(NfcAdapter.ACTION_TECH_DISCOVERED)
            || action.equals(NfcAdapter.ACTION_NDEF_DISCOVERED))) {
        // manage NFC Tags here
        Log.d("MainActivity", "NFC Tags detected");
        Toast.makeText(getApplicationContext(), "NFC Tags detected", Toast.LENGTH_SHORT).show();
    }
}

@Override
public void onResume() {
    super.onResume();

    // enableForegroundDispatch
    if (mAdapter == null) { 
        mAdapter = NfcAdapter.getDefaultAdapter(getApplicationContext());
    }
    if (mAdapter != null) {
        Intent nfcIntent = new Intent(this, getClass());
        nfcIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, nfcIntent, 0);
        mAdapter.enableForegroundDispatch(this, pendingIntent, null, null);
    } else {
        Log.d("MainActivity", "failed getDefaultAdapter()");
    }
}

@Override
public void onPause() {
    if (mPowerManager != null) {
        if (!mPowerManager.isScreenOn()) {
            // clearWindowFlags only when device is sleeping
            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
        }
    }

    // disableForegroundDispatch
    if (mAdapter != null) {
        mAdapter.disableForegroundDispatch(this);
        mAdapter = null;
    }

    super.onPause();
}

@Override
public void onDestroy() {
    try {
        // unregist screen on / off actions receiver
        unregisterReceiver(mScreenReceiver);
    } catch (IllegalArgumentException e) {
    }
    super.onDestroy();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    return false;
}

private BroadcastReceiver mScreenReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction() == null) {
            return;
        }
        if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
        } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
        } else if (intent.getAction().equals(Intent.ACTION_USER_PRESENT)) {
        }
    }
};
}

但是,此代码在我的设备上没有按预期执行。 我使用Nexus 7(第1版,OS 4.3,启用了幻灯片锁定)。

首先,当我启动应用程序并让我的设备进入睡眠状态时,键控器没有以30%的概率恢复。即使在睡觉时,它也会通过NFC标签发出声音效果。

其次,使用该应用程序睡眠约一小时后,我的设备很少会读取NFC标签。 NFC标签甚至都不会发出任何声音。但是再次睡眠或终止应用程序后情况会消失。

谁知道错误的原因?

0 个答案:

没有答案