Skocz do zawartości
matej1410

Powrót do aktywności sprzed skanowaniem NFC

    Rekomendowane odpowiedzi

    Napisano (edytowane)

    Witam serdecznie.

    Posiadam w programie takie oto aktywności:

    MainActivity

    SecondActivity

    ThirdActivity.

    Ponadto mam ustawiony intent filter dla NFC w taki sposób, że po zbliżeniu smartfona do breloka, aplikacja uruchamia mi MainActivity niezależnie z poziomu jakiej aktywności to robię, za każdym razem odsyłając mnie do MainActivity.

    Jak zrobić, żeby po zeskanowaniu breloka, z poziomu aktywności ThirtActivity nie wracać do MainActivity tylko pozostać w ThirdActivity.

    Takie coś ma sens w ogóle?  

     

    z góry serdecznie dziękuję za odpowiedzi

     

     

     

    Edytowane przez mmaciejow
    poprawa tematu

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    Wygląda to tak jakby aplikacja się odpalała ponownie. Co jest widoczne w logach aplikacji? 

    • Piwko! 1

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    Napisano (edytowane)

    Przepraszam, że z takim opóźnieniem.

    Zmiana planów.  Nie wiem czy to będzie do końca pasowało do tego tematu, ale zawsze mogę zmienić jego nazwę ?

    Zrobię tak, że w każdej innej aktywności oprócz głównej będę ignorował zbliżenie i odczytywanie danych z taga a MainActivity będzie miała ustawione "singleTop".

    Ignorowanie można wykonać poprzez ForegroundDispatch z tego co widzę (https://developer.android.com/guide/topics/connectivity/nfc/advanced-nfc). Spróbuję to zaimplementować. Rozumiem, że można a raczej należy go zaimplementować w każdej aktywności, w której nie chcemy, aby nastąpiło przeskanowanie i odesłanie do aktywności głównej, która z kolei posiada intent filter, wywołujący ją po przeskanowaniu taga?

     

    dodana zawartość

    Jeszcze inaczej. Muszę zacząć chyba od tego:

    Proszę zwrócić uwagę na to, że po odczytaniu tagu pojawia się nowe okienko z napisem usługa NFC. Jest to nowa kopia aktywności zatytułowanej jako czytnik tagów (i jest to MainActivity). W manifeście tej aktywności dodałem linijkę android:launchmode="singleTop" chcąc uzyskać taki efekt, że po przyłożeniu taga do smartfona powinna się uruchomić aktywność MainActivity, ale nie w nowym okienku a po prostu  w tym samym, ale nie uzyskuje zamierzonego efektu i ciągle pojawia się nowe okienko "Usługa NFC", któe jest kopią MainActivity, ale z tytułem "Usługa NFC" a nie "Czytnik tagów". Proszę o pomoc jak to rozwiązać.

     

     

    Activity.thumb.png.69bfd9906ef787502f9dcc7c4d8d646e.png1810888740_afterscanning.thumb.png.53dd08e4853acdac4c32fc4a4f2ccfeb.png

     

    Edytowane przez matej1410

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    6 godzin temu, matej1410 napisał:

    W manifeście tej aktywności dodałem linijkę android:launchmode="singleTop"

    W manifeście nie powinno tego być. Flagę tą dodajesz do PendingIntent tak jak jest w dokumentacji, którą podlinkowałeś. W PendingIntent umieszczasz swoją MainActivity. Jeszcze musisz nadpisać metodę OnNewIntent(Intent intent), żeby przechwycić taga z NFC. Jak będziesz miał problemy to dodaj kod. Zobaczymy co da się zrobić ?

    • Piwko! 1

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    Wrzucam kawałek kodu. Jest to MainActivity:

    package com.example.komuter007.skanernfc;
    
    import android.content.Intent;
    import android.nfc.NfcAdapter;
    import android.nfc.Tag;
    import android.nfc.tech.MifareUltralight;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.util.Log;
    import android.widget.Toast;
    
    import java.io.IOException;
    
    public class MainActivity extends AppCompatActivity {
    
        private NfcAdapter nfcAdapter;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            
            nfcAdapter = NfcAdapter.getDefaultAdapter(this);
            if (nfcAdapter == null) {
                Toast.makeText(this, "Urządzenie nie wspiera NFC", Toast.LENGTH_LONG).show();
                finish();
            } else if (!nfcAdapter.isEnabled()) {
                Toast.makeText(this, "NFC wyłączone, włącz NFC", Toast.LENGTH_LONG).show();
            }
    
    
            Intent intent = getIntent();
            String action = intent.getAction();
            if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)) {
                Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
                MifareUltralight ultralight = MifareUltralight.get(tag);
    
                try {
                    ultralight.connect();
                    ultralight.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
    
    
            }
        }}

    a to jest Manifest:

     

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.komputer007.skanernfc">
    
        <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:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
    
                <intent-filter>
                    <action android:name="android.nfc.action.TECH_DISCOVERED" />
                    <action android:name="android.intent.category.DEFAULT" />
                </intent-filter>
    
                <meta-data
                    android:name="android.nfc.action.TECH_DISCOVERED"
                    android:resource="@xml/nfc_tech_filter" />
            </activity>
        </application>
    
    </manifest>

    Screenshot_20190726-092411.thumb.png.4827bef12c10ee8bd468268b11c1beb1.png

     

    I znów po zbliżeniu taga otwiera się kolejne okienko, którego nie chcę ?

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    W metodzie onCreate nie masz utworzonego PendingIntent

    PendingIntent mPendingIntent
    //....
    onCreate() {
      mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,
            getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
    }

    Musisz nadpisać jeszcze metodę onResume:

     @Override
     protected void onResume() {
         nfcAdapter.enableForegroundDispatch(this, mPendingIntent, null, null);
    }

    Również w onPause:

     @Override
     protected void onPause() {
         nfcAdapter.disableForegroundDispatch(this);
    }

    No i na samym końcu onNewIntent:

     @Override
     protected void onNewIntent(Intent intent){    
       Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
     }

     

    • Piwko! 1

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    Napisano (edytowane)

    Zmodyfikowałem kod zgodnie  z tym, ale teraz w ogóle nie ma reakcji na zbliżenie taga a powinno wejść do try catcha i wyświetlić: Log.d("odczytano","sukces!");

    package com.example.komuter007.skanernfc;
    
    import android.app.PendingIntent;
    import android.content.Intent;
    import android.nfc.NfcAdapter;
    import android.nfc.Tag;
    import android.nfc.tech.MifareUltralight;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.util.Log;
    import android.widget.Toast;
    
    import java.io.IOException;
    
    public class MainActivity extends AppCompatActivity {
    
        private NfcAdapter nfcAdapter;
        PendingIntent mPendingIntent;
        byte[] tablica_odczytane01  = new byte[16];
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,
                    getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
    
            Log.d("intencje", "onCreate");
            nfcAdapter = NfcAdapter.getDefaultAdapter(this);
            if (nfcAdapter == null) {
                Toast.makeText(this, "Urządzenie nie wspiera NFC", Toast.LENGTH_LONG).show();
                finish();
            } else if (!nfcAdapter.isEnabled()) {
                Toast.makeText(this, "NFC wyłączone, włącz NFC", Toast.LENGTH_LONG).show();
            }
            
            Intent intent = getIntent();
            String action = intent.getAction();
            if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)) {
                Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
                MifareUltralight ultralight = MifareUltralight.get(tag);
    
                try {
                    ultralight.connect();
    
                    tablica_odczytane01=ultralight.readPages(4);
                            Log.d("odczytano","sukces!");
    
                    ultralight.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
    
    
            }
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            nfcAdapter.enableForegroundDispatch(this, mPendingIntent, null, null);
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            nfcAdapter.disableForegroundDispatch(this);
        }
    
        @Override
        protected void onNewIntent(Intent intent){
            Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
        }
    
    }

     

    Edytowane przez matej1410

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    Napisano (edytowane)
    14 minut temu, matej1410 napisał:

    ale teraz w ogóle nie ma reakcji na zbliżenie taga a powinno wejść do try catcha i wyświetlić: Log.d("odczytano","sukces!");

    Przenieś tego try catcha do metody onNewIntent, teraz tam powinien być przechwytywany.

    Edytowane przez Coders Lab
    • Piwko! 1

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    Napisano (edytowane)

    Przeniosłem w ten sposób, ale dalej nie ma reakcji. Swoją drogą bardzo dziękuję za pomoc i cierpliwość ?

    package com.example.komputer007.skanernfc;
    
    import android.app.PendingIntent;
    import android.content.Intent;
    import android.nfc.NfcAdapter;
    import android.nfc.Tag;
    import android.nfc.tech.MifareUltralight;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.util.Log;
    import android.widget.Toast;
    
    import java.io.IOException;
    
    public class MainActivity extends AppCompatActivity {
    
        private NfcAdapter nfcAdapter;
        PendingIntent mPendingIntent;
        byte[] tablica_odczytane01  = new byte[16];
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,
                    getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
    
            Log.d("intencje", "onCreate");
            nfcAdapter = NfcAdapter.getDefaultAdapter(this);
            if (nfcAdapter == null) {
                Toast.makeText(this, "Urządzenie nie wspiera NFC", Toast.LENGTH_LONG).show();
                finish();
            } else if (!nfcAdapter.isEnabled()) {
                Toast.makeText(this, "NFC wyłączone, włącz NFC", Toast.LENGTH_LONG).show();
            }
            
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            nfcAdapter.enableForegroundDispatch(this, mPendingIntent, null, null);
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            nfcAdapter.disableForegroundDispatch(this);
        }
    
        @Override
        protected void onNewIntent(Intent intent){
            
            intent = getIntent();
            String action = intent.getAction();
            if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)) {
                Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
                MifareUltralight ultralight = MifareUltralight.get(tag);
    
                try {
                    ultralight.connect();
    
                    tablica_odczytane01=ultralight.readPages(4);
                    Log.d("odczytano","sukces!");
    
                    ultralight.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
    
    
            }
        }
    
    }

     

    dodana zawartość

    Z tego co zaobserwowałem teraz jest tak, że:

    1. Przykładam tag do smartfona i wteny wywoływana jest onPause() w której wywoływane jest 

    nfcAdapter.disableForegroundDispatch(this);

    2. Nastepnie onNewIntent() w którym nie wchodzimy w  

    if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)){...} dlaczego ten if nie jest spełniony?

    3. na koncu OnResume() i 

    nfcAdapter.enableForegroundDispatch(this, mPendingIntent, null, null);

     

     

     

    Edytowane przez matej1410

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    Za ostro poleciałeś z tym kopiowaniem :P W metodzie onNewIntent masz już dostępnego Taga. Nie musisz robić intent = getIntent(); String action = intent.getAction();
    Wystarczy:

     Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

    I niżej już:

     MifareUltralight ultralight = MifareUltralight.get(tag);
    
                try {
                    ultralight.connect();
    
                    tablica_odczytane01=ultralight.readPages(4);
                    Log.d("odczytano","sukces!");
    
                    ultralight.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
    Cytat

     Swoją drogą bardzo dziękuję za pomoc i cierpliwość

    Nie ma problemu ;)

    • Piwko! 1

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

    Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

    Zarejestruj nowe konto

    Załóż nowe konto. To bardzo proste!

    Zarejestruj się

    Zaloguj się

    Posiadasz już konto? Zaloguj się poniżej.

    Zaloguj się

    • Ostatnio przeglądający   0 użytkowników

      Brak zarejestrowanych użytkowników przeglądających tę stronę.

    x