0

CreateNdefMessageCallback と OnNdefPushCompleteCallback を実装しています。何らかの理由で、コールバック メソッドは決して変更されず、ログにもエラーはありません。

API からの音は聞こえますが、デバッグしている電話はバージョン 4.0.4 を実行している Nexus S です。

ここに私の活動があります:

public class TestActivity extends Activity implements CreateNdefMessageCallback, OnNdefPushCompleteCallback
{
  private static SoundHelper soundHelper;

  private PowerManager.WakeLock wakeLock;

  private NfcAdapter nfcAdapter;
  private PendingIntent pendingIntent = null;
  private IntentFilter[] intentFiltersArray;
  private String[][] techListsArray;

  private TextView onScreenLog;
  private List<String> uniqueTagsRead = new ArrayList<String>();

  /** handler stuff */
  private static final int MESSAGE_SENT = 1;
  private final Handler handler = new Handler()
  {
    @Override
    public void handleMessage(Message msg)
    {
      switch (msg.what)
      {
        case MESSAGE_SENT:
          if (soundHelper != null)
          {
            soundHelper.playSound(R.raw.smw_coin);
          }

          updateTagCount();
          break;
      }
    }
  };

  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.test);

    soundHelper = new SoundHelper(this);

    onScreenLog = (TextView) findViewById(R.id.log);

    // nfc adapter
    nfcAdapter = NfcAdapter.getDefaultAdapter(this);
    if (nfcAdapter != null)
    {
      // callbacks
      nfcAdapter.setNdefPushMessageCallback(this, this);
      nfcAdapter.setOnNdefPushCompleteCallback(this, this);

      // other stuff
      nfcAdapter = NfcAdapter.getDefaultAdapter(this);
      pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
      IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
      try
      {
        ndef.addDataType("*/*");
      }
      catch (MalformedMimeTypeException e)
      {
        throw new RuntimeException("fail", e);
      }
      intentFiltersArray = new IntentFilter[] {ndef, };
      techListsArray = new String[][] {
          new String[] { IsoDep.class.getName() },
          new String[] { NfcA.class.getName() },
          new String[] { NfcB.class.getName() },
          new String[] { NfcF.class.getName() },
          new String[] { NfcV.class.getName() },
          new String[] { Ndef.class.getName() },
          new String[] { NdefFormatable.class.getName() },
          new String[] { MifareClassic.class.getName() },
          new String[] { MifareUltralight.class.getName() },
      };
    }
    else
    {
      onScreenLog.setText("NFC is not available on this device. :(");
    }
  }

  public void onPause()
  {
    super.onPause();

    // end wake lock
    wakeLock.release();

    nfcAdapter.disableForegroundDispatch(this);
  }

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

    // start wake lock
    PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
    wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, "DoNotDimScreen");
    wakeLock.acquire();

    nfcAdapter.enableForegroundDispatch(this, pendingIntent, intentFiltersArray, techListsArray);
  }

  private void updateTagCount()
  {
    String newCount = String.valueOf(uniqueTagsRead.size());
    String text = getString(R.string.format_count);
    text = getString(R.string.format_count).replace("0", newCount);

    onScreenLog.setText(text);
  }

  @Override
  public NdefMessage createNdefMessage(NfcEvent event)
  {
    String message = "This is NFC message";
    NdefRecord mimeRecord = createMimeRecord("application/param.android.sample.beam",
    message.getBytes());
    NdefRecord appRecord = NdefRecord.createApplicationRecord("param.android.sample.beam");
    NdefRecord[] ndefRecords = new NdefRecord[] {
    mimeRecord,
    appRecord
    };
    NdefMessage ndefMessage = new NdefMessage(ndefRecords);
    return ndefMessage;

    /*
    String mimeType = "text/plain"; // "text/plain";

    NdefRecord[] data = {createMimeRecord(mimeType, TEXT_TO_WRITE.getBytes())};
    // data[data.length - 1] = NdefRecord.createApplicationRecord(); // com.test.nfc.application.activities.

    return new NdefMessage(data);
    */
  }

  /**
   * Creates a custom MIME type encapsulated in an NDEF record
   *
   * @param mimeType
   */
  public NdefRecord createMimeRecord(String mimeType, byte[] payload)
  {
    byte[] mimeBytes = mimeType.getBytes(Charset.forName("US-ASCII"));
    NdefRecord mimeRecord = new NdefRecord(NdefRecord.TNF_MIME_MEDIA, mimeBytes, new byte[0], payload);

    return mimeRecord;
  }

  @Override
  public void onNdefPushComplete(NfcEvent event)
  {
    handler.obtainMessage(MESSAGE_SENT).sendToTarget();
  }
}

マニフェスト:

    <uses-sdk android:minSdkVersion="14" />

    <supports-screens android:anyDensity="true" /> 

    <uses-permission android:name="android.permission.NFC"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WAKE_LOCK" />

    <uses-feature android:name="android.hardware.nfc" />

    <application android:name="com.test.nfc.application.Application"
        android:icon="@drawable/icon_launcher_nfc_droid_hdpi"
        android:theme="@android:style/Theme.Light"
        android:label="@string/app_name">

        <activity
            android:label="@string/app_name"
            android:name=".application.activities.MainActivity"
            android:configChanges="orientation|keyboardHidden">
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity
            android:label="@string/test"
            android:name=".application.activities.TestActivity"
            android:configChanges="orientation|keyboardHidden"
            android:launchMode="singleTop">

            <intent-filter>
              <action android:name="android.nfc.action.TECH_DISCOVERED"/>
            </intent-filter>
            <meta-data android:name="android.nfc.action.TECH_DISCOVERED" android:resource="@xml/nfc_tech_list" />

        </activity>

    </application>

</manifest>

テクリスト

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
    <tech-list>
        <tech>android.nfc.tech.IsoDep</tech>
        <tech>android.nfc.tech.NfcA</tech>
        <tech>android.nfc.tech.NfcB</tech>
        <tech>android.nfc.tech.NfcF</tech>
        <tech>android.nfc.tech.NfcV</tech>
        <tech>android.nfc.tech.Ndef</tech>
        <tech>android.nfc.tech.NdefFormatable</tech>
        <tech>android.nfc.tech.MifareClassic</tech>
        <tech>android.nfc.tech.MifareUltralight</tech>
    </tech-list>
</resources>
4

2 に答える 2

2

あなたの質問とサンプル コードから、NDEF メッセージを受信するか、送信するか、またはその両方を行うかは完全にはわかりません。

を使用する場合NfcAdapter.enableForegroundDispatch()、アクティビティは への呼び出しによって新しい NFC インテントについて通知されるonNewIntent()ため、アクティビティでそのメソッドをオーバーライドしてインテントを受け取る必要があります。

NfcAdapter.CreateNdefMessageCallbackAndroid ビームを介して NDEF データを別の NFC デバイスに送信するためにNfcAdapter.OnNdefPushCompleteCallback使用されます。ユーザーは、画面をタップして NDEF メッセージの送信を有効にする必要があります。これにより、 および が呼び出されます。createNdefMessage()onNdefPushComplete()

もう 1 つ注意:nullフィルターと techLists パラメーターを渡すとNfcAdapter.enableForegroundDispatch()、ワイルド カードとして機能します (したがって、現在行っているように、テクノロジの完全なリストを宣言する必要はありません)。

于 2012-04-10T20:20:33.603 に答える
0

デフォルトの NFC アダプターを 2 回取得しているように見えますか?

nfcAdapter = NfcAdapter.getDefaultAdapter(これ);

nfcAdapter で null をチェックする前に一度実行してから、if ステートメントでもう一度実行します。これはいくつかの奇妙な効果をもたらす可能性があります。よくわかりませんが。また、実行時にインテント フィルターを宣言しているようです。問題が解決しない場合は、マニフェストでこれを実行してデバッグします。そのようにして、何かがインテントを正しくフィルタリングしていることを確認する方が簡単です。

その他の例については、このサンプル コードと SDK の Android Beam サンプルを参照してください。

http://developer.android.com/guide/topics/nfc/nfc.html#p2p

于 2012-04-10T16:32:36.400 に答える