可以通过应用内的NFC意图阻止应用启动吗?

时间:2017-09-12 08:41:08

标签: android nfc intentfilter

我有一个应用程序,要求在检测到非NDEF NFC标签时启动它,因此我在主要活动中使用TECH_DISCOVERED过滤器来执行此操作:

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

这样可行,但有些用户抱怨他们的手机外壳兼作信用卡/智能卡的持有人,因此应用程序在关闭手机外壳时无意中启动。这些用户不希望必须禁用设备NFC设置(并且无法以编程方式完成),因此我的问题是:是否可以通过编程方式停止通过该应用内的NFC意图启动应用?

我能想到的最好的想法是让NFC意图启动非UI活动(不会调用setContentView)并检查是否已设置某个持久标志(通过主活动中的UI控件)并且如果设置了标志,则不要启动主活动。

是否有更简单/更优雅的解决方案?

2 个答案:

答案 0 :(得分:0)

应用程序可以简单地尝试检查&#34;是否发现&#34;标签属于应用程序(即数据结构是预期的,分别是TagType是预期的),如果不是再次停止。你是否可以使用它取决于你...

答案 1 :(得分: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();
    }
}