2017-09-12 81 views
1

我有一個應用程序的,需求是啓動它在檢測到非NDEF NFC標籤的,所以我用我的主要活動TECH_DISCOVERED過濾器可以這樣做:可能阻止NFC應用程序從應用程序內部啓動應用程序?

<intent-filter> 
    <action android:name="android.nfc.action.TECH_DISCOVERED" /> 
</intent-filter> 

這工作正常然而一些用戶抱怨說他們的手機外殼兼作信用卡/智能卡持有人,因此,當他們關閉自己的手機情況下,應用程序是無意推出。這些用戶不希望有禁用設備的NFC設置(而不能編程方式),所以我的問題是:是否有可能以編程方式從應用程序內停止NFC意圖的應用的啓動?

我可以想出的最好的想法是讓NFC意圖啓動一個非UI活動(一個不叫setContentView)並且檢查是否設置了一些持久標誌(通過UI控件主要活動),如果設置了標誌,則不要啓動主要活動。

有沒有更簡單/更好的解決方案?

+0

是您的要求,發動對檢測任何非NDEF標籤?或者是一種特殊的技術類型的標籤? – jgriffin

+0

這是一個特定的代碼類型(無法精確由於NDA指定),其是NFCA(14443-3/4 A型)。但是,我需要能夠選擇停止啓動應用程序,檢測目標標記類型以及非目標標記。 – DaveAlden

回答

0

我對這個解決方案是通過NFC意向啓動一個無頭(不可見)的活動,並使用一個共享的偏好(由通過UI開關設定主要活動)來確定是否啓動主要活動。

AndroidManifest.xml

<activity android:name="com.mypackage.NFCLaunchActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar"> 
    <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_filter" /> 
</activity> 

res/nfc_tech_filter.xml

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> 
    <tech-list> 
     <tech>android.nfc.tech.NfcA</tech> 
    </tech-list> 
</resources> 

MainActivity.java

public static String SETTINGS_NAME = "settings"; 
public static String shouldLaunchByNFC = "launchWithNfc"; 

// Call on changing UI state 
protected void setShouldLaunchByNFC(boolean enableLaunch) { 
    setSettingBoolean(this, shouldLaunchByNFC, enableLaunch); 
} 

// Call to set initial UI state 
protected boolean getShouldLaunchByNFC() { 
    return getSettingBoolean(this, shouldLaunchByNFC, true); 
} 

public static void setSettingBoolean(Activity activity, String name, boolean value){ 
    SharedPreferences settings = activity.getSharedPreferences(SETTINGS_NAME, MODE_PRIVATE); 
    SharedPreferences.Editor editor = settings.edit(); 
    editor.putBoolean(name, value); 
    editor.commit(); 
} 

public static boolean getSettingBoolean(Activity activity, String name, boolean defaultValue){ 
    SharedPreferences settings = activity.getSharedPreferences(SETTINGS_NAME, MODE_PRIVATE); 
    return settings.getBoolean(name, defaultValue); 
} 

NFCLaunchActivity.java

import static com.mypackage.MainActivity.getSettingBoolean; 
import static com.mypackage.MainActivity.shouldLaunchByNFC; 

public class NFCLaunchActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // setContentView explicitly omitted 

     boolean launchWithNfc = getSettingBoolean(this, shouldLaunchByNFC, true); 
     if(launchWithNfc){ 
      Context context = this.getApplicationContext(); 
      Intent intent = new Intent(); 
      intent.setClassName(context, context.getPackageName() + ".MainActivity"); 
      context.startActivity(intent); 
     } 
     finish(); 
    } 
} 
0

該應用程序可以簡單地嘗試檢查「發現」標籤是否屬於該應用程序(即數據結構與預期一致,RESP。該TagType是如預期),如果不再次停止。無論你作出這樣的可見的使用與否是由你...

相關問題