2017-09-12 3 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

NfcA(14443-3/4タイプA)である特定のタグタイプ(NDAのために正確に指定することはできません)です。しかし、ターゲットタグの種類やターゲットではないタグの検出時に、アプリケーションの起動を任意に停止する必要があります。 – 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

アプリは、単に「発見された」タグがアプリに属しているかどうか(つまり、期待どおりのデータ構造が期待どおりであるかどうかを確認してください)、再度停止しないと確認できます。それを使用するかどうかは、あなた次第です。

関連する問題