日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Unity接入GooglePlay内购V4(源生Android方式)

發(fā)布時間:2023/12/14 Android 82 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Unity接入GooglePlay内购V4(源生Android方式) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Unity接GooglePlay In-App Billing坑還是蠻多的,各種坑。

接的方式目前來看有三種:

  • 采用Unity IAP插件,開啟Unity的IAP Service
  • 采用Android源生接入,在Android Studio接入,然后打包出jar或aar放到Unity項目,使用Unity調(diào)用
  • 打包出Android工程,在Android工程中接入
  • 這次介紹的是第二種,使用安卓源生方式接入,因為該方式一勞永逸,新項目可以很快就完成接入。

    為什么不用第一種呢?直接導(dǎo)入IAP插件,然后設(shè)置參數(shù),就可以很快實現(xiàn)了,該方式可以直接參考google文檔。

    第一種IAP插件的缺點:

    雖然該方式只需要導(dǎo)入插件,然后進行一些參數(shù)的設(shè)置,但是此方式特別麻煩的一點是需要在Unity中開啟Service,但是開啟后又得填一大堆信息,巨麻煩無比,而且Unity的網(wǎng)絡(luò)簡直不能看,要么是打不開,要么是卡半死,而且網(wǎng)站老變,以及沒有完整的文檔。這些都是很惡心人的事情,甚至還要創(chuàng)建組織啥的,反正誰用誰惡心。

    ----------------------------------分割線------------------------------------------------------------------------

    正式接入

    接入之前需要的儲備知識是:Unity如何與Android交互

    準(zhǔn)備jar和aar

    我們的目標(biāo)是導(dǎo)出自己封裝的jar(里面封裝了接口供Unity調(diào)用,也就是橋接層),以及找到谷歌官方提供的Billing V4插件(aar)。

    因為從2021.8.2起,谷歌要求必須接入V3版以上的插件。所以我們這次干脆接了最新的V4.

    接入文檔可以參考指南:從 AIDL 遷移到 Google Play 結(jié)算庫的遷移指南

    獲取aar文件

    • 打開Android Studio,創(chuàng)建一個工程
    • 創(chuàng)建一個Module,創(chuàng)建完如下(Module要選擇Library)
    • 打開build.gradle,修改導(dǎo)出為Library,在dependencies中添加依賴,并同步。 implementation("com.android.billingclient:billing:4.0.0") 注意:plugins這邊要改為'com.android.library',導(dǎo)出才會是aar,否則是apk. plugins {id 'com.android.library' }android {compileSdkVersion 30defaultConfig {//applicationId "com.egogame.iapforgoogleplay"minSdkVersion 19targetSdkVersion 30versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8} }dependencies {implementation 'androidx.appcompat:appcompat:1.3.0'implementation 'com.google.android.material:material:1.3.0'implementation 'org.jetbrains:annotations:15.0'testImplementation 'junit:junit:4.+'androidTestImplementation 'androidx.test.ext:junit:1.1.2'androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'implementation("com.android.billingclient:billing:4.0.0") }
    • 同步完成后,在gradle緩存路徑下找到谷歌官方提供的.aar文件,復(fù)制到Unity工程Assets/Plugins/Android目錄下,待用
      文件路徑:C:\Users\xxx\.gradle\caches\modules-2\files-2.1\com.android.billingclient\billing\4.0.0\31aa58e2d4286f6b96480764e7a84d5de9935f02

    打包jar?

    • 創(chuàng)建BaseMainActivity.java類,該類創(chuàng)建了一些供Unity調(diào)用的接口格式。
      當(dāng)前類還未開始接入GP插件接口。 package com.egogame;import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject;import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.widget.Toast;public class BaseMainActivity{public static String UNITY_GO_NAME="IAP";public static final String LOG_TAG = "EgoGameLog";protected Handler uiHandler = new Handler(Looper.getMainLooper());//unity項目啟動時的上下文private Activity unityActivity;private Context context;public void Init(final String goName,final String googlePlayPublicKey){PrintLog("Init:"+goName+"===="+googlePlayPublicKey);uiHandler.post(new Runnable() {@Overridepublic void run() {UNITY_GO_NAME=goName;OnInitHandle(googlePlayPublicKey);}});}public void PrintLog(final String message,final Boolean toast){android.util.Log.d(LOG_TAG, message);uiHandler.post(new Runnable() {@Overridepublic void run() {if(toast) Toast.makeText(getActivity(), message, Toast.LENGTH_LONG).show();}});}public boolean IsIAPSupported(){return false;}final public void RequstProduct(final String idsJson){uiHandler.post(new Runnable() {@Overridepublic void run() {String[] realProducts=null;try {JSONObject jObject=new JSONObject(idsJson);JSONArray jArray=jObject.getJSONArray("productIds");realProducts=new String[jArray.length()];for (int i = 0; i < jArray.length(); i++) {realProducts[i]=jArray.getString(i);}} catch (Exception e) {PrintLog("RequstProduct數(shù)據(jù)傳輸錯誤:"+e.getMessage());}if(realProducts!=null){OnRequstProduct(realProducts);}else{RequestProductsFail("數(shù)據(jù)解析錯誤:"+idsJson);}}});}final public void BuyProduct(final String productJson){uiHandler.post(new Runnable() {@Overridepublic void run() {try {JSONObject jObject=new JSONObject(productJson);String productId=jObject.getString("productId");boolean isConsumable=jObject.getBoolean("isConsumable");OnBuyProduct(productId,isConsumable);} catch (Exception e) {PrintLog("BuyProduct數(shù)據(jù)傳輸錯誤:"+e.getMessage());}}});}protected void OnInitHandle(String googlePlayPublicKey){}protected void OnRequstProduct(String[] productId){}protected void OnBuyProduct(String productId,boolean isConsumable){}protected void BuyComplete(String productId){PrintLog("購買成功:"+productId);SendUnityMessage("ProductBuyComplete", productId);}protected void BuyCancle(String productId){PrintLog("購買取消:"+productId);SendUnityMessage("ProductBuyCancled", productId);}protected void BuyFail(String productId,String error){PrintLog("購買失敗:"+productId+"原因:"+error);try {JSONObject jObject=new JSONObject();jObject.put("productId", productId);jObject.put("error", error);SendUnityMessage("ProductBuyFailed", jObject.toString());} catch (JSONException e) {PrintLog("BuyFail數(shù)據(jù)錯誤:"+e.getMessage());}}protected void RequestProductsFail(String message){SendUnityMessage("ProductRequestFail", message);}protected void RecieveProductInfo(ArrayList<SkuItem> skuItems,ArrayList<String> invalidProductIds){JSONObject jsonObject=new JSONObject();try {JSONArray skuArray=new JSONArray();JSONObject tmpObj = null;for (int i = 0; i < skuItems.size(); i++) {SkuItem skuItem=skuItems.get(i);tmpObj = new JSONObject();tmpObj.put("productId" , skuItem.productId);tmpObj.put("title" , skuItem.title);tmpObj.put("desc" , skuItem.desc);tmpObj.put("price" , skuItem.price);tmpObj.put("formatPrice" , skuItem.formatPrice);tmpObj.put("priceCurrencyCode" , skuItem.priceCurrencyCode);tmpObj.put("skuType" , skuItem.skuType);skuArray.put(tmpObj);}JSONArray invalidArray=new JSONArray();for (int i = 0; i < invalidProductIds.size(); i++) {invalidArray.put(invalidProductIds.get(i));}jsonObject.put("skuItems", skuArray);jsonObject.put("invalidIds", invalidArray);} catch (JSONException e) {PrintLog("Json數(shù)據(jù)錯誤:"+e.getMessage());}String info=jsonObject.toString();PrintLog("當(dāng)前產(chǎn)品信息:"+info);SendUnityMessage("RecieveProductInfos", info);}public void PrintLog(String message){PrintLog(message,false);}public void SendUnityMessage(String func,String value){CallUnity(UNITY_GO_NAME, func, value);}public Activity CurrentActivity(){return getActivity();}/*** Android調(diào)用Unity的方法* @param gameObjectName 調(diào)用的GameObject的名稱* @param functionName 方法名* @param args 參數(shù)* @return 調(diào)用是否成功*/boolean CallUnity(String gameObjectName, String functionName, String args){try {Class<?> classtype = Class.forName("com.unity3d.player.UnityPlayer");Method method =classtype.getMethod("UnitySendMessage", String.class,String.class,String.class);method.invoke(classtype,gameObjectName,functionName,args);return true;} catch (ClassNotFoundException e) {System.out.println(e.getMessage());} catch (NoSuchMethodException e) {System.out.println(e.getMessage());} catch (IllegalAccessException e) {System.out.println(e.getMessage());} catch (InvocationTargetException e) {}return false;}/*** 利用反射機制獲取unity項目的上下文* @return*/Activity getActivity(){if(null == unityActivity) {try {Class<?> classtype = Class.forName("com.unity3d.player.UnityPlayer");Activity activity = (Activity) classtype.getDeclaredField("currentActivity").get(classtype);unityActivity = activity;context = activity;} catch (ClassNotFoundException e) {System.out.println(e.getMessage());} catch (IllegalAccessException e) {System.out.println(e.getMessage());} catch (NoSuchFieldException e) {System.out.println(e.getMessage());}}return unityActivity;} } package com.egogame;public class SkuItem {public String productId;public String title;public String desc;public String price;public String formatPrice;//格式化價格,包括其貨幣符號public String priceCurrencyCode;//貨幣代碼public String skuType;//內(nèi)購還是訂閱 }
    • 創(chuàng)建MainActivity類,開始接入billing插件(該命名為Activity其實沒有繼承Activity,因為繼承Activity后,需要Unity那邊AndroidManfiest文件指定為Activity才能生效,所以這里不采用繼承Activity) package com.egogame;import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.text.TextUtils;import androidx.annotation.NonNull; import androidx.annotation.Nullable;import com.android.billingclient.api.BillingClient; import com.android.billingclient.api.BillingClientStateListener; import com.android.billingclient.api.BillingFlowParams; import com.android.billingclient.api.BillingResult; import com.android.billingclient.api.ConsumeParams; import com.android.billingclient.api.Purchase; import com.android.billingclient.api.PurchasesUpdatedListener; import com.android.billingclient.api.SkuDetails; import com.android.billingclient.api.SkuDetailsParams; import com.android.billingclient.api.SkuDetailsResponseListener;import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map;public class MainActivity extends BaseMainActivity implements PurchasesUpdatedListener,BillingClientStateListener {private static final long RECONNECT_TIMER_START_MILLISECONDS = 1L * 1000L;private static final long RECONNECT_TIMER_MAX_TIME_MILLISECONDS = 1000L * 60L * 15L; // 15 minsprivate static final Handler handler = new Handler(Looper.getMainLooper());private BillingClient billingClient;private String[] cacheRequestList;private Map<String, SkuDetails> skuDetailsLiveDataMap=new HashMap<>();private boolean isConsumable;private String buyProductId;private boolean billingSetupComplete = false;// how long before the data source tries to reconnect to Google playprivate long reconnectMilliseconds = RECONNECT_TIMER_START_MILLISECONDS;@Overrideprotected void OnInitHandle(String googlePlayPublicKey) {super.OnInitHandle(googlePlayPublicKey);if (googlePlayPublicKey.contains("CONSTRUCT_YOUR")) {throw new RuntimeException("Please put your app's public key in MainActivity.java. See README.");}billingClient = BillingClient.newBuilder(CurrentActivity()).setListener(this).enablePendingPurchases().build();billingClient.startConnection(this);}private void retryBillingServiceConnectionWithExponentialBackoff() {handler.postDelayed(() ->billingClient.startConnection(this),reconnectMilliseconds);reconnectMilliseconds = Math.min(reconnectMilliseconds * 2,RECONNECT_TIMER_MAX_TIME_MILLISECONDS);}@Overrideprotected void OnRequstProduct(String[] productId) {super.OnRequstProduct(productId);List<String> skuList = new ArrayList<>();skuList.addAll(Arrays.asList(productId));cacheRequestList=productId;SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();params.setSkusList(skuList).setType(BillingClient.SkuType.INAPP);billingClient.querySkuDetailsAsync(params.build(),new SkuDetailsResponseListener() {@Overridepublic void onSkuDetailsResponse(BillingResult billingResult,List<SkuDetails> skuDetailsList) {int responseCode = billingResult.getResponseCode();PrintLog("onSkuDetailsResponse:"+billingResult+" code:"+GetResponseText(responseCode));switch (responseCode){case BillingClient.BillingResponseCode.OK:RecieveProducts(skuDetailsList);break;default:RequestProductsFail("Failed to query inventory: " + billingResult.getDebugMessage());PrintLog("Failed to query inventory: "+billingResult.getDebugMessage());break;}}});}private String GetResponseText(int responseCode){switch (responseCode){case BillingClient.BillingResponseCode.OK:return "OK";case BillingClient.BillingResponseCode.SERVICE_TIMEOUT:return "SERVICE_TIMEOUT";case BillingClient.BillingResponseCode.FEATURE_NOT_SUPPORTED:return "FEATURE_NOT_SUPPORTED";case BillingClient.BillingResponseCode.USER_CANCELED:return "USER_CANCELED";case BillingClient.BillingResponseCode.SERVICE_DISCONNECTED:return "SERVICE_DISCONNECTED";case BillingClient.BillingResponseCode.SERVICE_UNAVAILABLE:return "SERVICE_UNAVAILABLE";case BillingClient.BillingResponseCode.BILLING_UNAVAILABLE:return "BILLING_UNAVAILABLE";case BillingClient.BillingResponseCode.ITEM_UNAVAILABLE:return "ITEM_UNAVAILABLE";case BillingClient.BillingResponseCode.DEVELOPER_ERROR:return "DEVELOPER_ERROR";case BillingClient.BillingResponseCode.ERROR:return "ERROR";case BillingClient.BillingResponseCode.ITEM_ALREADY_OWNED:return "ITEM_ALREADY_OWNED";case BillingClient.BillingResponseCode.ITEM_NOT_OWNED:return "ITEM_NOT_OWNED";default:return "UnKnown";}}private void RecieveProducts(List<SkuDetails> skuDetailsList){ArrayList<SkuItem> skuItems=new ArrayList<SkuItem>();ArrayList<String> invaildIds=new ArrayList<String>();PrintLog("cacheRequestList:"+cacheRequestList);int length=cacheRequestList.length;if(cacheRequestList!=null && length>0){for(int i=0;i<length;i++){String productId=cacheRequestList[i];if(!TextUtils.isEmpty(productId)){SkuDetails detail=null;for (SkuDetails skuDetails : skuDetailsList) {if(skuDetails.getSku().equals(productId)){detail=skuDetails;break;}}if(detail==null){PrintLog("未找到該產(chǎn)品信息:"+productId);invaildIds.add(productId);continue;}skuDetailsLiveDataMap.put(productId,detail);String price=detail.getPrice();String formatPrice=price;SkuItem skuItem=new SkuItem();skuItem.productId=productId;skuItem.title=detail.getTitle();skuItem.desc=detail.getDescription();skuItem.price=price;skuItem.formatPrice=formatPrice;skuItem.priceCurrencyCode=detail.getPriceCurrencyCode();skuItem.skuType=detail.getType();skuItems.add(skuItem);}}}RecieveProductInfo(skuItems,invaildIds);}@Overridepublic boolean IsIAPSupported() {return true;}@Overrideprotected void OnBuyProduct(String productId, boolean isConsumable) {super.OnBuyProduct(productId, isConsumable);SkuDetails skuDetails=skuDetailsLiveDataMap.get(productId);if(null!=skuDetails){buyProductId=productId;this.isConsumable=isConsumable;BillingFlowParams purchaseParams =BillingFlowParams.newBuilder().setSkuDetails(skuDetails).build();billingClient.launchBillingFlow(CurrentActivity(), purchaseParams);}else{BuyFail(productId,"Can not find SkuDetails:"+productId);PrintLog("未請求商品數(shù)據(jù),請先請求:"+productId);}}@Overridepublic void onPurchasesUpdated(@NonNull BillingResult billingResult, @Nullable List<Purchase> list) {int responseCode = billingResult.getResponseCode();PrintLog("BillingResult [" + GetResponseText(responseCode) + "]: "+ billingResult.getDebugMessage());switch (responseCode) {case BillingClient.BillingResponseCode.ITEM_ALREADY_OWNED:case BillingClient.BillingResponseCode.OK:FlowFinish(true,null,list);break;case BillingClient.BillingResponseCode.USER_CANCELED:String productId=buyProductId;buyProductId=null;BuyCancle(productId);break;default:FlowFinish(false,billingResult.getDebugMessage(),list);break;}}private void FlowFinish(Boolean isSuccess,String message,List<Purchase> purchases){if(isSuccess){if(buyProductId!=null){String productId=buyProductId;buyProductId=null;String purchaseToken=null;for (Purchase purchase : purchases) {for (String skus : purchase.getSkus()) {//需要校驗付款狀態(tài)if(skus.contains(productId) &&purchase.getPurchaseState()==Purchase.PurchaseState.PURCHASED){purchaseToken=purchase.getPurchaseToken();break;}if(purchaseToken!=null) break;}}if(isConsumable){if(purchaseToken==null){CallBackBuyFail("unknown purchaseToken:"+productId);}else {ConsumeParams consumeParams =ConsumeParams.newBuilder().setPurchaseToken(purchaseToken).build();billingClient.consumeAsync(consumeParams,(billingResult, token) -> {if(billingResult.getResponseCode()==BillingClient.BillingResponseCode.OK){BuyComplete(productId);}else{CallBackBuyFail(billingResult.getDebugMessage());}});}}else{BuyComplete(productId);}}}else{if(buyProductId!=null){CallBackBuyFail(message);}}}private void CallBackBuyFail(String message){String productId=buyProductId;buyProductId=null;BuyFail(productId, message);PrintLog("Error purchasing: " + message);}@Overridepublic void onBillingServiceDisconnected() {PrintLog("onBillingServiceDisconnected");billingSetupComplete = false;retryBillingServiceConnectionWithExponentialBackoff();}@Overridepublic void onBillingSetupFinished(@NonNull BillingResult billingResult) {int responseCode = billingResult.getResponseCode();String debugMessage = billingResult.getDebugMessage();PrintLog("onBillingSetupFinished: " + debugMessage+"("+ GetResponseText(responseCode)+")",true);switch (responseCode) {case BillingClient.BillingResponseCode.OK:// The billing client is ready. You can query purchases here.// This doesn't mean that your app is set up correctly in the console -- it just// means that you have a connection to the Billing service.reconnectMilliseconds = RECONNECT_TIMER_START_MILLISECONDS;billingSetupComplete = true;break;case BillingClient.BillingResponseCode.SERVICE_UNAVAILABLE:case BillingClient.BillingResponseCode.BILLING_UNAVAILABLE:PrintLog("Billing Service Unavailable:"+debugMessage,true);break;default:retryBillingServiceConnectionWithExponentialBackoff();break;}} }
    • 選擇Module,并且點擊Build Module,將會導(dǎo)出aar文件
    • 我們將aar改為rar格式,然后用壓縮軟件打開,取出里面的classes.jar,我們只需要該jar即可,該jar是我們封裝好的接口,后續(xù)有用,為了方便認,我將名字改為IAPForGooglePlay.jar
    • 將jar放置到Unity工程下,Assets/Plugins/Android目錄下,該目錄下文件如下:
      注意:jar要放在Android目錄下,而不是Android/libs目錄下,經(jīng)試驗放libs下會識別不到
    • Android這邊的工作就結(jié)束了,后面我們來寫Unity這邊的代碼

    ?編寫Unity接口

    • 創(chuàng)建類GooglePlay_IAPBridge,編寫調(diào)用Android我們封裝好的jar里的接口的橋接類 #if UNITY_ANDROID using System; using UnityEngine; using System.Collections; using System.Collections.Generic; using Newtonsoft.Json;public class GooglePlay_IAPBridge{class BuyProductData{public string productId;public bool isConsumable;}private AndroidJavaObject javaObject;private GooglePlay_IAPBridge() {if (Application.platform != RuntimePlatform.Android)return;javaObject = new AndroidJavaObject("com.egogame.MainActivity");}private volatile static GooglePlay_IAPBridge _instance = null;private static readonly object lockHelper = new object();public static GooglePlay_IAPBridge getInstance(){if(_instance == null){lock(lockHelper){if(_instance == null)_instance = new GooglePlay_IAPBridge();}}return _instance;}public void Init(string goName,string publicKey){Debug.Log ("[GooglePlay_IAPBridge]Init:" + goName + "=====" + publicKey);if (Application.platform != RuntimePlatform.Android)return;javaObject.Call ("Init", goName, publicKey);}public bool IsIAPSupported(){if (Application.platform != RuntimePlatform.Android)return false;return javaObject.Call<bool> ("IsIAPSupported");}public void RequestProducts(string jsonData){Debug.Log ("[GooglePlay_IAPBridge]RequstProduct:" + jsonData);if (Application.platform != RuntimePlatform.Android)return;javaObject.Call ("RequstProduct", jsonData);}public void BuyProduct(string productId,bool isConsumable){BuyProductData buyProductData=new BuyProductData();buyProductData.productId = productId;buyProductData.isConsumable = isConsumable;string jsonData = JsonConvert.SerializeObject(buyProductData);Debug.Log ("[GooglePlay_IAPBridge]BuyProduct:" + jsonData);if (Application.platform != RuntimePlatform.Android)return;javaObject.Call ("BuyProduct", jsonData);} } #endif 這里面我們直接 javaObject = new AndroidJavaObject("com.egogame.MainActivity");實例化我們jar封裝好的類,即可直接調(diào)用public方法。請注意:因為Android和Unity線程不一樣,所以jar處理時需要規(guī)避線程的同步性。
    • 再封裝一個IAPBridge類,用來分流不同渠道,轉(zhuǎn)接不同接口文件 using UnityEngine; using System.Collections.Generic; using Newtonsoft.Json;public class IAPBridge{class RequestSkuData{public string[] productIds;}public static void InitIAp(string goName,string publicKey=""){Debug.Log("[IAPBridge]InitIAp:" + goName + "==" + publicKey); #if UNITY_IPHONEif(Application.platform==RuntimePlatform.IPhonePlayer){iOS_IAPBridge.InitIAPManager(goName);} #elif UNITY_ANDROIDif(Application.platform==RuntimePlatform.Android){GooglePlay_IAPBridge.getInstance().Init(goName,publicKey);} #endif}public static bool IAPEnabeld(){ #if UNITY_IPHONEif(Application.platform==RuntimePlatform.IPhonePlayer){return iOS_IAPBridge.IsProductAvailable();} #elif UNITY_ANDROIDif(Application.platform==RuntimePlatform.Android){return GooglePlay_IAPBridge.getInstance().IsIAPSupported();} #endifreturn false;}public static void RequstProducts(List<string> productIds){RequestSkuData data=new RequestSkuData();data.productIds = productIds.ToArray();string jsonData = JsonConvert.SerializeObject(data);Debug.Log("[IAPBridge]RequstProducts:"+jsonData); #if UNITY_IPHONEiOS_IAPBridge.RequstProductInfo(jsonData); #elif UNITY_ANDROIDif (Application.platform == RuntimePlatform.Android){GooglePlay_IAPBridge.getInstance().RequestProducts(jsonData);} #endif}public static void SendBuyProduct(string productId,bool isConsumable){Debug.Log(string.Format("[IAPBridge]SendBuyProduct:{0} isConsumable:{1}",productId,isConsumable)); #if UNITY_IPHONEif(Application.platform==RuntimePlatform.IPhonePlayer){iOS_IAPBridge.BuyProduct(productId);} #elif UNITY_ANDROIDif (Application.platform == RuntimePlatform.Android){GooglePlay_IAPBridge.getInstance().BuyProduct(productId, isConsumable);} #endif}public static void RestoreProduct(){Debug.Log("[IAPBridge]Restore!"); #if UNITY_IPHONEif(Application.platform==RuntimePlatform.IPhonePlayer){iOS_IAPBridge.Restore();} #endif} }

    • 然后Unity這邊要接收下Android那邊傳過來的接口 using Newtonsoft.Json; using UnityEngine; #pragma warning disable 0649/// <summary> /// 該類主要用于接收iOS和Android回調(diào),做一個橋接用途 /// </summary> public class IAPMessage : MonoBehaviour {class BuyFailData{public string productId;public string error;}#region callback from Objective-c/JAR//獲取到產(chǎn)品列表回調(diào)void RecieveProductInfos(string jsonData){if(string.IsNullOrEmpty(jsonData)) return;var infoData = JsonConvert.DeserializeObject<IAPProductInfoData>(jsonData);OnProductInfoReceived (infoData);}//產(chǎn)品列表請求失敗void ProductRequestFail(string message){OnProductInfoFail(message);}//購買成功回調(diào)void ProductBuyComplete(string productId){OnProductBuyComplete(productId);}//購買失敗回調(diào)void ProductBuyFailed(string jsonData){var infoData = JsonConvert.DeserializeObject<BuyFailData>(jsonData);OnBuyProductFail (infoData.productId, infoData.error);}//獲取商品回執(zhí)回調(diào)void ProvideContent(string msg){}//購買取消回調(diào)void ProductBuyCancled(string productId){OnBuyProductCancled(productId);}/// <summary>/// 恢復(fù)購買成功/// </summary>/// <param name="productId"></param>void RestoreComplete(string productId){OnRestoreCompleted (productId);}#endregion//接收到產(chǎn)品信息void OnProductInfoReceived(IAPProductInfoData info){Debug.Log("[IAPMessage]Unity接收到商品信息:" + info.ToString());IAPManager.internal_CallBySDK_ProductInfosReceive(info);}//接收到產(chǎn)品信息void OnProductInfoFail(string error){Debug.Log("[IAPMessage]Unity商品信息請求失敗:" + error);IAPManager.internal_RequestProductInfoFail(error);}//購買完成void OnProductBuyComplete(string productId){Debug.Log ("[IAPMessage]購買完成" + productId);IAPManager.internal_CallBySDK_BuyComplete(productId);}//購買失敗void OnBuyProductFail(string productId,string error){Debug.Log(string.Format("[IAPMessage]購買失敗:{0} 錯誤信息{1}", productId, error));IAPManager.internal_CallBySDK_BuyFail(productId, error);}//購買取消void OnBuyProductCancled(string productId){Debug.Log ("[IAPMessage]購買取消" + productId);IAPManager.internal_CallBySDK_BuyCanceled(productId);}//恢復(fù)完成void OnRestoreCompleted(string productId){Debug.Log ("[IAPMessage]恢復(fù)購買完成:"+productId);IAPManager.internal_CallBySDK_RestoreCompleted(productId);} }#pragma warning restore 0649
    • using System.Collections.Generic;public class IAPProductInfoData {public List<IAPSkuItem> skuItems;//請求到的產(chǎn)品列表public string[] invalidIds;//無效產(chǎn)品id }public struct IAPSkuItem{public string productId;//后臺產(chǎn)品idpublic string title;//后臺標(biāo)題public string desc;//后臺描述public string price;//格式化價格,顯示請用formatPrircepublic string formatPrice;//格式化價格,包括其貨幣符號public string priceCurrencyCode;//貨幣代碼public string skuType;//內(nèi)購還是訂閱 subscription/inapppublic override string ToString (){return string.Format("[productId]:{0} [title]:{1} [desc]:{2} [price]:{3} [formatPrice]:{4} [priceCurrencyCode]:{5} [skuType:]{6}",productId, title, desc, price, formatPrice, priceCurrencyCode, skuType);} }public struct IAPProvideData {public string cfgId;public string title;public string desc;public string formatPrice; }

    • 到這里就接入完成了,調(diào)用對應(yīng)接口即可實現(xiàn)IAP的接入。

    Android部分源碼可以在這里下載到:https://download.csdn.net/download/egostudio/20463417?

    總結(jié)

    以上是生活随笔為你收集整理的Unity接入GooglePlay内购V4(源生Android方式)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    欧美成a人片在线观看久 | 美女福利视频一区二区 | 精品国产观看 | 手机在线免费av | 欧美日韩另类在线 | 黄色av一区二区三区 | 欧美国产日韩激情 | 日日日操 | 国产精品av免费在线观看 | 97精品国自产拍在线观看 | 国产香蕉视频 | 一区中文字幕在线观看 | 国产精品久久久精品 | 五月天激情视频在线观看 | 国产精品18久久久久久久网站 | 少妇bbr搡bbb搡bbb | 欧美视频xxx| 国产精品久久久久久久免费大片 | 日韩精品在线播放 | 亚洲视频精品 | 免费一级片在线观看 | 久久久久久久久黄色 | 亚洲国产日韩欧美 | 欧美成人在线网站 | 99九九视频 | 中文高清av | 人人澡av| 久草免费福利在线观看 | 日韩一级电影在线观看 | 欧美在线视频日韩 | 亚洲精品玖玖玖av在线看 | 99久久精品国产亚洲 | 久草9视频| 91av视频在线播放 | 超碰成人免费电影 | 欧美日韩免费一区二区三区 | 又湿又紧又大又爽a视频国产 | 国产精品一区二区白浆 | 欧美亚洲精品在线观看 | 日韩区欠美精品av视频 | 伊人夜夜 | 成人午夜电影在线 | www免费在线观看 | 成人国产精品电影 | 综合在线观看色 | a天堂中文在线 | 黄网站免费看 | 欧美做受高潮 | 天天色天天爱天天射综合 | 成人一区二区三区中文字幕 | 中文区中文字幕免费看 | 国产又黄又猛又粗 | 久久电影中文字幕视频 | 久久精品综合 | 国产中文字幕一区二区 | 婷婷国产精品 | www,黄视频 | av观看久久久 | 九九涩涩av台湾日本热热 | 亚洲理论视频 | 欧美日韩视频在线播放 | 欧美日韩视频在线播放 | 久久久久久久久毛片 | 四月婷婷在线观看 | 日韩一三区 | 在线v片 | 国产亚洲无| 国产一区欧美一区 | 99精品在线 | 亚洲国产片色 | www夜夜| 欧美在线观看视频一区二区三区 | 久久免费成人精品视频 | 在线视频精品播放 | 99热国产在线观看 | 91精品黄色 | 中文字幕av在线免费 | 99免费看片 | 日韩字幕在线观看 | 免费看污的网站 | 九九亚洲精品 | av超碰免费在线 | 九九综合久久 | 国产亚洲精品久久久网站好莱 | 98超碰在线 | 伊人久久一区 | 在线观看中文字幕网站 | 婷婷丁香在线观看 | 91人人视频在线观看 | 日韩在线电影 | 久久理论视频 | 超碰成人网| 天天狠狠| 日本成人黄色片 | 中文字幕在线观看2018 | 国产福利精品一区二区 | 日日躁天天躁 | 激情av综合 | 国产精品美女免费看 | 国产欧美在线一区二区三区 | 深爱激情久久 | 激情综合色播五月 | 国产精品久久久久国产a级 激情综合中文娱乐网 | h文在线观看免费 | 日韩精品视频免费在线观看 | 国产精品久久久 | 99久久久久成人国产免费 | 91精品国自产拍天天拍 | 中文字幕综合在线 | 日韩av在线一区二区 | 中文字幕在线网 | 久久激情视频 久久 | 婷婷精品国产一区二区三区日韩 | 伊甸园av在线 | 国产色综合天天综合网 | 久久九九国产视频 | 国产1区2区3区精品美女 | 久久国产热 | 黄色片网站 | 国产成人黄色在线 | 亚洲婷婷免费 | www.亚洲视频 | 2000xxx影视 | 国产一区免费 | 国产一区精品在线 | 中文字幕在线观看视频一区二区三区 | 成人免费视频播放 | 日本一区二区免费在线观看 | 精品久久美女 | 99视屏 | 99久久99久久综合 | 免费网站观看www在线观看 | 国产麻豆视频 | 久久理论片| 亚洲精品在线观 | 欧美在线观看禁18 | 中文字幕 国产 一区 | 成人h电影 | 日韩久久精品一区二区三区下载 | 国产精品久久久久三级 | 网站你懂的 | 午夜a区| 香蕉视频一级 | 激情黄色av| 久草在线资源观看 | 国产无遮挡又黄又爽在线观看 | 91爱爱电影 | 天天人人 | 日韩特级毛片 | 在线观看日韩av | www日韩视频| 日韩精品一区二区在线 | 91免费观看视频网站 | 国产精品久久久久久99 | 成人久久18免费网站麻豆 | 日本性久久 | 黄污网站在线 | 欧美精品三级在线观看 | 久久九九国产视频 | 欧美日韩国产区 | 丁香花在线视频观看免费 | a午夜在线 | 日韩和的一区二在线 | 激情小说网站亚洲综合网 | 久久视频在线观看 | 在线播放 日韩专区 | 91精品国产欧美一区二区成人 | 国产精品久久久 | 婷婷网站天天婷婷网站 | 在线观看完整版 | 最新国产福利 | 国产精品久久毛片 | 色在线观看网站 | 欧美成人精品在线 | 久久夜色精品国产欧美一区麻豆 | 欧美日韩中文字幕在线视频 | 9999免费视频 | 天天操操操操操 | 国产一区在线视频观看 | av不卡免费在线观看 | 97超碰站 | 在线天堂亚洲 | 在线成人性视频 | 国产精品久久久一区二区三区网站 | 日韩欧美黄色网址 | 欧美午夜精品久久久久 | 国产精品色婷婷视频 | 久久九九视频 | 久久久久福利视频 | 成人免费在线网 | 色婷丁香 | 国产精品入口传媒 | 在线国产能看的 | 免费中文字幕在线观看 | 欧美激情精品久久久久久变态 | 久草精品资源 | 日韩中文字幕免费在线播放 | 国产精品99久久久久久小说 | 国产粉嫩在线观看 | www.av在线.com | 亚洲我射av| 菠萝菠萝蜜在线播放 | 精品久久精品 | 91精品福利在线 | 国产精品网站一区二区三区 | www.天天色| 精品亚洲男同gayvideo网站 | 狠狠狠狠狠狠天天爱 | 天天操人| 热久久国产 | av丝袜在线 | 亚洲人久久| 综合激情久久 | 香蕉在线观看视频 | 97视频网站 | 欧美精品网站 | 国产小视频免费在线网址 | 日韩高清www | 91成人小视频 | 在线亚洲精品 | 色在线视频 | 色婷丁香 | 人人爱人人射 | 97在线精品视频 | 国产主播大尺度精品福利免费 | 欧美精品久久久久久久久久久 | 亚洲精品一区二区18漫画 | 日韩av电影中文字幕 | 婷婷久月 | 久久久久国产a免费观看rela | 亚洲成人资源在线 | 天天综合网在线 | 808电影 | 免费av成人在线 | 国产高清在线免费视频 | 精品久久中文 | 最近高清中文在线字幕在线观看 | 一区二区三区在线免费观看视频 | 99精品欧美一区二区三区黑人哦 | 97色婷婷| 久久狠狠婷婷 | 国产一区二区不卡在线 | 免费在线观看av网址 | 狠狠色伊人亚洲综合网站野外 | 玖玖在线播放 | 成人午夜av电影 | 免费看片在线观看 | 91中文字幕永久在线 | 国产又粗又硬又爽视频 | 亚洲一级片在线看 | 久久99爱视频 | 美女视频黄的免费的 | 国产网站色 | 国产精品三级视频 | 亚州人成在线播放 | 黄色91免费观看 | 日韩亚洲在线 | 欧美色图另类 | 免费黄av| 精精国产xxxx视频在线播放 | 国产粉嫩在线 | 国产成人区 | 精品不卡视频 | 色婷婷综合久久久中文字幕 | 不卡的av电影在线观看 | 中文字幕 二区 | 久久综合综合久久综合 | 国产精品1区2区在线观看 | 欧美日韩大片在线观看 | 九色在线 | 麻豆一区在线观看 | 日韩成人在线免费观看 | 在线导航av | 国产精品99久久久久 | 网站免费黄 | 超碰国产在线观看 | 成人午夜电影久久影院 | 精品在线播放视频 | 久草精品视频 | 亚洲黑丝少妇 | 最新av在线网址 | 国产日韩精品一区二区三区 | 亚州中文av | 精品一区二区免费视频 | 成人av免费播放 | 国语对白少妇爽91 | 日韩理论片中文字幕 | 国产精品久久久久久久久久免费看 | 91精品视频网站 | 最近免费中文字幕mv在线视频3 | 狠狠艹夜夜干 | 亚洲国产欧洲综合997久久, | 在线观看一级 | 久久99热这里只有精品 | 中文字幕丝袜一区二区 | 激情开心色 | 久久99精品热在线观看 | 在线观看国产日韩欧美 | 亚洲91精品| 免费a网站 | 国产 日韩 中文字幕 | 欧美狠狠操 | 成人免费看片98欧美 | 久久久国产一区二区三区四区小说 | 精品视频9999 | 欧美三级免费 | 国产精品尤物视频 | 婷婷丁香自拍 | 国模视频一区二区三区 | 国产h在线观看 | 在线国产精品一区 | 久久黄视频 | 国产中文伊人 | 国产情侣一区 | 国产999视频| 国产一级二级视频 | 色偷偷网站视频 | 日本 在线 视频 中文 有码 | 久久只精品99品免费久23小说 | 国产黄大片在线观看 | 亚州精品天堂中文字幕 | 在线国产激情视频 | 免费观看视频的网站 | 国产在线一区二区 | av免费黄色 | 久久综合婷婷综合 | 欧洲精品久久久久毛片完整版 | 亚洲精品9| 久久综合久久综合这里只有精品 | 免费色网| 免费av片在线 | 亚洲精品久久在线 | 久久久久久高潮国产精品视 | 欧美日韩在线电影 | 久久久av免费 | 精品一区二区三区久久久 | 婷婷网在线 | 天堂av网站 | 成人午夜剧场在线观看 | 欧美激情xxxx性bbbb | 91高清视频在线 | 爱干视频 | 一区二区三区四区精品 | 日韩电影中文字幕在线观看 | 亚洲精品国产精品久久99 | 久久无码精品一区二区三区 | 黄色软件视频网站 | 精品国产伦一区二区三区观看说明 | 天堂在线免费视频 | www,黄视频 | 欧美日韩精品免费观看视频 | 久草网站在线 | 又湿又紧又大又爽a视频国产 | 天天曰夜夜操 | 色噜噜色噜噜 | 亚洲精品成人 | 亚州国产精品视频 | 在线观看av小说 | 成 人 黄 色 视频 免费观看 | 欧洲一区二区三区精品 | 五月婷婷开心中文字幕 | 欧美激情精品久久久久 | 丁香午夜婷婷 | 成人黄色小视频 | 91福利在线导航 | 91在线网址| 96视频免费在线观看 | 麻豆成人网 | 精品国产免费人成在线观看 | 免费久久视频 | 久久网站最新地址 | 又大又硬又黄又爽视频在线观看 | www.久久99| 免费高清在线观看电视网站 | 国产色久 | 欧美一区二视频在线免费观看 | 久久草精品 | 草久在线播放 | 黄色av成人在线观看 | 日韩在线观看网站 | 天天插日日操 | 亚洲免费公开视频 | 激情综合色播五月 | 97高清视频 | 久久不射电影院 | 精品国产中文字幕 | 日本精品视频免费 | 制服丝袜欧美 | 少妇高潮流白浆在线观看 | 欧美精品二 | 午夜精品一区二区三区免费视频 | 免费高清在线观看电视网站 | 成人免费在线观看av | 中文字幕在线观看91 | 91高清视频免费 | 天天干天天操天天干 | 在线观看黄色小视频 | av网站手机在线观看 | 亚洲第一区在线播放 | 悠悠av资源片 | 国产精品麻豆果冻传媒在线播放 | 免费看特级毛片 | 一区二区三区精品在线视频 | 欧美精品视 | 亚州精品视频 | 婷婷丁香在线视频 | 六月丁香婷婷在线 | 五月视频| 国产无套视频 | 不卡视频国产 | 国产精品久久久久久久久久久不卡 | 福利片免费看 | 九九九热视频 | 在线 国产 亚洲 欧美 | 中文字幕在线观看完整版电影 | 不卡的av中文字幕 | 成人黄色小说视频 | 青青久草在线视频 | 久久不卡日韩美女 | 一级成人在线 | 99热超碰| 在线影院av | 91视频大全 | 五月婷婷av在线 | 激情中文在线 | 91在线免费观看网站 | 国产v欧美| 色综合综合 | 久久精品国产v日韩v亚洲 | 久久久九九 | 成人精品亚洲 | 中文字幕在线中文 | 99久久精品久久久久久清纯 | 天天做天天爱天天综合网 | 日韩专区在线观看 | 天天射日 | 国产一级高清视频 | 欧美性色黄 | 蜜臀av性久久久久蜜臀av | 国产精品久久久 | 日韩最新av在线 | 国产精品不卡一区 | 亚洲成av人片在线观看 | 99热国产在线中文 | 国产一区二区在线免费播放 | 国产又粗又猛又色又黄网站 | www.午夜色.com| 免费福利视频网 | 在线成人小视频 | 国产精品com | 久久国产精品久久久 | 色爱成人网 | 欧美性色综合 | 国产福利网站 | 永久免费毛片 | 日日夜夜添 | 久久天天躁夜夜躁狠狠躁2022 | 国产成人精品免高潮在线观看 | 国产精品11 | 久久天天综合网 | 天天天干夜夜夜操 | 在线精品视频免费观看 | 一级免费片 | 成人久久久电影 | 成人理论电影 | 国产一区二区三区免费在线 | 夜夜爽www| 欧美先锋影音 | 日韩免费一区 | 亚洲美女在线一区 | 国产自产高清不卡 | 福利区在线观看 | 在线精品在线 | 久久久免费看 | 国产视频18 | 日韩欧美视频在线播放 | 一区二区三区中文字幕在线 | av三级在线免费观看 | 日韩成人欧美 | 久久久久久久18 | 一级电影免费在线观看 | 久草在线视频资源 | 伊人导航 | 黄色av播放 | 国内久久视频 | 久久久国产电影 | 国产在线中文 | 免费观看一级成人毛片 | 中文字幕视频观看 | 久久久www成人免费毛片麻豆 | av片在线观看 | www.夜夜草 | 曰本免费av | 色五月色开心色婷婷色丁香 | 国产一二区视频 | 麻豆91视频 | 久久1电影院 | 五月天色站| av免费网 | av中文天堂在线 | 五月天婷婷在线观看视频 | 九九免费在线看完整版 | 91视频91自拍 | av黄色在线观看 | 日本中文乱码卡一卡二新区 | 日韩成人在线免费观看 | 国产精品久久99 | 一区二区三区国产欧美 | 亚洲精品短视频 | 一区二区精品视频 | 天天摸日日摸人人看 | 免费观看的av网站 | 91资源在线播放 | 国产 一区二区三区 在线 | 中文字幕在线播放日韩 | 国产精品久久在线 | 亚洲成人网av | 精品国产一区二区三区噜噜噜 | 草久在线| 免费观看成人av | 婷婷丁香激情 | 亚洲情婷婷 | 中文字幕黄色网址 | 精品美女国产在线 | 久久久国产一区二区三区 | 91久久奴性调教 | 国产高清视频 | 黄色国产精品 | www99精品| 国产日韩欧美在线播放 | 香蕉看片| 在线免费观看羞羞视频 | 久久观看免费视频 | 视频在线99| 亚洲少妇自拍 | 国产一级在线播放 | 国产三级香港三韩国三级 | www免费网站在线观看 | 日日激情 | 亚洲视频在线视频 | 亚洲开心色 | 成 人 黄 色视频免费播放 | 日韩黄视频 | 91一区啪爱嗯打偷拍欧美 | 婷婷在线观看视频 | 婷婷激情影院 | 视频国产在线 | 亚洲欧美国产精品 | 久久午夜国产精品 | 欧美一二三区在线观看 | 2019天天干天天色 | 日韩精品短视频 | 国产精品免费在线播放 | 日日综合 | 日韩在线电影观看 | 久久免费播放视频 | 日韩亚洲国产中文字幕 | 91毛片在线观看 | 久久久免费毛片 | 激情偷乱人伦小说视频在线观看 | 久久久精品国产一区二区三区 | 久久夜靖品| 亚洲电影成人 | 国产亚洲精品日韩在线tv黄 | 久久香蕉电影网 | 久久成年人网站 | 亚洲精品美女在线观看播放 | 制服丝袜欧美 | 日韩久久久 | 国产成人精品在线播放 | 成人欧美日韩国产 | 91在线中文 | 国产伦理精品一区二区 | 中文字幕在线有码 | 成人免费视频网站 | 国产在线无 | 国产精品一区二 | 人人爽人人爽人人片av | 国语自产偷拍精品视频偷 | 久久色网站 | a视频在线观看免费 | 毛片1000部免费看 | 日韩激情免费视频 | 又黄又爽又刺激的视频 | 黄色免费电影网站 | 国产亚洲精品中文字幕 | 99久热在线精品 | 中文字幕在线久一本久 | a天堂最新版中文在线地址 久久99久久精品国产 | 五月婷婷.com | 午夜久久久久久久久久影院 | 中文字幕日韩有码 | aaawww| 中文欧美字幕免费 | 99精品黄色 | 99热99 | 草在线视频 | 九九九在线观看视频 | 欧美专区国产专区 | 国产精品一区二区三区视频免费 | 国内成人精品视频 | 丁香花中文字幕 | 国产天天爽 | 日黄网站 | 日韩免费观看视频 | 91精彩视频在线观看 | 五月天婷婷丁香花 | 午夜精品久久久久久中宇69 | 韩国av一区二区三区在线观看 | 日韩精品在线免费观看 | 婷婷射五月 | 人人射人人澡 | 狠狠色噜噜狠狠狠合久 | 精品国产一区二区三区男人吃奶 | 成人黄色大片在线免费观看 | 亚洲欧洲日韩 | 国产精品欧美精品 | 精品九九九九 | 欧美一级黄色视屏 | 在线观看日韩中文字幕 | 激情婷婷色 | 久久精品免费播放 | 国产精品永久免费观看 | 欧美性黑人| 国产原创在线 | 欧美中文字幕久久 | 黄污网站在线 | 久久精品9| 久久久久五月 | 欧美 日韩 国产 成人 在线 | 久亚洲 | 日韩在线播放欧美字幕 | 国产精品久久久久久久久久了 | 免费观看国产精品 | 伊人国产女 | 国产免费视频一区二区裸体 | 一区二区三区四区不卡 | 中文资源在线官网 | 欧洲一区二区在线观看 | 国产专区在线看 | 日韩一区二区在线免费观看 | 欧美人牲 | 丁香视频 | 国产在线视频一区二区 | 亚洲伊人天堂 | 97影视 | 国产爽妇网| 91一区啪爱嗯打偷拍欧美 | 日韩高清在线一区二区 | av在线免费不卡 | 日本最新一区二区三区 | 中文字幕在线播放一区 | 黄色软件网站在线观看 | 日韩理论电影网 | 天天舔天天搞 | 天天五月天色 | 91精品婷婷国产综合久久蝌蚪 | 狠狠狠色| 免费中文字幕 | 免费观看一级特黄欧美大片 | 2020天天干夜夜爽 | 天天舔天天搞 | 久久免费视频在线观看 | 一区二区视频在线看 | 亚洲欧美视屏 | 操处女逼| 天天伊人网 | 国产成人精品一区二区三区福利 | www.香蕉视频在线观看 | 精品国产亚洲一区二区麻豆 | 天天操天天干天天玩 | 国产一卡二卡在线 | 一区二区三区在线电影 | 中文字幕一区二区三区四区 | 日韩成人免费观看 | 国产成人精品aaa | 久久免费一| 国产精品国产亚洲精品看不卡15 | 在线免费观看羞羞视频 | 婷婷久久精品 | 午夜精品一二区 | 激情电影影院 | 欧美日韩不卡一区 | 视频一区二区三区视频 | 国产91精品久久久久久 | 成人精品99 | 99色在线观看 | 在线免费观看黄色小说 | 黄色av电影在线 | 日韩理论电影网 | 精品国内自产拍在线观看视频 | 国产精品欧美一区二区 | 久久亚洲精品国产亚洲老地址 | 国产福利91精品 | 天天做天天爽 | 在线精品视频免费观看 | 免费三级av | 水蜜桃亚洲一二三四在线 | 日韩欧美精品在线观看 | 一区二区视频播放 | 亚洲视频第一页 | 国内精品中文字幕 | 国产视频一区在线免费观看 | 日韩3区 | 最近最新中文字幕 | 1024手机看片国产 | 丁香色婷婷 | 欧美久久久久久久 | 激情五月在线视频 | 亚洲精品国产第一综合99久久 | 热久久最新地址 | 久久免费电影 | 免费欧美精品 | www99久久| 日本系列中文字幕 | av国产在线观看 | 国产在线一区二区 | 亚洲国产精品日韩 | 精品日韩在线 | 五月天.com | 青青草在久久免费久久免费 | 国产精品免费观看视频 | 中文字幕高清免费日韩视频在线 | 午夜色大片在线观看 | 国产中文字幕三区 | 中文乱码视频在线观看 | 88av网站| 久久精品伊人 | 欧美成人在线网站 | 亚洲伊人第一页 | 久久男人影院 | 黄色www在线观看 | 日韩欧美视频一区 | 中文字幕一区二区三区四区在线视频 | 免费亚洲电影 | 中文字幕日韩电影 | 精品三级av | 黄色中文字幕 | av先锋中文字幕 | 99免费看片 | 黄色av免费电影 | 日韩视频在线观看免费 | 黄色在线观看网站 | 国产精品久久中文字幕 | 色干干| 久久免费国产电影 | 色综合久久88色综合天天6 | 麻豆成人精品 | 黄色小说网站在线 | 欧美日韩精品在线 | 日本aa在线 | 国产精品久久久久久妇 | 九九久久国产 | 久久99国产精品视频 | 色成人亚洲网 | 免费观看高清 | 超碰在线公开免费 | 一区二区av | 91精品国产自产91精品 | 亚洲影视资源 | 日韩狠狠操| 九九九免费视频 | 一区二区三区四区五区六区 | 亚洲伊人婷婷 | 亚洲精品午夜久久久久久久久久久 | 黄色片网站av | 国产精品亚州 | 久久国产精品一二三区 | 最近更新中文字幕 | 四虎国产精品免费 | 久久精品99久久久久久 | 亚洲精品毛片一级91精品 | 国产精品一区免费在线观看 | 色婷婷国产精品 | 激情视频二区 | 在线观看久久久久久 | 亚州中文av | 97国产大学生情侣酒店的特点 | av中文字幕日韩 | 国产美女搞久久 | 成人中文字幕+乱码+中文字幕 | 一本一本久久a久久精品综合小说 | 亚洲最快最全在线视频 | 欧美韩国日本在线观看 | 中文字幕第一页在线 | av观看网站 | 国产精品美女久久久久久久久久久 | 欧美在线不卡一区 | 免费看片亚洲 | 久久综合狠狠综合久久激情 | 亚洲毛片一区二区三区 | 国产99久久九九精品免费 | 日韩电影一区二区在线观看 | 99热手机在线观看 | 国产精品99久久久久久久久久久久 | 激情视频免费观看 | 天天综合网入口 | 亚洲欧美视频在线观看 | 色婷婷久久一区二区 | 国产高清日韩 | 精品国产欧美一区二区 | 五月天久久久久 | 丝袜美腿亚洲 | 国产精品一区二区久久精品爱微奶 | 久久91久久久久麻豆精品 | 一级免费片| 国产无套精品久久久久久 | 精品在线观看一区二区 | 国产麻豆精品免费视频 | 五月丁色 | 国产成人免费高清 | 午夜久久福利影院 | 超碰97人人干 | 一区二区三区中文字幕在线 | 欧美性生活免费 | 日韩高清免费在线观看 | 国产一区视频免费在线观看 | 最新av免费| 免费在线观看av网站 | 欧美日韩成人一区 | 麻豆高清免费国产一区 | 成人午夜在线电影 | 婷婷激情影院 | 性色视频在线 | 国产一区在线视频播放 | 色之综合网 | 久久狠狠亚洲综合 | 91午夜精品| 中文在线天堂资源 | 国产亚洲精品中文字幕 | a成人v | 五月天婷婷丁香花 | 九九久久精品 | 亚洲国产资源 | 免费黄色激情视频 | 日韩免费在线观看视频 | 精品亚洲欧美一区 | 亚洲免费色 | 天天插天天爱 | 国产一区二区在线影院 | 91精品在线视频 | 五月开心激情网 | 国产一级久久 | 西西www4444大胆视频 | 日韩精品专区在线影院重磅 | 黄在线免费看 | 在线影院中文字幕 | 欧美久久久久久久久久久久久 | 欧美日韩在线看 | 成人av影院在线观看 | 香蕉视频在线看 | 亚洲激情p| 日韩理论 | 国产精品久久精品 | 91精品国产高清自在线观看 | 人人插人人费 | 色婷婷久久 | 91视频-88av | 在线免费观看麻豆 | 久久精品牌麻豆国产大山 | 亚洲成人av一区二区 | 国产精品五月天 | www日韩欧美 | 天天干天天操天天拍 | 2021av在线| 成人av观看 | 五月婷婷,六月丁香 | 国产主播99 | 国产精品久久久久久999 | 国产欧美在线一区 | 国产乱码精品一区二区三区介绍 | 免费在线观看av网站 | av高清一区二区三区 | 国产99免费视频 | 五月激情丁香婷婷 | 国产一区视频免费在线观看 | 在线观看视频在线 | 精品视频中文字幕 | 欧美一级在线看 | 国产精品精品国产婷婷这里av | 欧美精彩视频在线观看 | 日韩欧美视频免费看 | 香蕉网在线 | 国产精品免费一区二区三区在线观看 | 成人免费亚洲 | 综合激情av| 二区在线播放 | 国产亚洲精品久久久久5区 成人h电影在线观看 | 中文日韩在线视频 | 一级性视频 | 99久久精品免费看国产一区二区三区 | 久久国产影院 | 国产亚洲免费观看 | 日本三级中文字幕在线观看 | 成人午夜毛片 | 成年人在线免费看片 | 中文字幕xxxx| 天天爱天天插 | 精品久久综合 | 久久国际影院 | 日韩欧美在线国产 | 蜜桃麻豆www久久囤产精品 | 涩涩网站在线看 | 超碰在线97免费 | 青春草视频 | 黄色片视频在线观看 | avav片| 国产一区二区不卡视频 | 天天射成人 | 免费欧美 | 六月激情网 | 亚洲精品女人久久久 | 久久精品亚洲一区二区三区观看模式 | 亚洲一区二区观看 | 九九久久成人 | 亚洲精品国产精品乱码在线观看 | 激情视频免费在线观看 | 成年人免费看的视频 | 日本激情视频中文字幕 | 最近av在线 | 日韩精品在线免费观看 | 中文在线字幕免 | 国产色婷婷精品综合在线手机播放 | 日批视频 | 欧美一级高清片 | 超碰公开在线 | 免费日韩一区二区三区 | 天天操天天摸天天射 | 精品国产一区二区在线 | 久久亚洲在线 | 欧美一区在线看 | 日韩精品网址 | 亚洲黄色三级 | 黄色a在线 | 国产成人精品av | 国产一二三四在线观看视频 | 97电影网站 | 亚洲精品乱码久久久久久9色 | 亚洲干| 久久久亚洲电影 | 久久免费视频4 | 99精品国产兔费观看久久99 | 在线看国产 | 中文字幕影片免费在线观看 | 久久国产精品一二三区 | 91久久久国产精品 | 亚洲国产欧美一区二区三区丁香婷 | 国产拍在线 | 伊人婷婷综合 | 久久99精品久久久久蜜臀 | 亚洲免费专区 | 欧美日本高清视频 | 99久久久成人国产精品 | 久久亚洲福利 | 日韩中字在线 | 久草在线免费在线观看 | 久久人人爽人人爽人人片 | 97在线视频免费观看 | 视频在线观看亚洲 | 亚洲电影影音先锋 | 色在线高清 | 国产123av | 中文字幕影片免费在线观看 | 久久婷婷色综合 | 天天插日日射 | 久久婷婷一区 | 五月婷婷丁香在线观看 | 欧美精品亚洲二区 | 久久精品99国产国产精 | 9色在线视频 | 亚洲精品国产视频 | 国产黄色片在线免费观看 | 伊人成人久久 | 日日日视频 | 精品91久久久久 | av网址aaa| 毛片网站在线观看 | 日韩免费在线观看视频 | 丁香六月婷婷综合 | 天天操月月操 | 久草在线视频网站 | 九九免费在线观看视频 | 欧美日韩性 | 成人黄色在线 | 国产视频一区在线免费观看 | 亚洲男人天堂2018 | 成人毛片100免费观看 | 在线观看久草 | 久久久精品久久 | 美女视频一区二区 | 亚洲精品www | 51久久夜色精品国产麻豆 | 超碰人人乐 | 精品无人国产偷自产在线 | 中文字幕中文字幕在线中文字幕三区 | 欧美成人中文字幕 | 韩国一区二区三区在线观看 | 免费在线中文字幕 |