6

私には、NFCと2つのアクティビティへの接続を作成するクラスがあります。どちらもそのクラスのオブジェクトを作成して、NFCに接続できるようにします。以前はなんとか機能していましたが、今は問題があります。最初のアクティビティでも、アプリケーションはNewIntentで何も実行しません。その代わりに、「タグ」(Nexus S)という組み込みアプリから「収集された新しいタグ」を見ることができます。

私は何をすべきか?

クラス:

public NFCForegroundUtil(Activity activity)
{
    super();
    this.activity = activity;
    mAdapter = NfcAdapter.getDefaultAdapter(activity
            .getApplicationContext());

    mPendingIntent = PendingIntent.getActivity(activity, 0, new Intent(
            activity, activity.getClass())
            .addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);

    IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED);
    IntentFilter ndef2 = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
    IntentFilter ndef3 = new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED);

    try
    {
        ndef2.addDataType("*/*");
    }
    catch (MalformedMimeTypeException e)
    {
        throw new RuntimeException("fail", e);
    }

    mFilters = new IntentFilter[] {ndef, ndef2, ndef3 };

    mTechLists = new String[][] { new String[] {
            // android.nfc.tech.NfcV.class.getName(),
            android.nfc.tech.NfcA.class.getName(),
            android.nfc.tech.IsoDep.class.getName() } };

    mAdapter.enableForegroundDispatch(this, mPendingIntent, mFilters, mTechLists);

}

アクティビティ1:

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    nfcForegroundUtil = new NFCForegroundUtil(this);

}

 @Override
protected void onNewIntent(Intent intent)
{

    super.onNewIntent(intent);
    Intent i = new Intent(this, NfcDisplayLabelActivity2.class);
    startActivity(i);

 }
4

5 に答える 5

7

[設定]->[アプリ]->[すべて]->[タグ](私の場合)->[無効にする]に移動します

于 2014-05-26T11:07:22.883 に答える
4

NFCタグからアプリを開こうとしたときにも同様の問題が発生しました。スキーム「magicnfc」のintentfilterをAndroidManifest.xmlに登録しましたが、それでも私の代わりにAndroidOSタグアプリが開きました。

NFCインテント(私の場合はTECH_DISCOVERED)が、一般的なスキームベースのインテントフィルターよりも優先度が高いことを発見しました。タグアプリはTECH_DISCOVEREDを登録したため、私の代わりに開かれていました。

幸い、アプリはNDEF_DISCOVERED(優先度の高いフィルター)に登録して、タグアプリの代わりに開くことができます。

タグをタップするとアプリが開きました。

詳細はこちら: http ://developer.android.com/guide/topics/connectivity/nfc/nfc.html

しかし、次のようなコードを使用して、関数onNewIntentをオーバーライドする必要があることがわかりました。

if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
    String uri = intent.getDataString();

    Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
    if (rawMsgs != null) {
        msgs = new NdefMessage[rawMsgs.length];
        for (int i = 0; i < rawMsgs.length; i++) {
            msgs[i] = (NdefMessage) rawMsgs[i];
        }
    }
}

私にとって、必要なのは次のことだけでした。

String uri = intent.getDataString();

幸運を!

于 2014-08-19T21:57:26.657 に答える
3

次のコードで特定のタグをフィルタリングするのではなく、インテントを使用してアクティブ化されたすべてのタグをリッスンできます。ACTION_TAG_DISCOVERED

public NFCForegroundUtil(Activity activity)
{
    super();
    this.activity = activity;
    mAdapter = NfcAdapter.getDefaultAdapter(activity
            .getApplicationContext());

    mPendingIntent = PendingIntent.getActivity(activity, 0, new Intent(
            activity, activity.getClass())
            .addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 
0);

    // See below
    mAdapter.enableForegroundDispatch(this, mPendingIntent, null, null);
}

NFCAdapterドキュメントから:

フィルタとtechListsパラメータの両方にnullを渡すと、ワイルドカードとして機能し、フォアグラウンドアクティビティがACTION_TAG_DISCOVEREDインテントを介してすべてのタグを受信するようになります。

于 2015-05-16T17:23:48.400 に答える
0

問題は、インテントを初期化するときです。

クラスは、2番目のクラスではなく、それ自体である必要があります。

正しいコードは次のようになります:

@Override
protected void onNewIntent(Intent intent)
{
    super.onNewIntent(intent);
    Intent i = new Intent(this, NfcDisplayLabelActivity1.class);
    startActivity(i);
 }
于 2020-12-10T16:32:38.630 に答える
-4

アプリケーションが正常に動作しなかったため、「タグ」という組み込みアプリから「新しいタグが収集されました」と表示されていました。

正常に動作する場合は、「タグ」よりも優先度が高く、電話はアプリケーションからタグを読み取ります。しかし、それが正しく機能せず、電話がタグを収集すると、「タグ」アプリケーションがアクティブになり、「タグ」アプリケーションがデバイスと通信します。

コードを修復した後、私のアプリの優先度が高くなり、電話は私のアプリケーションを使用してタグを読み取ります。

于 2012-11-15T11:50:44.170 に答える