【问题标题】:Google Play Custom App Publishing API to publish a private app in C#Google Play Custom App Publishing API 在 C# 中发布私有应用
【发布时间】:2019-06-11 06:54:51
【问题描述】:

我正在尝试弄清楚如何使用 Google Play 自定义应用发布 API 使用 C# 发布私有应用程序,但我无法找到上传或传递 APK 的方法。

文档here 给出了一个示例:

Path apkPath = Paths.get("PATH_TO_APK");
ByteArrayContent apk =
    new ByteArrayContent("application/octet-stream", Files.readAllBytes(apkPath));

CustomApp appMetadata =
    new CustomApp()
      .setTitle("APPLICATION TITLE").setLanguageCode("en_US");

CustomApps.Create request =
    apiClient.accounts() // Playcustomapp apiClient
      .customApps().create(DEV_ACCOUNT_ID, appMetadata, apk);

CustomApp response = request.execute();

我已经导入了 NuGet 包 Google.Apis.Playcustomapp.v1 并创建了 appMetaData

CustomApp appMetadata = new CustomApp() {
    Title = "Whatsapp",
    LanguageCode = "en-US"
};

有 2 个 API 请求可用,它们是:

var createRequest = new AccountsResource.CustomAppsResource.CreateRequest(
    service, appMetadata, 9197907806840XXXXX);
var createMediaUpload = new AccountsResource.CustomAppsResource.CreateMediaUpload(
    service, appMetadata, 9197907806840XXXXX, ms, "application /octet-stream");

这两个都给我错误 404。这是因为我没有通过需要上传的 APK。 我可以从哪里发送此 APK? CreateMediaUpload 中有一个 stream 参数,但它也无济于事。

错误:

CreateRequest:解析值时遇到意外字符:APK 的路径?

CreateMediaUpload : 在此服务器上找不到请求的 URL /upload/9197907806840917992/customApps?uploadType=resumable

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 这里的ms 是什么?它是一个 MemoryStream 吗?我想知道你是否在写完之后没有把它倒回来?也不清楚9197907806840XXXXX 是什么,因为这不是一个有效的方法参数——而且目前你的内容类型中有一个流氓空间,这也可能没有帮助。
  • @JonSkeet 是的ms 是一个流,它具有byteArrayAPK9197907806840XXXXX 是我的 google 开发者帐户,它是必需的参数。并且在复制,粘贴时添加了空间。它不存在于我的代码中。流代码:ByteArrayContent apk = new ByteArrayContent(File.ReadAllBytes(@"C:\Users\lucky\Desktop\app-release.apk")); System.IO.MemoryStream ms = new System.IO.MemoryStream(); apk.CopyToAsync(ms);
  • 对,正如我所想的那样 - 这是一个 MemoryStream,如果你从中读取它就不会有任何内容。您已写入,但光标位于流的末尾。如果你使用ms.Position = 0;,它会倒带,所以有内容要上传。
  • (恐怕我对这个特定的 API 一无所知。我只是想发现潜在的问题。)
  • @JonSkeet 啊,是的,我现在确实设置了ms.Position=0,但仍然没有帮助。得到同样的错误。感谢您的投入

标签: c# android google-cloud-platform google-play google-play-developer-api


【解决方案1】:

您找到的文档是一个 Java 示例。经过一些随机猜测如何将这些部分组合在一起,我终于明白了。

请记住,关于您每天创建私有应用程序的频率存在一些神奇的无证限制。每天大约 15 个应用程序。之后您达到该限制,您将收到此消息错误:

apkNotificationMessageKeyReachedUploadLimit

static void Main(string[] args)

    {
        MainAsync(args).GetAwaiter().GetResult();
    }

    static async Task MainAsync(string[] args)
    {
        var email = "yourserviceaccountmail";
        ServiceAccountCredential credential = new ServiceAccountCredential(
            new ServiceAccountCredential.Initializer(email)
            {
                Scopes = new[] { PlaycustomappService.Scope.Androidpublisher }
            }.FromPrivateKey("client_secrets.json"));

        CustomApp appMetadata = new CustomApp();
        appMetadata.Title = "YOUR APP";
        appMetadata.LanguageCode = "en_US";

        // Create the service.
        var service = new PlaycustomappService(new BaseClientService.Initializer()
        {
            HttpClientInitializer = credential,
            ApplicationName = "Custom Apps API Sample",
        });

        var acc = new AccountsResource(service);
        using (var stream = new FileStream("app-release.apk", FileMode.Open))
        {
            long devIAccountd = 12345678L;
            var app = acc.CustomApps.Create(appMetadata, devIAccountd, stream, "application/octet-stream");
            var response = await app.UploadAsync();
            if (response.Exception != null)
            {
                Console.WriteLine("Someting went wrong:");
                Console.WriteLine(response.Exception.Message);
            }
            if (response.Status == Google.Apis.Upload.UploadStatus.Completed)
            {
                Console.WriteLine("Succeeded!");
            }
        }
    }

【讨论】:

    猜你喜欢
    • 2018-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 2019-01-18
    • 1970-01-01
    相关资源
    最近更新 更多