Autore Topic: Gestione Intent al verificarsi di un evento  (Letto 1573 volte)

Offline noiseimpera

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    samsung galaxy II
  • Sistema operativo:
    MacOSX
Gestione Intent al verificarsi di un evento
« il: 20 Giugno 2012, 16:30:43 CEST »
0
Ciao a tutti,
è da un pò che nello sviluppo di una applicazione sono bloccato con gli Intent e non riesco ad andare avanti.

In sostanza la mia applicazione, una volta rilevato un evento(nella fattispecie la ricezione di un tag NFC) piuttosto che chiamare l'applicazione standard nativa di android dovrebbe essere gestito o attraverso un metodo adhoc da me scritto o al più da una classe dello stesso package.
Ho capito che è fondamentale la questione degli intent filter nel manifest.xml e comunque questo mi servirebbe solo nel caso in cui voglio gestire l'evento attraverso una nuova classe.
Se invece volessi gestire l'evento ricezione-di-qualcosa attraverso un metodo dovrei sovrascriverne uno in particolare o lo scrivo exnovo? Se sì, come devo fare?

Grazie per l'eventuale disponibilità.

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Gestione Intent al verificarsi di un evento
« Risposta #1 il: 21 Giugno 2012, 08:18:42 CEST »
0
Gli Intent sono notifiche di eventi di sistema: per qualsiasi cosa che accade, nel sistema viene generato un Intent. Il sistema Android vede quali applicazioni si dichiarano come riceventi di tale Intent (lo dichiari nel manifest) e permette all'utente di scegliere quale applicazione usare. Esempio, quando voglio aprire un sito web, mi si presenta la scelta tra browser di sistema e firefox; se prima di scegliere spunto la casellina per memorizzare la scelta, poi non me lo chiede più.

Quindi direi che devi comunque usare gli Intent.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline noiseimpera

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    samsung galaxy II
  • Sistema operativo:
    MacOSX
Re:Gestione Intent al verificarsi di un evento
« Risposta #2 il: 21 Giugno 2012, 10:34:39 CEST »
0
grazie bradipao. ho già dichiarato l'intent sul manifest ma la situazione non si è risolta, alla ricezione del tag nfc parte l'applicazione nativa android che gestisce i tag e non l'activity della mia app. ti allego il manifest.xml, se puoi dare un'occhiata mi saresti di grande aiuto:

Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="saverio.test.places"
   android:versionCode="1"
   android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="10" />
    <uses-permission android:name="android.permission.NFC" />
    <uses-permission android:name="android.permission.CALL_PHONE" />
   
   

    <application
       android:icon="@drawable/ic_launcher"
       android:label="@string/app_name" >
        <activity
           android:name=".NFCtagPlActivity"
           android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
                android:name=".tagView"
           android:label="@string/app_name" >
            <intent-filter>
                        <action android:name="android.nfc.action.NDEF_DISCOVERED"/>                            
                        <category android:name="android.intent.category.DEFAULT"/>
                </intent-filter>
        </activity>
    </application>

</manifest>

Offline noiseimpera

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    samsung galaxy II
  • Sistema operativo:
    MacOSX
Re:Gestione Intent al verificarsi di un evento
« Risposta #3 il: 21 Giugno 2012, 10:42:19 CEST »
0
Non è che forse ho bisogno di gestire i tag NFC che ricevo con un Intent receiver? Gli intent filter vanno dichiarati anche nelle activity?
« Ultima modifica: 21 Giugno 2012, 10:50:43 CEST da noiseimpera »

Offline DarnellNajanReed

  • Utente normale
  • ***
  • Post: 359
  • Respect: +49
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    LG Optimus One, Acer Iconia A500/501, Asus Transformer Prime, Galaxy ACE, Galaxy S Plus, Galaxy S Advance P, Galaxy Tab 2 7.0, Google Nexus 7
  • Play Store ID:
    Luigi Notaro
  • Sistema operativo:
    OS X 10.8.3
Re:Gestione Intent al verificarsi di un evento
« Risposta #4 il: 21 Giugno 2012, 10:51:19 CEST »
0
Ok che hai registrato il filter nel manifest....ma poi l'evento di ricezione lo gestisci?

Offline noiseimpera

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    samsung galaxy II
  • Sistema operativo:
    MacOSX
Re:Gestione Intent al verificarsi di un evento
« Risposta #5 il: 21 Giugno 2012, 11:00:11 CEST »
0
sì, a regola sì. ho la mia tagView che dovrebbe fare proprio questo, però ci sta che mi sfugge qualcosa. ne approfitto della tua gentilezza e ti posto il codice dell'activity che dovrebbe essere associata all'evento "android.nfc.action.NDEF_DISCOVERED".

Codice (Java): [Seleziona]
package saverio.test.places;

import android.app.Activity;
import android.content.Intent;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.os.Bundle;
import android.os.Parcelable;
import android.util.Log;
import android.widget.LinearLayout;
import android.widget.TextView;

public class tagView extends Activity {
       
         static final String TAG = "ViewTag";

            /**
             * This activity will finish itself in this amount of time if the user
             * doesn't do anything.
             */

            static final int ACTIVITY_TIMEOUT_MS = 1 * 1000;

            TextView mTitle;

            LinearLayout mTagContent;
           
            TextView ris;

            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.tag_view);
                mTagContent = (LinearLayout) findViewById(R.id.list);
                mTitle = (TextView) findViewById(R.id.title);
                    ris=(TextView)findViewById(R.id.risult);

                resolveIntent(getIntent());
            }
           
            void resolveIntent(Intent intent) {
                // Parse the intent
                String action = intent.getAction();
                if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) {
                    // When a tag is discovered we send it to the service to be save. We
                    // include a PendingIntent for the service to call back onto. This
                    // will cause this activity to be restarted with onNewIntent(). At
                    // that time we read it from the database and view it.
                    Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
                    NdefMessage[] msgs;
                    if (rawMsgs != null) {
                        msgs = new NdefMessage[rawMsgs.length];
                        for (int i = 0; i < rawMsgs.length; i++) {
                            msgs[i] = (NdefMessage) rawMsgs[i];
                        }
                    } else {
                        // Unknown tag type
                        byte[] empty = new byte[] {};
                        NdefRecord record = new NdefRecord(NdefRecord.TNF_UNKNOWN, empty, empty, empty);
                        NdefMessage msg = new NdefMessage(new NdefRecord[] {record});
                        msgs = new NdefMessage[] {msg};
                    }
                    // Setup the views
                    //setTitle(R.string.title_scanned_tag);
                    buildTagViews(msgs);
                } else {
                    Log.e(TAG, "Unknown intent " + intent);
                    finish();
                    return;
                }
            }
           
            void buildTagViews(NdefMessage[] msgs) {
                if (msgs == null || msgs.length == 0) {
                    return;
                }
                NdefRecord[] tagArr=msgs[0].getRecords();
                ris.setText(tagArr[0].toString());  
            }
           
            @Override
            public void onNewIntent(Intent intent) {
                setIntent(intent);
                resolveIntent(intent);
            }
}
                           

comunque, al di là, della gestione dell'evento vero e proprio(ricezione del tag nfc) l'app non va nemmeno nel layout della mia "seconda" activity deputata alla gestione ma viene "scavalcata" dall'applicazione di sistema per i tag nfc

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Gestione Intent al verificarsi di un evento
« Risposta #6 il: 21 Giugno 2012, 14:20:08 CEST »
0
non funziona perchè molto probabilmente il tag non è NDEF.
Se si legge bene la documentazione (che è tosta, lo ammetto), c'è spiegato bene come gestire i tag.
NDEF è un tag formattato ad hoc, ma se te compri il tag non sarà mai NDEF, ma devi gestire l'intent nel formato TAG o TECH.
Attaccati in debug al telefono, vai sul logcat, svuotalo (per pulizia) e poi avvicina il tag.
Nel logcat verrà fuori una stringa con scritto l'intent e l'activity lanciate, vedrai che l'intent non è NDEF ma (a memoria), TECH.
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline noiseimpera

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    samsung galaxy II
  • Sistema operativo:
    MacOSX
Re:Gestione Intent al verificarsi di un evento
« Risposta #7 il: 26 Giugno 2012, 11:20:35 CEST »
0
grazie nicola, scusa se non ho dato alcuna risposta ma ho avuto problemi con l'account di posta.
ho fatto come mi hai detto, collegato il telefono in debug e fra la miriade di informazioni del logcat ho selezionato queste che potrebbero aiutarti per aiutarmi a risolvere il problema :)
in realtà non so se sono quelle "sensibili" al problema, ad ogni modo:
Codice: [Seleziona]
06-26 11:03:04.503: D/NfcService(2223): mock NDEF tag, starting corresponding activity

06-26 11:03:04.503: D/NfcService(2223): TAG: Tech [android.nfc.tech.Ndef]

06-26 11:03:04.503: D/NfcService(2223): Dispatching tag

06-26 11:03:04.503: D/NfcService(2223): TAG: Tech [android.nfc.tech.Ndef]

06-26 11:03:04.563: I/ApplicationPolicy(1991): isIntentDisabled start :Intent { act=android.nfc.action.NDEF_DISCOVERED typ=text/plain (has extras) }

06-26 11:03:04.563: I/ApplicationPolicy(1991): isIntentDisabled resolve info :null

06-26 11:03:04.563: I/ApplicationPolicy(1991): isIntentDisabled return :true


sembrerebbe che come dici tu viene inviato un tag TECH, poi non capisco perchè sembra che l'intent sia disabilitato.
inoltre viene visualizzato anche questo messaggio:
Codice: [Seleziona]

06-26 11:15:50.078: D/NfcService(2223): No activities for NDEF handling of Intent { act=android.nfc.action.NDEF_DISCOVERED typ=text/plain (has extras) }


ti ringrazio per la tua gentilezza e disponibilità

ps. io non ho comprato il tag, invio solamente tag di testo da un dispositivo all'altro.

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Gestione Intent al verificarsi di un evento
« Risposta #8 il: 26 Giugno 2012, 13:51:08 CEST »
0
purtroppo sono un po impegnato a lavoro e non riesco a seguire bene il codice che scrivi, ma in generale ti consiglio di leggere bene la pagina:
NFC Basics | Android Developers
ed in particolare l'immagine


poi hai dimenticato il tipo di dato per l'intent NDEF, ossia il text/plain (oppure */* se li vuoi tutti)
Codice (XML): [Seleziona]
<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
    <category android:name="android.intent.category.DEFAULT"/>
    <data android:mimeType="text/plain" />
</intent-filter>
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline noiseimpera

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    samsung galaxy II
  • Sistema operativo:
    MacOSX
Re:Gestione Intent al verificarsi di un evento
« Risposta #9 il: 26 Giugno 2012, 14:49:18 CEST »
0
Off-Topic:
poi hai dimenticato il tipo di dato per l'intent NDEF, ossia il text/plain (oppure */* se li vuoi tutti)
grazie, era proprio questo.
che stronzo che sono.

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Gestione Intent al verificarsi di un evento
« Risposta #10 il: 26 Giugno 2012, 16:09:15 CEST »
0
Off-Topic:
poi hai dimenticato il tipo di dato per l'intent NDEF, ossia il text/plain (oppure */* se li vuoi tutti)
grazie, era proprio questo.
che stronzo che sono.
non esagerare, solo disattento! :D
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia