Как создать приложение android для чтения URL через NF C? - PullRequest
0 голосов
/ 11 апреля 2020

Я пытаюсь создать приложение для чтения nf c сообщений с других устройств:

AndroidManifest. xml

...
    <activity android:name=".NFCActivity">
        <intent-filter>
            <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
            <action android:name="android.nfc.action.TECH_DISCOVERED" />
            <action android:name="android.nfc.action.TAG_DISCOVERED" />
            <category android:name="android.intent.category.DEFAULT"/>
        </intent-filter>
    </activity>

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

<uses-sdk android:minSdkVersion="10"/>
<uses-feature android:name="android.hardware.nfc" android:required="true" />
<uses-permission android:name="android.permission.NFC" />

Моя активность:

class NFCActivity : AppCompatActivity() {
    override fun onNewIntent(intent: Intent) {
        super.onNewIntent(intent)

        if (NfcAdapter.ACTION_NDEF_DISCOVERED == intent.action) {
            intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES)?.also { rawMessages ->
                val messages: List<NdefMessage> = rawMessages.map { it as NdefMessage }

                println(String(messages[0].records[0].payload));
            }
        }

        val tag: Tag? = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG)
        println(tag)
    }
}

my techlist:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
    <tech-list>
        <tech>android.nfc.tech.IsoDep</tech>
        <tech>android.nfc.tech.NfcA</tech>
        <tech>android.nfc.tech.NfcB</tech>
        <tech>android.nfc.tech.NfcF</tech>
        <tech>android.nfc.tech.NfcV</tech>
        <tech>android.nfc.tech.Ndef</tech>
        <tech>android.nfc.tech.NdefFormatable</tech>
        <tech>android.nfc.tech.MifareClassic</tech>
        <tech>android.nfc.tech.MifareUltralight</tech>
    </tech-list>
</resources>

При отправке URL-адресов (с двух разных устройств) действие не вызывается. У кого-нибудь есть идея для решения?

Источник вы можете найти здесь: https://github.com/enthusiasmus/nfc

Заранее спасибо!

1 Ответ

0 голосов
/ 11 апреля 2020

Будет вызываться NFCActivity, но поскольку он ничего не делает, вы никогда не узнаете.

При использовании старого стиля получения NF C есть две возможные точки входа для данных NF C. данные через Intents.

1) Ваша активность уже запущена, и если у вас есть enableForegroundDispatch https://developer.android.com/guide/topics/connectivity/nfc/advanced-nfc#foreground -dispatch , тогда генерируемый системой намерение будет передано onNewIntent, но так как ваша NFCActivity не запущена и у вас нет enableForegroundDispatch, тогда она не будет передана onNewIntent

2) У вас установлены фильтры NF C Intent и ваше приложение не работает, тогда ваша активность запускается в первый раз, а затем вы обрабатываете намерение в onCreate, а не в onNewIntent

Это потому, что документы для onNewIntent скажем

https://developer.android.com/reference/android/app/Activity#onNewIntent ( android .content.Intent)

, когда действие перезапускается, когда он находится на вершине стека действий вместо нового экземпляра запускаемого действия, onNewIntent () будет вызываться на существующий экземпляр с Inte Не то, что использовалось для его повторного запуска.

Поскольку ваша активность не активна RE -launched onNewIntent не вызывается.

Большинство приложений I '' Мы видели, как переместить обработку Намерения в отдельный метод, например readFromIntent Затем из onCreate вызов readFromIntent, когда приложение запускается фильтрами NF C, или Из onNewIntent вызов readFromIntent, когда приложение уже запущено. и enableForegroundDispatch заставил систему отправить NF C Intent уже запущенному приложению.

Также вы можете обнаружить, что Intent не будет отображаться как NDEF_DISCOVERED, поскольку у вас нет типа данных установить в свой NF C фильтры

например


<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
    <category android:name="android.intent.category.DEFAULT"/>
    <data android:mimeType="*/*" />
</intent-filter>

с https://developer.android.com/guide/topics/connectivity/nfc/nfc#ndef -дис c но * / * получит все типы, вы можете уменьшите область видимости позже, если вам нужно.

Полный пример на https://www.codexpedia.com/android/android-nfc-read-and-write-example/

...