- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Google Play Developer API v2 在 Play 商店中以编程方式上传我的测试版 apks,它运行良好:-)
现在,我想以编程方式将 beta apk 从“测试版”轨道“提升”到“生产”轨道(这样我就不需要再在 Google Dev Console 上手动执行此操作. 我的应用程序套件由 10 个应用程序组成.. 这需要时间)
我正在尝试,但我不清楚如果不重新上传 apk 应该怎么做。
我想要实现的是修改以前上传的 apks,只需更改 Track ,从“测试版”到“生产版”。
下面是我写的代码,它做了:
SEVERE: Exception was thrown while updating listing
com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden
{
"code" : 403,
"errors" : [ {
"domain" : "androidpublisher",
"message" : "Testing-track (alpha/beta) APK with version code 1522428584 appears in another track",
"reason" : "testingTrackApkInMultipleTracks"
} ],
"message" : "Testing-track (alpha/beta) APK with version code 1522428584 appears in another track"
}
at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:146)
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113)
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest$1.interceptResponse(AbstractGoogleClientRequest.java:321)
at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1065)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469)
at com.elementique.tools.publish.elementique.ElementiquePromoteBetaApkToProduction.main(ElementiquePromoteBetaApkToProduction.java:74)
根据异常(exception)情况,我编写的代码不会修改现有的 apk,而是尝试创建一个与现有 beta track 具有完全相同 ID 的新 apk。
我明白这是错误的,但不知道如何正确地做..
这是代码:有人可以向我解释如何以正确的方式做到这一点吗?
谢谢。
package com.elementique.tools.publish.elementique;
import com.elementique.tools.publish.AndroidPublisherHelper;
import com.google.api.services.androidpublisher.AndroidPublisher;
import com.google.api.services.androidpublisher.AndroidPublisher.Edits;
import com.google.api.services.androidpublisher.model.*;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.ArrayList;
import java.util.List;
public class ElementiquePromoteBetaApkToProduction {
private static final Log log = LogFactory.getLog(ElementiquePromoteBetaApkToProduction.class);
private static final String PACKAGE_NAME = "com.elementique.home";
public static final String TRACK_BETA = "beta";
public static final String TRACK_PRODUCTION = "production";
public static void main(String[] args) {
try {
// Create the API androidPublisher service.
final AndroidPublisher androidPublisher = AndroidPublisherHelper.init("Elementique", null);
final Edits edits = androidPublisher.edits();
// Create a new edit to make changes.
Edits.Insert insertEdit = edits.insert(PACKAGE_NAME, null);
AppEdit insertAppEdit = insertEdit.execute();
// search for 'beta' apk(s) in the 'beta' track..
// first list all tracks..
TracksListResponse trackListResponse = edits.tracks().list(PACKAGE_NAME, insertAppEdit.getId()).execute();
for (Track track : trackListResponse.getTracks()) {
// filter for beta track..
if (TRACK_BETA.equals(track.getTrack())) {
// beta track found...
System.out.println("Beta Track found!\n" + track.toPrettyString());
// in my case, I am supposed to have exactly one 'beta' apk
List<Integer> betaApkVersionCodes = track.getVersionCodes();
if (betaApkVersionCodes.size() == 1) {
// one apk: OK, that's the 'beta' apk I want to promote to 'production'
Integer betaApkVersionCode = betaApkVersionCodes.get(0);
// now search for the given apk among all existing apks (is it the good way to proceed..??)
ApksListResponse apksListResponse = edits.apks().list(PACKAGE_NAME, insertAppEdit.getId()).execute();
for (Apk apk : apksListResponse.getApks()) {
// is it our 'beta' apk?
if (betaApkVersionCode.equals(apk.getVersionCode())) {
System.out.println("Beta apk found!\n" + apk.toPrettyString());
// OK, we got it.
// now trying to change the 'track' of this apk from 'beta' to 'production'
// and this is not the way to proceed...
List<Integer> apkVersionCodes = new ArrayList<>();
apkVersionCodes.add(apk.getVersionCode());
Edits.Tracks.Update updateTrackRequest =
edits.tracks().update(
PACKAGE_NAME,
insertAppEdit.getId(),
TRACK_PRODUCTION,
new Track().setVersionCodes(apkVersionCodes));
Track updatedTrack = updateTrackRequest.execute();
log.info(String.format("Track %s has been updated.", updatedTrack.getTrack()));
// Commit changes for edit.
Edits.Commit commitRequest = edits.commit(PACKAGE_NAME, insertAppEdit.getId());
AppEdit commitAppEdit = commitRequest.execute();
log.info(PACKAGE_NAME + " beta apk moved to production (" + commitAppEdit.getId());
System.exit(0);
}
}
}
}
}
} catch (IOException | GeneralSecurityException ex) {
log.error("Exception was thrown while updating listing", ex);
}
}
}
(不要告诉我括号 hell ,我只是这样写这段代码来做一个简单的测试;-)
注意事项:
最佳答案
搞定了:-)
可以在这里找到解释:https://developers.google.com/android-publisher/tracks
以编程方式将“测试版”轨道提升为“生产”轨道的示例代码:
package com.elementique.tools.publish.elementique;
import com.elementique.tools.publish.AndroidPublisherHelper;
import com.google.api.services.androidpublisher.AndroidPublisher;
import com.google.api.services.androidpublisher.AndroidPublisher.Edits;
import com.google.api.services.androidpublisher.model.AppEdit;
import com.google.api.services.androidpublisher.model.Track;
import com.google.api.services.androidpublisher.model.TracksListResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.ArrayList;
import java.util.List;
// Google Play Developer API v2 javadoc:
// https://developers.google.com/resources/api-libraries/documentation/androidpublisher/v2/java/latest/index.html?com/google/api/services/androidpublisher/AndroidPublisher.html
// + this: https://developers.google.com/android-publisher/api-ref/
public class ElementiquePromoteBetaApkToProduction {
private static final Log log = LogFactory.getLog(ElementiquePromoteBetaApkToProduction.class);
private static final String PACKAGE_NAME = "com.elementique.home";
public static final String TRACK_BETA = "beta";
public static final String TRACK_PRODUCTION = "production";
public static void main(String[] args) {
try {
final AndroidPublisher androidPublisher = AndroidPublisherHelper.init("Elementique", null);
final Edits edits = androidPublisher.edits();
// Create a new edit to make changes.
Edits.Insert insertEdit = edits.insert(PACKAGE_NAME, null);
AppEdit insertAppEdit = insertEdit.execute();
// Promote beta to production: doc here:
// https://developers.google.com/android-publisher/tracks
TracksListResponse trackListResponse = edits.tracks().list(PACKAGE_NAME, insertAppEdit.getId()).execute();
Track betaTrack = null;
Track productionTrack = null;
// list current tracks.
// searching for exactly one beta and one production...
for (Track track : trackListResponse.getTracks()) {
if (TRACK_BETA.equals(track.getTrack())) {
if (track.getVersionCodes().size() == 1) {
// one version: OK, that's the 'beta' apk I want to promote to 'production'
betaTrack = track;
log.info(PACKAGE_NAME + ": found 'beta' apk " + betaTrack.getVersionCodes().get(0));
}
} else if (TRACK_PRODUCTION.equals(track.getTrack())) {
if (track.getVersionCodes().size() == 1) {
// one version: OK, that's the 'production' apk I want to replace with the former 'beta' apk
productionTrack = track;
log.info(PACKAGE_NAME + ": found 'production' apk" + productionTrack.getVersionCodes().get(0));
}
}
}
if (betaTrack != null && productionTrack != null) {
// first set production track to version of current beta
Edits.Tracks.Update updateProductionTrackRequest =
edits.tracks().update(
PACKAGE_NAME,
insertAppEdit.getId(),
TRACK_PRODUCTION,
new Track().setVersionCodes(betaTrack.getVersionCodes()));
updateProductionTrackRequest.execute();
// .. then clear beta version(no more beta apk)
Edits.Tracks.Update updateBetaTrackRequest =
edits.tracks().update(
PACKAGE_NAME,
insertAppEdit.getId(),
TRACK_BETA,
new Track().setVersionCodes(new ArrayList<>()));
updateBetaTrackRequest.execute();
// Commit changes for edit
Edits.Commit commitRequest = edits.commit(PACKAGE_NAME, insertAppEdit.getId());
AppEdit commitAppEdit = commitRequest.execute();
log.info(PACKAGE_NAME + ":" +
" 'production' apk " + productionTrack.getVersionCodes().get(0) + "" +
" replaced by 'beta' apk " + betaTrack.getVersionCodes().get(0));
}
} catch (IOException | GeneralSecurityException ex) {
log.error(PACKAGE_NAME + " : Error while trying to promote 'beta' apk to 'production'", ex);
}
}
}
关于android - 以编程方式将 'beta' apk 提升为 'production',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49588393/
在本教程中,您将通过示例学习 JavaScript。 JavaScript 中的提升是一种在声明之前可以使用函数或变量的行为。例如, // using test before declarin
我正在学习javascript提升功能,发现下面的代码真的很困惑: var a = 1; function b() { a = 10; return; function a()
作为一个JS学习者,我发现了一件很有趣的事情,考虑下面的代码。 this.init = function (e) { var container = e.container;
Quasiquotes 的 Scala 文档在解释 Lifting 时提到了这一点: One can also combine lifting and unquote splicing: scala
我是新来的。到目前为止,我一直在使用 MVC 模型并使用基本的 session 管理模型,即在 session 中存储一个 token 并检查每个请求。 我正在尝试对lift做同样的事情,但我的 se
我当前使用的是Elasticsearch 2.4版,希望根据查询时间的增加或加权,根据我称为“类型”的字段对结果集进行微调。 例如 如果字段“类型”的值为“船”,则将权重或增强值增加4 如果字段“类型
一年多以来,我一直在大量使用 lift、return 以及 EitherT、ReaderT< 等构造函数,等等。我读过《Real World Haskell》、《Learn You a Haskell
我浏览了电梯的MegaProtoUser遇到这种结构:??("Last Name")。谁能解释一下,这是什么意思? 谢谢解答 最佳答案 它是在对象 S 上定义的: def ??(str : Strin
我有一个Solr索引,每个文档都是一个Event的信息。在我的架构中,Schedule 是日期类型的多值字段。我想知道是否可以使用计划日期来增加文档(多值字段中的任何日期)在未来并且最接近当前日期?我
作为测试,我正在尝试使用设计人员友好的模板在 lift 中创建一个表单。我正在使用 Lift 2.5 我已经设法使用 toForm 创建了一个工作表单,但我只是在探索所有可能的方法。 我的 html
如果这个问题已经被问到,我深表歉意。 是否可以清除已经设置的条件变量? 下面是我想要实现的详细信息: void worker_thread { while (wait_for_conditio
尝试学习Js,无法理解为什么DOM元素没有获取到值: var Car = function(loc) { var obj = Object.create(Car.prototype); obj
我想知道吊装。我知道如果全局函数名称与全局变量相同,函数会覆盖变量的名称。是吗? 这是我的代码。 (function() { console.log('console.log#1 ' + glob
这个问题已经有答案了: var functionName = function() {} vs function functionName() {} (41 个回答) 已关闭 7 年前。 在javas
我正在开发 Windows 资源管理器 namespace 扩展。我的应用程序是explorer.exe在某个时候加载和使用的动态库。我需要我的 DLL 在 C:\中创建文件,有时在其他需要提升才能执
背景: GitHub 属于客户。我们团队中有一些新手,他们有时会错过基本的命名约定和其他编码协议(protocol)。所以,如果哪位前辈想在内部review,除了创建PR,别无他法。但是这个 PR 对
我们需要在运行时更改 HKEY_LOCAL_MACHINE 的一些设置。 如果需要在运行时,是否可以提示 uac 提升,或者我是否必须启动第二个提升的进程来完成“肮脏的工作”? 最佳答案 我会以提升的
看着Haskell文档,提升似乎基本上是 fmap 的概括,允许映射具有多个参数的函数。 Wikipedia然而,关于提升的文章给出了不同的观点,根据类别中的态射来定义“提升”,以及它如何与类别中的其
ggplot2 package 很容易成为我用过的最好的绘图系统,除了对于较大的数据集(约 50k 点)性能不是很好。我正在研究通过 Shiny 提供网络分析,使用 ggplot2作为绘图后端,但我对
是否可以提升 powershell 脚本的权限,以便没有管理员权限的用户可以运行该脚本?我们的网络管理员正在尝试寻找更省时的方法来完成某些任务,目前他们必须使用远程桌面...使用 PS 脚本将其自动化
我是一名优秀的程序员,十分优秀!