Android Beam - должны ли расширять активность?
Я пытаюсь включить Android Beam в свое приложение. Но мне нужно расширить другой класс вместо Activity для моего приложения. Когда я пытаюсь сделать это:
public class SomeClass extends AnotherActivity implements
CreateNdefMessageCallback{
Android Beam вообще не работает, Touch to Beam не отображается. Тем не менее, когда я делаю это:
public class SomeClass extends Activity implements
CreateNdefMessageCallback{
Android Beam работает отлично. AnotherActivity расширяет некоторые другие действия, которые в конечном итоге расширяют саму активность, поэтому я не знаю, почему Android Beam не работает в первом случае. кто-нибудь знает, почему это произошло?
Вот более оригинальный, Android Beam не рабочий код для справки.
import android.app.Activity;
import android.content.Intent;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.nfc.NfcAdapter.CreateNdefMessageCallback;
import android.nfc.NfcEvent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Parcelable;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import android.view.View;
import android.view.View.OnClickListener;
public class SomeClass extends AnotherActivity implements
CreateNdefMessageCallback{
NfcAdapter mNfcAdapter;
TextView mInfoText;
private static final int MESSAGE_SENT = 1;
private NdefMessage message;
private TextView textView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Check for available NFC Adapter
mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
if (mNfcAdapter == null) {
Toast.makeText(this, "NFC is not available", Toast.LENGTH_LONG)
.show();
finish();
return;
}
// Register callback to set NDEF message
mNfcAdapter.setNdefPushMessageCallback(this, this);
}
/**
* Implementation for the CreateNdefMessageCallback interface
*/
@Override
public NdefMessage createNdefMessage(NfcEvent event) {
String text = ("Beam me up, Android!\n\n" +
"Beam Time: " + System.currentTimeMillis());
NdefMessage msg = new NdefMessage(
new NdefRecord[] {
NdefRecord.createMime(
"application/vnd.com.example.android.beam",
text.getBytes())
});
return msg;
}
@Override
public void onResume() {
super.onResume();
// Check to see that the Activity started due to an Android Beam
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
processIntent(getIntent());
}
}
@Override
public void onNewIntent(Intent intent) {
// onResume gets called after this to handle the intent
setIntent(intent);
}
/**
* Parses the NDEF Message from the intent and prints to the TextView
*/
void processIntent(Intent intent) {
Parcelable[] rawMsgs = intent
.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
// only one message sent during the beam
NdefMessage msg = (NdefMessage) rawMsgs[0];
// record 0 contains the MIME type, record 1 is the AAR, if present
mInfoText.setText(new String(msg.getRecords()[0].getPayload()));
}
}
Я проверил различия между ними в DDMS LogCat. Вот журнал с использованием AnotherActivity (NFC не работает)
07-14 13:53:10.317: W/NFC-LLC(608): LLC length mis-match
07-14 13:53:12.747: I/NFC-HCI(608): I'm P2P Passive Target @ 212 kb/s
07-14 13:53:12.754: D/NFCJNI(608): Discovered P2P Initiator
07-14 13:53:12.754: D/NFCJNI(608): 46
07-14 13:53:12.754: D/NFCJNI(608): 66
07-14 13:53:12.754: D/NFCJNI(608): 6d
07-14 13:53:12.754: D/NFCJNI(608): 01
07-14 13:53:12.754: D/NFCJNI(608): 01
07-14 13:53:12.754: D/NFCJNI(608): 11
07-14 13:53:12.754: D/NFCJNI(608): 03
07-14 13:53:12.754: D/NFCJNI(608): 02
07-14 13:53:12.754: D/NFCJNI(608): 00
07-14 13:53:12.754: D/NFCJNI(608): 13
07-14 13:53:12.754: D/NFCJNI(608): 04
07-14 13:53:12.754: D/NFCJNI(608): 01
07-14 13:53:12.754: D/NFCJNI(608): 96
07-14 13:53:12.754: D/NfcService(608): LLCP Activation message
07-14 13:53:12.762: I/NFCJNI(608): LLCP Link activated (LTO=150, MIU=128, OPTION=0x00, WKS=0x13)
07-14 13:53:12.762: I/NfcP2pLinkManager(608): LLCP activated
07-14 13:53:12.762: D/NfcP2pLinkManager(608): onP2pInRange()
07-14 13:53:12.778: D/NfcP2pLinkManager(608): onP2pSendConfirmationRequested()
07-14 13:53:12.934: I/NfcExecutionEnvironment(2915): NFCEE.open locked: stack=[NfcEventServiceWorker] openTid=263 nfceeOpened=false tryLock=0ms
07-14 13:53:12.942: D/NFCJNI(608): Unable to open SE connection, device already connected to a P2P peer or a Tag
07-14 13:53:13.950: D/NFCJNI(608): Unable to open SE connection, device already connected to a P2P peer or a Tag
07-14 13:53:14.958: D/NFCJNI(608): Unable to open SE connection, device already connected to a P2P peer or a Tag
07-14 13:53:15.965: D/NFCJNI(608): Unable to open SE connection, device already connected to a P2P peer or a Tag
07-14 13:53:16.981: D/NFCJNI(608): Unable to open SE connection, device already connected to a P2P peer or a Tag
07-14 13:53:17.989: D/NFCJNI(608): Unable to open SE connection, device already connected to a P2P peer or a Tag
07-14 13:53:18.997: D/NFCJNI(608): Unable to open SE connection, device already connected to a P2P peer or a Tag
07-14 13:53:20.012: D/NFCJNI(608): Unable to open SE connection, device already connected to a P2P peer or a Tag
07-14 13:53:20.801: I/NFCJNI(608): LLCP Link deactivated
07-14 13:53:20.809: D/NfcService(608): LLCP Link Deactivated message. Restart polling loop.
07-14 13:53:20.809: I/NfcP2pLinkManager(608): LLCP deactivated.
07-14 13:53:21.184: E/NfcExecutionEnvironment(2915): NFCEE.open() re-enabling card emulation
07-14 13:53:21.192: I/NfcAdapterExtras(2915): Wakelock WakeLock{41439a78 held=true, refCount=1} acquired 1405364001194 ms
07-14 13:53:21.192: I/NfcAdapterExtras(2915): Wakelock WakeLock{41439a78 held=true, refCount=1} released 1405364001198 ms elapsed 4 ms
07-14 13:53:21.192: I/NfcAdapterExtras(2915): Wakelock WakeLock{41439a78 held=true, refCount=1} acquired 1405364001199 ms
07-14 13:53:21.200: I/NfcAdapterExtras(2915): Wakelock WakeLock{41439a78 held=true, refCount=1} released 1405364001202 ms elapsed 3 ms
07-14 13:53:21.200: I/NfcExecutionEnvironment(2915): NFCEE.open ++: stack=[NfcEventServiceWorker, SecureElement] openTid=263 nfceeOpened=true holdCount=2
07-14 13:53:21.200: I/NfcExecutionEnvironment(2915): NFCEE.open ++: stack=[NfcEventServiceWorker, SecureElement, SecureElement] openTid=263 nfceeOpened=true holdCount=3
07-14 13:53:21.200: I/NfcExecutionEnvironment(2915): NFCEE.open ++: stack=[NfcEventServiceWorker, SecureElement, SecureElement, ControllerApplet] openTid=263 nfceeOpened=true holdCount=4
07-14 13:53:21.262: I/NfcExecutionEnvironment(2915): NFCEE.close --: stack=[NfcEventServiceWorker, SecureElement, SecureElement, ControllerApplet] openTid=263 nfceeOpened=true holdCount=4
07-14 13:53:21.262: I/NfcExecutionEnvironment(2915): NFCEE.close --: stack=[NfcEventServiceWorker, SecureElement, SecureElement] openTid=263 nfceeOpened=true holdCount=3
07-14 13:53:21.262: I/NfcExecutionEnvironment(2915): NFCEE.close --: stack=[NfcEventServiceWorker, SecureElement] openTid=263 nfceeOpened=true holdCount=2
07-14 13:53:21.262: W/NfcEventServiceWorker(2915): Payments are activated failure: com.google.android.apps.embeddedse.iso7816.SecureElementAppletFileNotFoundException: ControllerApplet: SELECT a0000004762010: statusWord=0x6a82 (File Not Found)
07-14 13:53:21.262: I/NfcExecutionEnvironment(2915): NFCEE.open ++: stack=[NfcEventServiceWorker, MifareManagerImpl] openTid=263 nfceeOpened=true holdCount=2
07-14 13:53:21.270: I/NfcExecutionEnvironment(2915): NFCEE.open ++: stack=[NfcEventServiceWorker, MifareManagerImpl, MifareManagerImpl] openTid=263 nfceeOpened=true holdCount=3
07-14 13:53:21.270: I/NfcExecutionEnvironment(2915): NFCEE.close --: stack=[NfcEventServiceWorker, MifareManagerImpl, MifareManagerImpl] openTid=263 nfceeOpened=true holdCount=3
07-14 13:53:21.270: I/NfcExecutionEnvironment(2915): NFCEE.open ++: stack=[NfcEventServiceWorker, MifareManagerImpl, MifareApplet] openTid=263 nfceeOpened=true holdCount=3
07-14 13:53:21.340: I/NfcExecutionEnvironment(2915): NFCEE.close --: stack=[NfcEventServiceWorker, MifareManagerImpl, MifareApplet] openTid=263 nfceeOpened=true holdCount=3
07-14 13:53:21.348: I/NfcExecutionEnvironment(2915): NFCEE.close --: stack=[NfcEventServiceWorker, MifareManagerImpl] openTid=263 nfceeOpened=true holdCount=2
07-14 13:53:21.364: D/NfcService(608): NFC-EE ON
07-14 13:53:21.372: D/NfcService(608): NFC-C ON
07-14 13:53:21.395: I/NfcExecutionEnvironment(2915): NFCEE.close closed: stack=[NfcEventServiceWorker] openTid=263 nfceeOpened=true tryLock=0ms session=8460ms
07-14 13:53:21.559: D/NfcP2pLinkManager(608): Debounce timeout
07-14 13:53:21.559: D/NfcP2pLinkManager(608): onP2pOutOfRange()
07-14 13:53:21.770: I/NfcEventServiceWorker(2915): Waiting ...
1 ответ
Я нашел проблему. В AnotherActivity (или в моем случае, в классе C, где AnotherActivity расширяет A, расширяет B, расширяет C), у меня была следующая строка кода.
getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
Это отключает создание снимков экрана, которые необходимы для работы пользовательского интерфейса Android Beam ("Touch to Beam"). Без пользовательского интерфейса Android Beam не будет работать вообще. Решением было сделать следующее в AnotherActivity:
getWindow().clearFlags(LayoutParams.FLAG_SECURE);
Теперь все отлично работает.