2013-07-25 6 views
5

Ho un determinato intento (NDEF_DISCOVERED), alcuni dei quali non riesco a gestire correttamente, quindi voglio reindirizzare quelli al gestore di NFC predefinito di Android.Come passare intento Android a chiunque tranne la mia app?

così prendo l'intento, setComponent(null), e quindi startActivity(intent)

Ma .. si torna sempre alla mia app in un ciclo infinito di intenti lancio.

C'è un modo per inviare un messaggio a chiunque tranne la mia app? O inviarlo al gestore nfc predefinito di Android?

EDIT: così ho usato la risposta di Vikram per interrogare il packagemanager per possibili attività per gestire il mio intento, quindi in loop attraverso e hanno trovato l'attività con la massima priorità (che non sono io) e mandò un intento esplicito di loro.

+0

Può essere utile per voi http://stackoverflow.com/questions/8615240/start-an-android-app-intent-from-an-nfc-tag?rq=1 – Aravin

+0

'Ma .. viene sempre torna alla mia app in un ciclo infinito di lanci intenzionali. Cosa intendi esattamente? Si prega di mostrare il codice in cui si crea l'intento e il manifest. – Simon

+0

domanda modificata – ginsunuva

risposta

5

In questo caso, una finestra di dialogo selettore/popup personalizzata sarà più adatta a te. Invece di lanciare un intent, usa lo PackageManager su queryIntentActivities(Intent, int). Dalle List<ResolveInfo> che queryIntentActivities(Intent, int) rendimenti, filtrare la propria applicazione utilizzando il packageName:

String packageName = ""; 
for(ResolveInfo resInfo : resolvedInfoList) { 

    packageName = resInfo.activityInfo.applicationInfo.packageName; 

    // Exclude `packageName` from the dialog/popup that you show 

} 

Edit 1:

Il codice seguente consente di creare e mostrare un PopupWindow ogni volta showList() si chiama. Il file di layout XML utilizzato per tornare popupView contiene altro che un LinearLayout (R.layout.some_popup_view):

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:id="@+id/llPopup" 
    android:orientation="vertical" > 

</LinearLayout> 

Questo codice è solo una semplice dimostrazione. Affinché sia ​​tutto utilizzabile, probabilmente sarà necessario aggiungere uno ListView con un adattatore personalizzato a questo PopupWindow. Nello OnClickListener per lo ListView, si recupererà il nome del pacchetto dell'Applicazione su cui l'utente fa clic e si genererà l'intenzione di avviare quell'attività. A partire da ora, il codice mostra solo come filtrare la tua applicazione utilizzando un selettore personalizzato. Nel blocco if, sostituire "com.example.my.package.name" con il nome del pacchetto dell'app.

public void showList() { 

    View popupView = getLayoutInflater().inflate(R.layout.some_popup_view, null); 

    PopupWindow popupWindow = new PopupWindow(popupView, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 

    LinearLayout llPopup = (LinearLayout) popupView.findViewById(R.id.llPopup); 

    PackageManager pm = getPackageManager(); 

    Intent intent = new Intent(); 

    // In my case, NfcAdapter.ACTION_NDEF_DISCOVERED was not returning anything 
    //intent.setAction(NfcAdapter.ACTION_NDEF_DISCOVERED); 
    intent.setAction(NfcAdapter.ACTION_TECH_DISCOVERED); 

    List<ResolveInfo> resolvedInfoList = pm.queryIntentActivities(intent, 0); 

    String packageName = ""; 

    for(ResolveInfo resInfo : resolvedInfoList) { 

     packageName = resInfo.activityInfo.applicationInfo.packageName; 

     // Exclude `packageName` from the dialog/popup that you show 
     if (!packageName.equals("com.example.my.package.name")) { 

      TextView tv = new TextView(this); 

      tv.setText(packageName); 

      llPopup.addView(tv); 
     }    

    } 

    popupWindow.showAtLocation(popupView, Gravity.CENTER, 0, 0); 
} 
+0

Quindi posso creare il selettore invece di farlo Android? Come potrei fare l'intero processo? Se potessi, puoi mostrarmi esattamente quello che ho bisogno di scrivere? Come faccio ad "escludere" il mio nome per esempio? – ginsunuva

+0

Inoltre, una volta apparso un popup di scelta NFC per me, perché avevo installato 2 lettori nfc, ma mostrava solo quei due. Non so se il lettore nfc di default di Android verrà visualizzato in un selettore. – ginsunuva

+0

@ginsunuva Non sarò in grado di aggiornare la mia risposta in questo momento mentre sono occupato. Lascerò un commento quando lo farò. – Vikram

1

c'è anche un'altra opzione di fare un proprio selettore qui (diverso selettore cercando potrebbe confondere l'utente)

public void rethrowIntentExcludingSelf() { 
    final ComponentName component = new ComponentName(this, getClass()); 
    this.getPackageManager().setComponentEnabledSetting(component, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); 

    final Intent intent = this.getIntent(); 
    intent.setComponent(null); 
    this.startActivity(intent); 
    new android.os.Handler().postDelayed(
      new Runnable() { 
       @Override 
       public void run() { 
        getPackageManager().setComponentEnabledSetting(component, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); 
       } 
      },250); 
} 

lo sto usando - e funziona benissimo - proprio non piace questo magia costante 250 - ma non vedo ancora un altro modo.