2015-02-08 35 views
0

我相信這很簡單,但我無法弄清楚。我想要做的就是通過NFC(android Beam)發送消息,並在接收器設備上打開我的應用程序。我在一個新的項目上測試了我的代碼,它工作的很完美,但是如果我在真正的項目上嘗試它,只需啓動「收集新標籤」並顯示application/eu.freemoser.mydebts2go(請參閱my screenshot)。我不知道什麼是錯的,也許是與清單有關的東西?在谷歌搜索結果不符合我的問題符合(或我只是愚蠢的),但我相信,我發現了一些related answer可惜我還是沒能解決我的問題意圖過濾器不適用於Android Beam NFC

我的清單:

<?xml version="1.0" encoding="utf-8"?> 
    <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="eu.freemoser.myDebts2go" 
     android:versionCode="16" 

     android:versionName="1.1.0"> 

     <uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
     <uses-permission android:name="android.permission.READ_CONTACTS" /> 
     <uses-permission android:name="android.permission.INTERNET" /> 
     <uses-permission android:name="android.permission.NFC" /> 
     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
     <uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" /> 
     <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" /> 
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
     <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> 
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
     <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> 
     <uses-permission android:name="com.android.alarm.permission.SET_ALARM" /> 

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



     <uses-sdk 
      android:minSdkVersion="16" 
      android:targetSdkVersion="19" /> 
     <uses-feature 
      android:glEsVersion="0x00020000" 
      android:required="true" /> 

     <application 
      android:name="eu.freemoser.myDebts2go.MyApplication" 
      android:allowBackup="true" 
      android:hardwareAccelerated="true" 
      android:icon="@drawable/ic_launcher" 
      android:label="@string/app_name" 
      android:theme="@style/Theme.Mydebts2go"> 
      > 


      <service android:name="eu.freemoser.myDebts2goService.NotificationService"></service> 
      <service android:name="eu.freemoser.myDebts2goService.SynchronizationService"></service> 
      <service android:name="eu.freemoser.myDebts2goService.SynchronizService"></service> 
      <service android:name="eu.freemoser.myDebts2goService.AwesomeSynchronizService"></service> 


      <activity 
       android:name="eu.freemoser.myDebts2go.MainActivity" 
       android:label="@string/app_name" 
       android:screenOrientation="portrait"> 
       <intent-filter> 
        <action android:name="android.intent.action.MAIN" /> 
        <category android:name="android.intent.category.LAUNCHER" /> 
       </intent-filter> 
      </activity> 


      <activity 
      android:name="eu.freemoser.myDebts2GoActivities.AwesomeDetailActivity" 
       android:screenOrientation="portrait" android:theme="@style/Theme.MyDebts2GO.Detail"> 
      </activity> 

      <activity android:name=".AndroidBeamActivity" android:screenOrientation="portrait" 
       android:theme="@android:style/Theme.DeviceDefault.Wallpaper.NoTitleBar"> 
       <intent-filter> 
        <action android:name="android.nfc.action.NDEF_DISCOVERED" /> 
        <category android:name="android.intent.category.DEFAULT" /> 
        <data android:mimeType="application/eu.freemoser.myDebts2go" /> 
       </intent-filter> 
      </activity> 

      <activity android:name="eu.freemoser.myDebts2GoActivities.DriveRestoreActivity"></activity> 
      <activity android:name="eu.freemoser.myDebts2GoActivities.SynchronizActivity"></activity> 

      <activity android:name="eu.freemoser.myDebts2GoActivities.SettingActivity"> 
       <intent-filter> 
        <action android:name="android.intent.action.MANAGE_NETWORK_USAGE" /> 
        <category android:name="android.intent.category.DEFAULT" /> 
       </intent-filter> 
      </activity> 

      <activity android:name="eu.freemoser.myDebts2GoActivities.DatePickerActivity"></activity> 
      <activity android:name="eu.freemoser.myDebts2GoActivities.LocationPickerActivity"></activity> 

      <activity android:name="eu.freemoser.myDebts2GoActivities.SearchActivity"> 
       <intent-filter> 
        <action android:name="android.intent.action.SEARCH" /> 
       </intent-filter> 
      </activity> 

      <activity 
       android:name="eu.freemoser.myDebts2GoActivities.DriveAuthorzingActivity" 
       android:theme="@android:style/Theme.Translucent.NoTitleBar"> 
      </activity> 

      <activity 
       android:name="eu.freemoser.myDebts2GoActivities.FastModusShortcutActivity" 
       android:exported="true" 
       android:theme="@android:style/Theme.Holo.Light.NoActionBar"> 
      </activity> 


      <!-- android:value="API_KEY" /> DEBUG--> 

      <meta-data 
       android:name="com.google.android.maps.v2.API_KEY" 
       android:value="API_KEY" /> 
      <meta-data 
       android:name="com.google.android.gms.version" 
       android:value="VERSION" /> 


     </application> 


    </manifest> 

的片段(發送者)

public class AwesomeDetailFragment extends Fragment implements ObservableScrollView.Callbacks, NfcAdapter.CreateNdefMessageCallback, NfcAdapter.OnNdefPushCompleteCallback { 
    ... 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     ... 
     setUpAndroidBeam(); 
     return mRootView; 
    } 

    private void setUpAndroidBeam() { 
     PackageManager pm = getActivity().getPackageManager(); 
     // Check whether NFC is available on device 
     if (!pm.hasSystemFeature(PackageManager.FEATURE_NFC)) { 
      // NFC is not available on the device. 

     } 
     // Check whether device is running Android 4.1 or higher 
     else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { 
      // Android Beam feature is not supported. 

     } else { 
      myNfcAdapter = NfcAdapter.getDefaultAdapter(getActivity()); 
      manageNfc(); 

     } 
    } 

    private void manageNfc() { 
     if (myNfcAdapter != null) { 
      myNfcAdapter.setNdefPushMessageCallback(this, getActivity()); 
      myNfcAdapter.setOnNdefPushCompleteCallback(this, getActivity()); 
     } 
    } 

    ... 

    @Override 
    public NdefMessage createNdefMessage(NfcEvent event) { 
     Time time = new Time(); 
     time.setToNow(); 
     String text = myBetrag + "//" + myTitle + "//" + myContactName + "//" + myStatus + "//" + myDebtDate + "//" + myCreateDate + "//" + myRemamberDate + "//" + myNote; 
     NdefMessage msg = new NdefMessage(
       new NdefRecord[]{createMimeRecord(
         "application/eu.freemoser.myDebts2go", text.getBytes())}); 
     return msg; 
    } 

    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) { 

    } 
} 

的活性(接收機)

public class Beam extends Activity { 
    private Long userID = null; 
    private Long adressID = null; 

    private DBAdapter myDb; 
    //NFC 
    private String myBetrag; 
    private String myTitle; 
    private String myContactName; 
    private String myDebtDate; 
    private String myCreateDate; 
    private String myStatus; 
    private String myRemamberDate; 
    private String myNote; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 


    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) { 
      processIntent(getIntent()); 
     } 
    } 

    void processIntent(Intent intent) { 
     myDb = new DBAdapter(this); 
     myDb.open(); 
     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 
     String temp = new String(msg.getRecords()[0].getPayload()); 
     String[] arrrayTemp = temp.split("//"); 
     try { 
      myBetrag = arrrayTemp[0]; 
      myTitle = arrrayTemp[1]; 
      myContactName = arrrayTemp[2]; 
      myStatus = arrrayTemp[3]; 
      myDebtDate = arrrayTemp[4]; 
      myCreateDate = arrrayTemp[5]; 
      // can be "NOT" 
      myRemamberDate = arrrayTemp[6]; 
      myNote = arrrayTemp[7]; 
      // checkValues 
      channgeStatus(); 
      checkIfNot(); 
      checkUser(); 
      //write to database 
      write(); 

     } catch (Exception ex) { 
      this.finish(); 
     } 


    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     myDb.close(); 
    } 

    private void checkUser() { 
     //do some stuff 
     ... 
    } 

    private void write() { 

    //do some stuff 
     ... 

    } 

    private void checkIfNot() { 
    //do some stuff 
     ... 
    } 

    private void channgeStatus() { 
    //do some stuff 
     ... 
    } 

    @Override 
    public void onNewIntent(Intent intent) { 
     // onResume gets called after this to handle the intent 
     setIntent(intent); 
    } 

} 

回答

0

意圖過濾器的Android MIME類型匹配區分大小寫(儘管MIME類型本身不是)。因此,對於Android(並且幾乎在任何地方都使用它們),您應該遵守約定,只使用小寫字母的MIME類型。

具體來說,通過NFC接收的MIME類型記錄,Android會自動將它們轉換爲全小寫字母以解決意圖過濾器中區分大小寫的問題。所以,在你的榜樣,在意向更換過濾器的類型名稱"application/eu.freemoser.mydebts2go"應該工作:

<intent-filter> 
    <action android:name="android.nfc.action.NDEF_DISCOVERED"/> 
    <category android:name="android.intent.category.DEFAULT"/> 
    <data android:mimeType="application/eu.freemoser.mydebts2go"/> 
</intent-filter> 

此外,您還應該確保你只有小寫字母發送MIME類型:

NdefMessage msg = new NdefMessage(
      new NdefRecord[]{createMimeRecord(
        "application/eu.freemoser.mydebts2go", text.getBytes())}); 
+0

謝謝你現在工作 – 2015-02-09 18:16:45

相關問題