2013-09-03 27 views
5

Tôi đang cố gắng viết một Plugin Android cho Unity3D để giao tiếp với Thanh toán trong ứng dụng của Google Play. Tôi biết rằng có sẵn các plugin hiện có cho điều này, nhưng tôi muốn tự mình làm điều đó.Bao gồm Hoạt động tùy chỉnh bên trong Plugin Unity trên Android (Không ghi đè UnityPlayerActivity)?

Có vẻ như tôi cần phải nắm bắt Hoạt động của Android :: onActivityResult để xử lý giao dịch mua thành công thông qua SDK Ilay GPlay. Vấn đề của tôi là lớp Java của tôi không chứa một Activity vì tôi muốn nó chạy trong nền phía sau ứng dụng Unity thực tế.

Đây là mã từ SDK IAB GPlay để bắt đầu luồng Mua. Nếu tôi chuyển "UnityPlayer.currentActivity" làm hoạt động, Google Play bật lên và bạn có thể mua sản phẩm thành công. Tuy nhiên, bạn không nhận được thông báo thành công cho OnIabPurchaseFinishedListener. Nếu việc mua hàng không thành công (ví dụ: bạn đã sở hữu sản phẩm) thì tôi sẽ nhận được cuộc gọi lại ở đó.

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

Full Source đây: http://pastebin.com/xwUbrwTz

Và đây là phần từ Google Play Trong App Billing SDK (ví dụ code) mà bài viết gọi lại thành công (mà tôi không nhận được)

/** 
    * 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) 

Toàn bộ nguồn: http://pastebin.com/VTfxJhKx

Dưới đây là cách mã ví dụ của Google xử lý yêu cầu gọi lại 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."); 
     } 
    } 

Bây giờ, lý do tôi không muốn ghi đè lớp UnityPlayerActivity (Tìm kiếm "Mở rộng mã UnityPlayerActivity Java" trên Google, đó là liên kết thứ hai. Thiếu danh tiếng ngăn tôi đăng liên kết trực tiếp.) Là bởi vì điều này yêu cầu bạn sửa đổi androidmanifest.xml để trỏ tới "Trình khởi chạy" mới - đây là một vấn đề vì một số nền tảng Quảng cáo hiện có cho Android đã yêu cầu bạn sửa đổi trình khởi chạy trỏ đến lớp Java của riêng họ. Tôi muốn có thể cùng tồn tại với những thứ ngăn cản tôi mở rộng hoạt động Unity hiện tại.

Tôi đã cố gắng khởi động Hoạt động của riêng mình trong lớp Java (được sinh ra bởi Unity không có vấn đề) nhưng tối thiểu hóa ứng dụng Unity và kéo hoạt động trống - rõ ràng không phải là điều tôi muốn.

(Các) câu hỏi của tôi: Tôi có thể mở rộng/bắt/móc vào lớp UnityAndroidPlayer hiện tại và thêm hàm onActivityResult (không có mặc định).

Nếu không, tôi có thể thực hiện hoạt động trong plugin Android không tập trung vào điện thoại không?

Nếu không, tôi có thể sửa đổi mã từ Google Play SDK (act.startIntentSenderForResult (..)) để thông báo cho tôi theo cách khác không?

Nếu không, tôi có thể làm gì?

+0

Tôi đang cố viết một plugin cho Thanh toán trong ứng dụng và có cùng một câu hỏi. Bạn có thể giải quyết vấn đề này không? Cách tiếp cận tôi đang lập kế hoạch là có Hoạt động của riêng tôi nhưng không bắt đầu cho đến khi tôi mua hàng (và có nền trong suốt khi nó được khởi chạy để chỉ hộp thoại mua). Tất cả các khởi tạo và cuộc gọi khác sẽ là từ một lớp không hoạt động khác và tôi định sử dụng UnityPlayer.currentActivity cho "Context". – Goat

+0

Tôi không thể giải quyết nó. Tôi đã kết thúc chỉ thực hiện một hoạt động tùy chỉnh (mà tôi đã chuyển đến mã ví dụ của Google Play) và sau đó thiết lập hoạt động theo cách thủ công để tôi khai thác trong Tệp kê khai của Android cho Unity. Có vẻ như Prime31 cũng không thể giải quyết vấn đề này vì plugin của anh ấy hoạt động theo cùng một cách. –

+0

Bạn có thể vui lòng làm rõ ý của bạn bằng cách "chuyển nó vào mã ví dụ của Google Play" cũng như "đặt hoạt động theo cách thủ công cho tôi" không? Bạn làm gì để ẩn Hoạt động của mình và hiển thị trò chơi? – Goat

Trả lời

0

Đề xuất tốt nhất tôi có thể đưa ra là sử dụng tùy chọn Xuất bản dựng (điều này sẽ cung cấp cho bạn một dự án giá trị không gian làm việc Eclipse, sẵn sàng để chạy). Các hoạt động của Unity chỉ là mã - vì vậy bạn có thể móc mã của riêng bạn vào chúng, mà không cần phải phân lớp chúng. Điều này có nghĩa là bạn sẽ không thể sử dụng các bản dựng Xây dựng và Xây dựng bình thường (ít nhất là không khi bạn muốn thử nghiệm chức năng cụ thể này), nhưng nó sẽ hoạt động. Để thực hiện quá trình tự động trên mỗi bản dựng, bạn có thể viết một đoạn mã sau khi xây dựng trong Unity.

Các vấn đề liên quan