2013-06-11 109 views
2

我正在寫一個使用od NFC標籤的應用程序。我希望NFC標籤成爲我的應用的入口點 - 關閉包含標籤的電話卡應該開始我的活動。然後,當活動正在運行時,我想禁用所有可以利用NFC標籤的意圖過濾器,因此另一個關閉過程不會執行任何操作(我不希望我的活動重新開始)。我知道如何「禁用」我的意圖過濾器,使用活動別名:如何「禁用」外部應用程序的意圖過濾器?

<activity-alias android:enabled="true" 
      android:name=".alias.NFCEntryPoint" 
      android:targetActivity="pl.mitrue.safedb.NFCEntryPoint" 
      android:exported="true" 
      android:icon="@drawable/ic_launcher" 
      android:label="@string/alias.pl.mitrue.safedb.NFCEntryPoint" > 
     <intent-filter> 
      <action android:name="android.nfc.action.TAG_DISCOVERED" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
    </activity-alias> 

然後,我可以編程方式禁用的別名,所以我的意圖過濾器中禁用過:

getPackageManager().setComponentEnabledSetting(new ComponentName("pl.mitrue.safedb", "pl.mitrue.safedb.alias.NFCEntryPoint"), 
      PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); 

現在,這裏的問題:我有其他應用程序使用我的設備上安裝的那種過濾器。現在,當我的應用程序正在運行時,我禁用了我的意圖過濾器(通過禁用活動別名),出現一個對話框,要求我選擇要使用的應用程序。有什麼辦法可以避免這種情況?在最簡單的情況下,一旦我的應用程序啓動,我不想在關閉NFC標籤時採取任何行動。有什麼辦法讓我的申請成爲唯一可以接受外部意向的申請嗎?

爲了記錄:我不想完全關閉NFC(我不知道,如果它甚至有可能),因爲我可能要稍後才能在其他活動中使用它。

我希望我已經說明白了明確。因爲我是新來的,請理解。

謝謝!

+1

不,你不能。您正試圖覆蓋系統安全性,因爲您正在運行沙箱,您無法控制此行爲。 –

+0

好吧,但不知何故,我已安裝的應用程序之一有所需的行爲。在應用程序結束標記的某些地方什麼也不做,在另一些地方執行一個動作(並不總是相同)。我從未被要求在使用我自己的應用程序時選擇像我一樣的活動。這正是我需要的行爲。也許我可以使用某種解決方法? 我不知道是否可以獲取並反編譯從谷歌市場安裝的應用程序的源代碼 - 如果是這樣,我會這樣做,如果我在這裏沒有得到答案。 – mitrue

回答

1

我有一個類似的問題,其中: 1)如果我是在細胞的啓動畫面(全部關閉應用程序),通過MIFARE經典卡時,自動打開我的應用程序,而不要求其應用程序想,如果開還有很多也讀過mifare classic。

2)如果我的應用程序是開放的,並通過一卡,不收我的應用程序,並問我是否有很多的應用程序,還可讀取MIFARE經典哪個應用使用。 解決方案:使用Foreground Dispatch

在我的主要活動:

private IntentFilter[] intentFiltersArray; 
private String[][] techListsArray; 
private PendingIntent pendingIntent; 

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     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("text/plain"); 
     } 
     catch (MalformedMimeTypeException e) { 
      throw new RuntimeException("fail", e); 
     } 
     intentFiltersArray = new IntentFilter[] {ndef, }; 
     techListsArray = new String[][] { new String[] { android.nfc.tech.MifareClassic.class.getName() } }; 
    } 

@Override 
    protected void onResume() { 
    super.onResume(); 
    adaptadorNFC = NfcAdapter.getDefaultAdapter(this); 
    System.out.println("Se setearan parametros"); 
    final Intent intent = new Intent(this.getApplicationContext(), this.getClass()); 
    intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 
    adaptadorNFC.enableForegroundDispatch(this, pendingIntent, intentFiltersArray, techListsArray); 

    leerTarjeta(this.getIntent()); 
} 

@Override 
protected void onPause() { 
    System.out.println("Se dessetearan parametros"); 
    adaptadorNFC.disableForegroundDispatch(this); 
    super.onPause(); 
} 

希望這有助於其他人,因爲這個問題被問在一年前:P

+0

這並沒有真正回答這個問題。如果您有不同的問題,可以通過單擊[提問](http://stackoverflow.com/questions/ask)來提問。您還可以[添加賞金](http://stackoverflow.com/help/privileges/set-bounties)在您擁有足夠的[聲譽](http://stackoverflow.com/help/)時吸引更多人關注此問題什麼聲譽)。 – duggu

+0

那是真的。可能並不完整,但我認爲@mitrue是應該確定的人。 – RedDeath

相關問題