【问题标题】:How to restrict android app to specific device make?如何将 android 应用程序限制为特定设备品牌?
【发布时间】:2012-03-01 04:32:30
【问题描述】:

我正在为特定品牌的手机开发一个 Android 应用程序 - 这是项目要求,而不是我的决定。

因此,我需要能够在 android 市场上仅向该特定制造商生产的那些设备提供该应用。

我似乎无法找到如何做到这一点。

有可能吗?

附: 我可以在 android 代码中检索设备制造商。 所以我怀疑市场应用程序也应该能够按设备制造过滤。 我只是不知道它是否真的有(如果有那就太好了)。

【问题讨论】:

  • 这是一篇好文章mobile.tutsplus.com/tutorials/android/…。类似于接受的答案
  • 简而言之,在撰写本文时,无法通过 Google Play 开发者控制台执行此操作。虽然这里有一些技巧可以使用脚本自动为数千台设备一次点击“排除”按钮,但没有白名单概念,默认情况下会包含新设备。真正实现这一点的唯一方法是针对独特的硬件功能,但这当然需要在设备的固件中进行定义。

标签: android google-play


【解决方案1】:

您无需在应用程序代码中根据设备/制造商过滤您的应用程序,而是可以在您发布应用程序本身时从 android 市场开发者控制台 - https://market.android.com/publish/ 执行此操作。

开发者控制台上有一个“支持的设备”部分,其中显示了可以访问 android 市场的所有设备的列表。然后,您可以过滤掉与您的应用不兼容的设备或制造商

这是主开发者控制台中的部分:

您可以在此处排除设备和/或制造商查看您的应用

有关更多信息,请参阅Device Availability 帮助页面,其中显示:

设备可用性对话框可以帮助开发人员在两个强大的 方式:

了解哪些设备可以在 Android Market 中找到您的应用

  1. 设备可用性提供兼容设备的动态列表,基于 您的清单设置。例如,如果您的 apk 清单指定 大屏幕尺寸,控制台将反映支持的设备 可以在 Market 中找到您的应用。

  2. 您还可以使用动态搜索 功能以查看您的应用程序将不可用的设备 到。您可以按制造商、设计名称(例如“Passion”)搜索, 或实际的公共设备名称(例如“Nexus One”),查看您的 清单设置过滤了设备。过滤有问题或 不兼容的设备 此功能提供了特定于设备的 开发人员的管理选项。当您将设备添加到 “手动排除的设备”列表,您的应用将无法用于 市场中排除的设备。这主要是为了帮助 开发人员通过帮助提供最佳的用户体验 开发人员会过滤掉已知存在兼容性问题的设备。

【讨论】:

  • 这很全面...感谢 Soham 的帮助。
  • 虽然这仍然适用,但如果您想全选或一次简单地删除多个制造商,这似乎是一个逐个排除的艰巨过程。
  • 您能否为您的应用 v1.0 排除一组设备,为您的应用 v2.0 排除另一组设备?
  • @Brendan 你有没有找到办法做到这一点?据我所知,您只能在每个应用程序的基础上排除设备,而不是每个 apk...
  • @soham:如果新设备启动了怎么办。在这种情况下,默认情况下它将被设置为启用并允许下载。
【解决方案2】:

在开发者控制台页面的支持的设备部分,您可以查看所有设备的列表。这会加载超过 2,000 个滑块类型的复选框,这些复选框最初设置为启用。不幸的是,界面中似乎没有“全部禁用/启用”选项...

...相反,我使用 Firebug 的检查器工具来获取这些滑块对象的类名(不记得它现在是什么 - 两个随机的大写首字母缩写词),然后在 Javascript 控制台中执行一个表达式来切换状态每个滑块。比如:

switches = document.getElementsByClassName("ABC DEF"); for(i = 0; i < switches.length; i++) switches[i].click();

这会使浏览器冻结一两分钟,但之后,每部手机都被标记为不受支持。然后您可以启用您需要支持的手机。

【讨论】:

  • 我希望在花时间编写自己的脚本之前能看到这条评论。这为我的公司节省了很多时间。这是我写的脚本,但你的也可以。 var 节点 = document.getElementsByClassName("GLBE-H2DLBB GLBE-H2DMBB"); for(var i=0; i
  • @MichaelDePhillips:你的方法可能要快得多 - 谢谢你写出来:)
  • 它更快,但它似乎只是在视觉上切换开关而不是在功能上。看起来你的是唯一有效的!感谢您发布此信息,我会被难住的。
  • 感谢您发帖!我喜欢@Desty 发布的脚本,因为它将所有内容都标记为不受支持。
  • 对于不太了解 html/dom 的人(比如我),请注意,您需要更改此解决方案中提到的类名 (ABC DEF) 以匹配在提供给您的浏览器的网页。要找到正确的类名,请在 DOM 中搜索(使用 Firebug),直到找到一长串
  • ,其中包含具有 role="checkbox"; 的跨度;您应该使用的类名是该跨度的类。
【解决方案3】:

以下是对 Desty 答案的改进:

  • 自动检测类名
  • 真正取消选中:即使您已经有一些未选中的框也可以使用

代码:

var className = document.evaluate( 'string(//li[@data-device-id]/checkbox/@class)', document, null, XPathResult.STRING_TYPE, null ).stringValue;

switches = document.getElementsByClassName(className);
for(var i=0; i < switches.length; i++) {
   if (switches.item(i).getAttribute("aria-checked") == "false") switches[i].click();
}

执行此脚本大约需要 1 分钟。从您的浏览器 Javascript 控制台运行它。

【讨论】:

  • 我正在编写一个只能在三星设备上运行的应用程序,这篇文章为我节省了很多点击时间!!我最终做的是首先选择“支持的设备”列表并运行上述脚本以取消选择所有内容。我保存了这个,然后打开了手动排除的设备列表。最后,我搜索了“Samsung”并再次运行了相同的脚本——但这次是“true”。现在,只允许安装三星设备!
  • 我无法在 Google 开发者控制台页面上重新运行上述代码。请帮帮我
【解决方案4】:

嗯,你可以用合乎逻辑的方式来做。

首先使用getResources().getConfiguration() 的硬件细节。现在你可以给出条件,如果你的硬件是这个模型或名称,然后继续。

【讨论】:

  • 虽然@Soham 的答案是我想要的答案,但我也喜欢这个答案。
【解决方案5】:

我已经根据 KrisWebDev 的脚本编写了一个脚本来按品牌禁用设备。

您必须找到您选择的品牌的&lt;ol&gt;,编辑并添加id="sarasa",然后运行此脚本以禁用所有:

var nodes = document.getElementById("sarasa"); for(var i=0; i < nodes.childNodes.length; i++) { if (nodes.childNodes[i].childNodes[0].getAttribute("aria-checked") == "false") { nodes.childNodes[i].childNodes[0].click(); } }

【讨论】:

  • 我无法在 Google 开发者控制台页面上重新运行上述代码。请帮帮我
  • 嗨,Ameya,到底是什么问题?
【解决方案6】:

我使用与此页面上的答案不同的部分编写了一个小脚本(感谢@Desty 和@MichaelDePhillips)。该脚本很快(在我的计算机上在 100 到 200 毫秒之间),您可以指定一个不切换的品牌。这是脚本:

console.time('Execution time');
var manufacturers = document.querySelectorAll('[data-manufacturer-group]');

for (var i = 0; i < manufacturers.length; i++) {
    var manufacturer = manufacturers[i];
    var brand = manufacturer.firstElementChild;

    if (brand.tagName == 'H3' && brand.textContent != 'Samsung') {
        console.log(brand.textContent);
        var tags = manufacturer.children;

        for (var j=0;j<tags.length;j++) {
            var tag = tags[j];
            if (tag.tagName == 'OL') {
                var devices = tag.children;
                for (var k=0;k<devices.length;k++) {
                    var device = devices[k];
                    if (device.tagName == 'LI') {
                        var checkbox = device.firstElementChild;
                        var attr = checkbox.getAttribute;
                        if (checkbox.tagName == 'CHECKBOX') {
                            checkbox.setAttribute('aria-checked', 'true');
                        }
                    }
                }
            }
        }
    } 
}
console.timeEnd('Execution time');

这是我的第一个 javascript,欢迎所有反馈。

【讨论】:

  • 这肯定会切换切换,但不幸的是不会为我保存更改。
  • 谢谢。我使用了您的脚本,但必须更改 checkbox.setAttribute('aria-checked', 'true');到 checkbox.click()
【解决方案7】:

当您将应用程序上传到市场时,在发布页面上,您将有可用的设备选项,您可以在其中添加/删除设备。通过这种方式,您可以按制造商和型号名称过滤掉设备。

【讨论】:

    【解决方案8】:

    要在 Google Play 控制台支持的设备页面中选中/取消选中所有复选框,请使用以下脚本。此脚本适用于最新的 Google Play 控制台。只需在浏览器的控制台中复制粘贴(使用 CHROME 和 FIREFOX 测试)。

    function runScript() {
        for (var bxs = document.getElementsByTagName("input"), j = bxs.length; j--;){
            if (bxs[j].type == "checkbox"){
                bxs[j].click();
            }
    
        }
        let nextPage = document.querySelector('button[aria-label="Next page"]:enabled');
                   if(nextPage){
                     nextPage.click();
                     console.log("next page start");
                     setTimeout(runScript, 20);
                   }
    
    }
    
    runScript();
    

    【讨论】:

      【解决方案9】:

      随着 Google Play 控制台设计的演变,我没有成功地做出之前的工作。我注意到只有第一个复选框状态被修改。似乎每次点击都会向谷歌服务器发送 POST。经过一些尝试,我发现添加节奏允许在复选框上循环。 这是适合我的Javascript。只需在浏览器的控制台中复制粘贴(使用 CHROME 和 FIREFOX 测试)。请注意,如果您的贷款不是英文,则必须在下一页按钮的 querySelector 中替换“下一页”。

      function uncheckAll() {
          const cbxSelector= 'input[type=checkbox]:checked:enabled'
          let checkBoxes = document.querySelectorAll(cbxSelector)
          if (checkBoxes.length > 0) {
              checkBoxes[0].click();
              setTimeout(uncheckAll, 20);
          }else{
            let nextPage = document.querySelector('button[aria-label="Next page"]:enabled');
            if(nextPage){
              nextPage.click();
              setTimeout(uncheckAll, 20);
            }
          }
      }
      
      uncheckAll();
      

      如果您愿意检查所有复选框,只需将 'input[type=checkbox]:checked:enabled' 替换为 'input[type=checkbox]:checked:disabled '

      【讨论】:

        猜你喜欢
        相关资源
        最近更新 更多
        热门标签