2012-04-10 12 views
0

私はCreateNdefMessageCallbackとOnNdefPushCompleteCallbackを実装しています。なんらかの理由で、コールバックメソッドは決して触れられず、ログにもエラーはありません。4.x Android NFC APIでNdefMessageをプッシュできません

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

は私の活動です:

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> 

techlistあなたは二回、デフォルトNFCアダプタを取得しているように見えます

<?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> 

答えて

2

あなたの質問とサンプルコードから、あなたがNDEFメッセージを受信するかどうか私には全く明らかではないが、それらを送信するか、またはその両方。あなたがにあなたの活動にそのメソッドをオーバーライドする必要がありますので

NfcAdapter.enableForegroundDispatch()を使用して、あなたの活動はインテントを受け取る、onNewIntent()にコールすることによって、新しいNFCの意図について通知されます。

NfcAdapter.CreateNdefMessageCallbackおよびNfcAdapter.OnNdefPushCompleteCallbackに、のNDEFデータをAndroid Beam経由で別のNFCデバイスに送信します。ユーザは、NDEFメッセージの送信を有効にするために画面をタップする必要があり、これにより、createNdefMessage()およびonNdefPushComplete()へのコールが発生します。

もう1つの注意点:フィルタとtechListsのパラメータにnullを渡して、ワイルドカードとして動作するNfcAdapter.enableForegroundDispatch()に渡すと(今のように、技術の完全なリストを宣言する必要はありません)。

+0

優秀!私のためにそれをクリアしてくれてありがとう。私は 'onNewIntent()'をオーバーライドし、すべての作品、私はまた、活動launchMode 'singleTop'を作った。 これまで実行されている他の人向け: 'Tag detectedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);' – darknsf

0

nfcAdapter = NfcAdapter.getDefaultAdapter(this);

nfcAdapterでnullをチェックする前に一度やり直してから、if文でもう一度やり直してください。これには奇妙な影響があるかもしれません。私は確信していません。また、実行時にインテントフィルタを宣言しているようです。それでも問題がある場合は、マニフェストでデバッグしてください。そのような意図を正しくフィルタリングすることが確実であることがわかりやすくなります。

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

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

+0

ああ、私はそれを間違って読んでいます。彼は前景の派遣を使っている。私の悪い。 – robertly

関連する問題