AndroidのNFCは、フルスクリーンランチャーアプリがバックグラウンドから来て後に失敗した読み

Ra.cavalieri:

私のアプリは、私は、インストール後にデフォルトの権利を作ることランチャーで、(この時点で私のアプリが画面上にすでにあり、それは、最初の起動時に問題なくNFCタグを読み取るんが、私は携帯電話をロックし、彼らはそれをアンロックした場合にonResume()呼ばれています)アプリは、タグを読み取るために停止し、(タグが電話で読み取るされたときに異なるサウンドが再生され、私はそれはNFCが音を失敗だと思う)onNewIntent(Intent intent)と呼ばれていません。

私はすでにスコープの代わりに、ローカル(から取り出し、私のフィルタとの意図が活動されて作ってみましたsetupForegroundDispatch)が、同じ問題を静止画。私は、アプリを再度開く(キルをして、再度起動)場合、NFCリーダーが右読みありません。

そこで、以下の私のロジックは次のとおりです。

NfcAdapter nfcAdapter;

@Override
    protected void onResume() {
        super.onResume();

        if (nfcAdapter == null){
            nfcAdapter=NfcAdapter.getDefaultAdapter(this);
        }
        setupForegroundDispatch(this, nfcAdapter);
    }
public static void setupForegroundDispatch(Activity activity, NfcAdapter adapter) {
        final Intent intent = new Intent(activity.getApplicationContext(), activity.getClass());

        final PendingIntent pendingIntent = PendingIntent.getActivity(
                activity.getApplicationContext(), 0, intent, 0);

        IntentFilter[] filters = new IntentFilter[2];
        String[][] techList = new String[][]{};

        filters[0] = new IntentFilter();
        filters[0].addAction(NfcAdapter.ACTION_TAG_DISCOVERED);
        filters[1] = new IntentFilter();
        filters[1].addAction(NfcAdapter.ACTION_TECH_DISCOVERED);

        adapter.enableForegroundDispatch(activity, pendingIntent, filters, techList);
    }
@Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        String action = intent.getAction();
        if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action) ||
                NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)) {
            Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
            if (tag != null) {
                 //do my logic here
            }
        }
    }
@Override
    protected void onPause() {
        super.onPause();
        nfcAdapter.disableForegroundDispatch(this);
    }

私のマニフェスト

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="br.org.company.app">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
    <uses-permission android:name="android.permission.SEND_SMS" />
    <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.CALL_PRIVILEGED" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
    <uses-permission android:name="android.permission.READ_PHONE_NUMBERS" />
    <uses-permission android:name="android.permission.STATUS_BAR" />
    <uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
    <uses-permission android:name="android.permission.PREVENT_POWER_KEY" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
    <uses-permission android:name="android.permission.REORDER_TASKS" />
    <uses-permission android:name="android.permission.NFC" />

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:sharedUserId="android.uid.system"
        android:supportsRtl="true"
        android:theme="@style/Theme.AppCompat.Light.NoActionBar"
        android:versionName="1.2.1xdk"
        android:usesCleartextTraffic="true">
        <meta-data
            android:name="com.google.android.actions"
            android:resource="@xml/actions" />

        <receiver android:name=".receivers.GpsLocationReceiver">
            <intent-filter>
                <action android:name="android.location.PROVIDERS_CHANGED" />

                <category android:name="android.intent.category.DEFAULT" />

                <action android:name="android.location.LocationManager.KEY_LOCATION_CHANGED" />
            </intent-filter>
        </receiver>
        <receiver
            android:name=".receivers.PassiveLocationChangedReceiver"
            android:enabled="true">
            <intent-filter>
                <action android:name="android.location.LocationManager.KEY_LOCATION_CHANGED" />
            </intent-filter>
        </receiver>
        <receiver
            android:name=".receivers.BootReceiver"
            android:enabled="true"
            android:exported="false">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.BOOTUP_COMPLETE" />
                <action android:name="android.intent.action.QUICKBOOT_POWERON" />
            </intent-filter>
        </receiver>
        <receiver android:name=".receivers.MyWakefulReceiver" />
        <receiver android:name=".receivers.InternetConnectionReceiver">
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                <action android:name="android.net.wifi.WIFI_STATE_CHANGE" />
            </intent-filter>
        </receiver>
        <receiver android:name=".receivers.IncomingCall">
            <intent-filter>
                <action android:name="android.intent.action.PHONE_STATE" />
            </intent-filter>
        </receiver>

        <activity
            android:name=".FirstScreenActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:label="@string/app_name"
            android:launchMode="singleTask"
            android:screenOrientation="portrait"
            android:sharedUserId="android.uid.system"
            android:soundEffectsEnabled="true"
            android:theme="@style/Theme.AppCompat.Light.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.HOME" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".FullscreenActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:label="@string/app_name"
            android:launchMode="singleTask"
            android:screenOrientation="portrait"
            android:sharedUserId="android.uid.system"
            android:soundEffectsEnabled="true"
            android:theme="@style/Theme.AppCompat.Light.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.CALL_BUTTON" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.nfc.action.TAG_DISCOVERED" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.nfc.action.NDEF_DISCOVERED" />

                <data android:mimeType="text/pg" />
            </intent-filter>

            <meta-data
                android:name="android.nfc.action.TECH_DISCOVERED"
                android:resource="@xml/nfc_type" />
        </activity>

        <receiver
            android:name=".AppDeviceAdmin"
            android:description="@string/app_name"
            android:label="@string/app_name"
            android:permission="android.permission.BIND_DEVICE_ADMIN">
            <meta-data
                android:name="android.app.device_admin"
                android:resource="@xml/app_device_admin" />
            <intent-filter>
                <action android:name="android.app.action.PROFILE_PROVISIONING_COMPLETE" />
                <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
            </intent-filter>
        </receiver>

    </application>

</manifest>

例外はありませんlogcatでは、NFCが読み込むseensであっても自分のアプリケーションに配信されていません。()がバックグラウンドから戻って取得し、携帯電話でもonPause(ないNFCを読み取った後、onResume()は、私のアプリケーションでトリガされています)

これまでのところ、私はこの制限については何も見つけられませんでしたが、それは、ランチャーという自分のアプリケーションに関連していますseens。

Ra.cavalieri:

私の問題への答えを見つけた私はそう。このアプリは、合計フルスクリーン(会社の内部アプリ)私の中でそうですonCreate()し、私は様々なフラグを持っていた(他のアプリに行くために避けユーザーに)画面上のアプリを保つために可能な限りロック画面上のキーガードを回避し、問題は、私のアプリを持っていました

WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON
WindowManager.LayoutParams.FLAG_FULLSCREEN

そして、表示されるまでキーガードを防ぐ何らかの理由でアプリ(セキュリティ上の理由から、私は推測する)へのNFCの配信を無効にします(ロック画面の上にアプリを実行します)。これは内部アプリ(とすべての電話機が事前ITチームによってsetedされている)であるので、解決策は、手動で携帯電話の設定により、ロック画面からキーガードを削除し、フラグを削除することでした

WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD

そう毎回ユーザのロックとアンロック電話がSISTEM再びNFCリーダーを可能にします。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=231267&siteId=1