2015-06-15 2 views
2

Я создаю приложение, в котором два устройства обмениваются данными по NFC, а затем один передает на сервер.Когда приложение получает данные NFC, он открывает «Новый тег собрал»

Я пытаюсь разработать это как для до и после леденцов. Проблема в том, что я создаю свое сообщение NDEF в одном приложении, а затем получаю его в другом приложении. Однако, когда я пытаюсь получить в другом приложении, вместо моего приложения открывается экран NFC «Новый тег». Это реальная проблема для меня, я просто отправляю строку, которую мне нужно отправить в веб-службу.

Ниже манифеста принимающего приложения:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.devcompany.paymentcustomer" > 
    <uses-permission android:name="android.permission.NFC" /> 
    <uses-permission android:name="android.permission.INTERNET"/> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name=".activities.HomeActivity" 
      android:launchMode="singleTop" 
      android:label="@string/app_name" 
      android:screenOrientation="portrait"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <action android:name="android.nfc.action.NDEF_DISCOVERED" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

Вот мой код для отправки:

mNfcAdapter = NfcAdapter.getDefaultAdapter(getActivity()); 


     //If device is running lollipop remove the touch to beam action 
     if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
      Handler handler = new Handler(); 
      handler.postDelayed(new Runnable() { 
       @Override 
       public void run() { 

        mNfcAdapter.setNdefPushMessageCallback(nDefCallback, getActivity()); 
        mNfcAdapter.invokeBeam(getActivity()); 
       } 

      }, 2000); 
     }else{ 
      //leave touch to beam action 
      mNfcAdapter.setNdefPushMessageCallback(new NfcAdapter.CreateNdefMessageCallback() { 
       @Override 
       public NdefMessage createNdefMessage(NfcEvent event) { 
        NdefMessage message = new NdefMessage((new NdefRecord[]{createMime("application/com.devcompany.paymentvendor.fragments", mToBeam.getBytes()) })); 

        return message; 
       } 
      }, getActivity()); 

      mNfcAdapter.setOnNdefPushCompleteCallback(
        new NfcAdapter.OnNdefPushCompleteCallback() { 

         @Override 
         public void onNdefPushComplete(NfcEvent event) { 

         } 
        }, getActivity()); 
     } 

Вот мой код для получения:

public class HomeActivity extends ActionBarActivity { 

    private NfcAdapter mAdapter; 
    private TextView textView; 

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

     mAdapter = NfcAdapter.getDefaultAdapter(this); 
     textView = (TextView)findViewById(R.id.fortressLabel); 

    } 

    @Override 
    public void onResume(){ 
     super.onResume(); 
     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); 
    } 

    private void processIntent(Intent intent){ 

     //textView.setText(intent.getDataString()); 
     Parcelable[] rawMsgs = intent.getParcelableArrayExtra(
       NfcAdapter.EXTRA_NDEF_MESSAGES); 
     // only one message sent during the beam 
     NdefMessage msg = (NdefMessage) rawMsgs[0]; 

     Log.i(this.getLocalClassName(), intent.getDataString()); 
    } 
} 

У меня есть отладил мой код приема и прошел через него, когда я держу телефоны вместе, код даже не завязывает r метод onResume. Сначала запускается тэг. Я не понимаю, почему это происходит. Может ли кто-нибудь помочь мне в этом?

+0

Пожалуйста отправьте ваш манифест файл слишком – 7383

+0

@ 7383 Я отредактировал мой оригинальное сообщение с обоими файлами манифеста. заранее спасибо –

ответ

2

Вы отправляете MIME тип записи типа «приложения/com.devcompany.paymentvendor.fragments»:

NdefMessage message = new NdefMessage(new NdefRecord[] { 
    NdefRecord.createMime("application/com.devcompany.paymentvendor.fragments", 
        mToBeam.getBytes()) 
}); 

Следовательно, вам также необходимо поручить вашу приемную деятельность на самом деле получить, что MIME тип записи. Вы можете зарегистрировать программу, чтобы открыть (и получать) при обнаружении этого типа MIME в событии NFC, добавив NDEF_DISCOVERED фильтр намерений для вашей деятельности:

<activity android:name=".activities.HomeActivity" ...> 
    <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 
     <category android:name="android.intent.category.LAUNCHER" /> 
    </intent-filter> 
    <intent-filter> 
     <action android:name="android.nfc.action.NDEF_DISCOVERED"/> 
     <category android:name="android.intent.category.DEFAULT"/> 
     <data android:mimeType="application/com.devcompany.paymentvendor.fragments" /> 
    </intent-filter> 
</activity>