2013-09-03 8 views
5

Próbuję napisać wtyczkę Android do Unity3D do interfejsu z Google Play w rozliczeniach za aplikacje. Jestem świadomy, że istnieją już wtyczki do tego, ale chcę to zrobić na własną rękę.Dołącz niestandardową aktywność wewnątrz wtyczki Unity Android (bez przesłonięcia UnityPlayerActivity)?

Wygląda na to, że muszę złapać Aktywność Androida :: onActivityResult, aby obsłużyć udany zakup za pomocą pakietu IAB SDK GPlay. Mój problem polega na tym, że moja klasa Java nie zawiera działania, ponieważ chcę, aby działała w tle za rzeczywistą aplikacją Unity.

To jest kod z zestawu IAB SDK GPlay, który inicjuje proces zakupu. Jeśli przekażę "UnityPlayer.currentActivity" jako aktywność, pojawi się Google Play i możesz z powodzeniem kupić produkt. Jednak nie otrzymasz pomyślnego komunikatu do OnIabPurchaseFinishedListener. Jeśli zakupy się nie powiodą (tzn. Masz już produkt), otrzymam tam wywołanie zwrotne.

public void launchPurchaseFlow(Activity act, String sku, String itemType, int requestCode, 
         OnIabPurchaseFinishedListener listener, String extraData) 
... 
... 
act.startIntentSenderForResult(pendingIntent.getIntentSender(), 
              requestCode, new Intent(), 
              Integer.valueOf(0), Integer.valueOf(0), 
              Integer.valueOf(0)); 

Pełna Źródło tutaj: http://pastebin.com/xwUbrwTz

I tutaj jest odcinek od Google Play In App Billing SDK (przykład kodu), które stanowiska pomyślne zwrotna (który ja nie otrzymuję)

/** 
    * Handles an activity result that's part of the purchase flow in in-app billing. If you 
    * are calling {@link #launchPurchaseFlow}, then you must call this method from your 
    * Activity's {@link [email protected]} method. This method 
    * MUST be called from the UI thread of the Activity. 
    * 
    * @param requestCode The requestCode as you received it. 
    * @param resultCode The resultCode as you received it. 
    * @param data The data (Intent) as you received it. 
    * @return Returns true if the result was related to a purchase flow and was handled; 
    *  false if the result was not related to a purchase, in which case you should 
    *  handle it normally. 
    */ 
    public boolean handleActivityResult(int requestCode, int resultCode, Intent data) 

Pełna Źródło: http://pastebin.com/VTfxJhKx

Oto przykładowy kod jak Google przetwarza zwrotnego onActivityResult:

@Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     Log.d(TAG, "onActivityResult(" + requestCode + "," + resultCode + "," + data); 

     // Pass on the activity result to the helper for handling 
     if (!mHelper.handleActivityResult(requestCode, resultCode, data)) { 
      // not handled, so handle it ourselves (here's where you'd 
      // perform any handling of activity results not related to in-app 
      // billing... 
      super.onActivityResult(requestCode, resultCode, data); 
     } 
     else { 
      Log.d(TAG, "onActivityResult handled by IABUtil."); 
     } 
    } 

Teraz powód, nie chcę, aby zastąpić klasę UnityPlayerActivity (Search „Rozszerzanie UnityPlayerActivity kod Java” w Google, to drugi związek. Brak reputacji uniemożliwia umieszczenie bezpośredniego linku.), Ponieważ wymaga to modyfikacji pliku androidmanifest.xml w celu wskazania nowego "Launchera" - jest to problem, ponieważ niektóre z istniejących platform reklamowych dla systemu Android już wymagają modyfikacji program uruchamiający wskazuje własną klasę Java. Chciałbym móc współistnieć z tymi, które uniemożliwiają mi przedłużenie istniejącej działalności związanej z jednością.

Próbowałem uruchomić własną działalność w ramach mojej klasy Java (która jest tworzona przez Unity bez problemów), ale to minimalizuje aplikację Unity i ściąga pustą Aktywność - oczywiście nie to, czego chcę.

Moje pytanie (a): Czy mogę rozszerzyć/złapać/podpiąć do istniejącej klasy UnityAndroidPlayer i dodać funkcję onActivityResult (domyślnie nie ma).

Jeśli nie, czy mogę zrobić aktywność w dodatku do Androida, który nie koncentruje się na telefonie?

Jeśli nie, czy mogę zmodyfikować kod z SDK Google Play (act.startIntentSenderForResult (..)), aby powiadomić mnie w inny sposób?

Jeśli nie, co mogę zrobić?

+0

Próbuję napisać wtyczkę do rozliczeń w aplikacji i mam dokładnie to samo pytanie. Czy byłeś w stanie to rozwiązać? Podejście, które planuję, polega na posiadaniu własnej aktywności, ale nie rozpoczynam jej, dopóki nie dokonam zakupu (i mam przezroczyste tło podczas uruchamiania, więc wyświetlane jest tylko okno dialogowe zakupu). Wszystkie inne inicjalizacje i wywołania będą pochodzić z innej klasy innej niż Działalność i zamierzam użyć UnityPlayer.currentActivity dla "Kontekstu". – Goat

+0

Nie udało mi się go rozwiązać. Skończyło się na zrobieniu niestandardowej aktywności (którą przekazałem do przykładowego kodu Google Play), a następnie ręcznym ustawieniu działania do kopalni w Manifeście Androida dla Unity. Wygląda na to, że Prime31 również nie był w stanie rozwiązać tego problemu, ponieważ jego wtyczka działa w ten sam sposób. –

+0

Czy możesz wyjaśnić, co masz na myśli, mówiąc "przekazywanie go do przykładowego kodu Google Play", a także "ręczne ustawianie działania do kopalni"? Co robisz, ukrywając swoją aktywność i wyświetlając grę? – Goat

Odpowiedz

0

Najlepszą sugestią, jaką mogę podać, jest skorzystanie z opcji Eksportuj kompilację (da to projekt o wartości roboczej Eclipse, gotowy do uruchomienia). Działania Unity to po prostu kod - możesz więc zaimplementować w nich własny kod, bez konieczności ich podklasy. Oznacza to, że nie będziesz w stanie używać normalnych kompilacji Build i Build and Run (przynajmniej nie wtedy, gdy chcesz przetestować tę konkretną funkcjonalność), ale to zadziała. Aby proces był automatyczny dla każdej kompilacji, możesz napisać skrypt post-build w Unity.

Powiązane problemy