private static AndroidJavaObject CallMethod(string methodName, AndroidJavaObject extrasBundle)
        {
            VerifyContentProvider();
            AndroidJavaObject resultBundle;

            try
            {
                // Java: currentActivity.getContentResolver().call(Uri.parse("content://..."), methodName, null, extras)
                using (var context = UnityPlayerHelper.GetCurrentActivity())
                    using (var contentResolver = context.Call <AndroidJavaObject>(Android.ContextMethodGetContentResolver))
                        using (var uriClass = new AndroidJavaClass(Android.UriClass))
                            using (var uri = uriClass.CallStatic <AndroidJavaObject>(Android.UriMethodParse, ContentAuthority))
                            {
                                resultBundle = contentResolver.Call <AndroidJavaObject>(
                                    Android.ContentResolverMethodCall, uri, methodName, null, extrasBundle);
                            }
            }
            catch (AndroidJavaException ex)
            {
                throw new CookieApiException(
                          string.Format("Failed to call {0} on the instant apps content provider.", methodName), ex);
            }

            if (resultBundle == null)
            {
                // This should only happen if the content provider is unavailable.
                throw new CookieApiException(
                          string.Format("Null result calling {0} on the instant apps content provider.", methodName));
            }

            return(resultBundle);
        }
        private static void VerifyContentProvider()
        {
            if (_verifiedContentProvider)
            {
                return;
            }

            // Java: currentActivity.getPackageManager().resolveContentProvider("com.google.android.gms...", 0)
            using (var context = UnityPlayerHelper.GetCurrentActivity())
                using (var packageManager = context.Call <AndroidJavaObject>(Android.ContextMethodGetPackageManager))
                    using (var providerInfo = packageManager.Call <AndroidJavaObject>(
                               Android.PackageManagerMethodResolveContentProvider, Authority, 0))
                    {
                        if (!PlaySignatureVerifier.VerifyGooglePlayServices(packageManager))
                        {
                            throw new CookieApiException("Failed to verify the signature of Google Play Services.");
                        }

                        if (providerInfo == null)
                        {
                            throw new CookieApiException("Failed to resolve the instant apps content provider.");
                        }

                        var packageName = providerInfo.Get <string>(Android.ProviderInfoFieldPackageName);
                        if (!string.Equals(packageName, Android.GooglePlayServicesPackageName))
                        {
                            throw new CookieApiException(
                                      string.Format("Package \"{0}\" is an invalid instant apps content provider.", packageName));
                        }
                    }

            Debug.Log("Verified instant apps content provider.");
            _verifiedContentProvider = true;
        }
示例#3
0
 /// <summary>
 /// Shows a dialog that allows the user to install the current instant app.
 /// <param name="referrer">Optional install referrer string.</param>
 /// </summary>
 public static void ShowInstallPrompt(string referrer = null)
 {
     using (var activity = UnityPlayerHelper.GetCurrentActivity())
         using (var postInstallIntent = CreatePostInstallIntent(activity))
         {
             ShowInstallPrompt(activity, IgnoredRequestCode, postInstallIntent, referrer);
         }
 }
示例#4
0
 /// <summary>
 /// This method can be called from an installed app to obtain a string that was included in
 /// the postInstallIntent provided by an instant app via <see cref="ShowInstallPrompt()"/>.
 /// It assumes that the current activity was the one that was launched by Play Store.
 /// </summary>
 /// <param name="extraKey">Key for obtaining a string extra from current activity's intent.</param>
 /// <returns>The string extra value.</returns>
 public static string GetPostInstallIntentStringExtra(string extraKey)
 {
     // Java: currentActivity.getIntent().getStringExtra(extraKey)
     using (var activity = UnityPlayerHelper.GetCurrentActivity())
         using (var intent = activity.Call <AndroidJavaObject>(Android.ActivityMethodGetIntent))
         {
             return(intent.Call <string>(Android.IntentMethodGetStringExtra, extraKey));
         }
 }
示例#5
0
 public static AndroidJavaObject GetCurrentActivity()
 {
     return(UnityPlayerHelper.GetCurrentActivity());
 }