2013-07-25 10 views
5

Mam pewien zamiar (NDEF_DISCOVERED), z których niektóre nie mogę obsłużyć poprawnie, więc chcę przekierować je do domyślnego programu obsługi Android nfc.Jak przekazywać intencje Androida dowolnej osobie, ale mojej własnej aplikacji?

więc biorę intencję, setComponent(null), a następnie startActivity(intent)

Ale .. to zawsze wraca do mojej aplikacji w nieskończonej pętli intencyjnego rzucania.

Czy istnieje sposób, w jaki mogę wysłać wiadomość do dowolnej osoby oprócz mojej aplikacji? Lub wysłać go do domyślnego programu obsługi Android nfc?

EDYTOWANIE: Więc użyłem odpowiedzi Vikram, aby zapytać menedżera pakietów o możliwe działania, aby obsłużyć moje intencje, następnie zapętliłem się i odnalazłem działanie o najwyższym priorytecie (kim nie jestem ja) i wysłałem do nich wyraźne intencje.

+0

Może być pomocne dla Ciebie http://stackoverflow.com/questions/8615240/start-an-android-app-intent-from-an-nfc-tag?rq=1 – Aravin

+0

'Ale ... zawsze przychodzi z powrotem do mojej aplikacji w nieskończonej pętli intencji rzucania "Co dokładnie masz na myśli? Pokaż kod, w którym tworzysz intencję i manifest. – Simon

+0

edytowane pytanie – ginsunuva

Odpowiedz

5

Niestandardowe okno dialogowe wyboru/popup będzie dla Ciebie lepsze w tym przypadku. Zamiast uruchamiać zamiar, użyj PackageManager do queryIntentActivities(Intent, int). Z List<ResolveInfo> że queryIntentActivities(Intent, int) zwrotów, odfiltrować swoją aplikację za pomocą packageName:

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

    packageName = resInfo.activityInfo.applicationInfo.packageName; 

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

} 

Edycja 1:

Poniższy kod będzie tworzyć i pokazać PopupWindow ilekroć showList() nazywa. Plik xml układ stosowany do powrotu popupView zawiera nic poza 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> 

Ten kod jest tylko prosta demonstracja. Aby było to prawie możliwe do użycia, prawdopodobnie będziesz musiał dodać ListView z niestandardowym adapterem do tego PopupWindow. W wersji OnClickListener dla ListView zostanie pobrana nazwa pakietu aplikacji, którą użytkownik kliknie, i wygenerowana zostanie intencja rozpoczęcia tej czynności. W tej chwili kod wyświetla tylko jak odfiltrować własną aplikację za pomocą niestandardowego wyboru. W bloku if zastąp nazwę "com.example.my.package.name" nazwą pakietu aplikacji.

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

Więc mogę stworzyć wybieracz zamiast androida, który to robi? Jak mogę zrobić cały proces? Jeśli możesz, możesz pokazać mi dokładnie to, co muszę napisać? Jak mogę "wykluczyć" moje imię na przykład? – ginsunuva

+0

Również, gdy pojawiło się okno wyboru NFC, ponieważ miałem zainstalowane 2 czytniki nfc, ale pokazywałem tylko te dwa. Nie wiem, czy domyślny czytnik nfc androida byłby wyświetlany w selektorze. – ginsunuva

+0

@ginsunva Nie będę mógł zaktualizować odpowiedzi teraz, ponieważ jestem zajęty. Zostawię komentarz, kiedy to zrobię. – Vikram

1

jest też inna opcja niż zrobić własne Chooser tutaj (inna patrząc chooser może zmylić użytkownika)

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); 
} 

Używam go - i to działa dobrze - po prostu nie podoba mi się to magiczna stała 250 - ale nie widzisz jeszcze innej drogi.

Powiązane problemy