我正在为我的公司开发一个连接到蓝牙视频设备的Android应用程序。我们正在与构建蓝牙相机合作的第三方公司,并构建了我们的应用程序连接的服务(Android服务),我们使用该服务来与摄像机进行交互。该公司不希望我们能够访问源代码,因此他们以服务形式创建了一个SDK,必须在电话上安装,以与相机进行交互。如果未安装服务(仅是APK),我们的应用将无法正常工作。

但是,我们可以检测到该服务不存在,然后继续获取APK,现在我们正在尝试找出最好的方法。即使没有UI,我们是否有可能让另一家公司在Android市场上发布此服务,并且安装何时似乎无能为力?您能否将某些东西放在Android市场中,而不会在普通过滤器下显示出来(这意味着直接进入页面的唯一方法是?)。我不认为他们希望人们安装它,因为第三方公司确实在那里出售了自己的相机(与他们为我们制作的相机几乎相同),并且他们在市场上都有应用程序。

另一种可能性是我们自己托管文件并在用户首次安装应用程序时下载它。尽管如此,我们必须找出自己的升级方法。

有没有人对此有经验,或者有任何想法可能是应对我们处境的最佳方法?

有帮助吗?

解决方案 2

我最终通过将Service APK捆绑在我的应用程序 /资产文件夹中,从而解决了问题。您可以从该数据中读取作为InputStream,并将其写入SDCARD,然后可以启动安装APK的意图。用户所要做的就是单击“安装”(只要允许使用第三方应用程序,它们将因为我们的应用程序不在市场上,它们就会。

public static final String SERVICE_APK_FILENAME = "SomeService.apk";

protected void installService() {

    File apk = getServiceFileOnDisk();
    if (!apk.exists()) {
        try {
            writeServiceToFile();
        } catch (Exception ex) {
            Log.e(TAG, "", ex);                
            return;
        }
    }

    Intent promptInstall = new Intent(Intent.ACTION_VIEW);
    promptInstall.setDataAndType(Uri.fromFile(getServiceFileOnDisk()),
            "application/vnd.android.package-archive");
    startActivityForResult(promptInstall, REQUEST_INSTALL_APK);
}

protected File getServiceFileOnDisk() {
    return new File(Util.getAppStorageDirectory(this), SERVICE_APK_FILENAME);
}

protected void writeServiceToFile() throws IOException {
    File apk = getServiceFileOnDisk();
    InputStream assetIs = mAssetMgr.open(SERVICE_APK_FILENAME);
    OutputStream out = new FileOutputStream(apk);
    // Transfer bytes from in to out
    byte[] buf = new byte[4 * 1024];
    int len;
    while ((len = assetIs.read(buf)) > 0) {
        out.write(buf, 0, len);
    }
    assetIs.close();
    out.close();       
}

因此,发生的事情是,当应用程序首次启动时,我会检查是否需要安装服务(或升级)。该代码更复杂,并且超出了我在这里所做的工作范围,因此我没有发布它。但是,如果我确定需要安装服务,我会提示用户使用对话框,如果他们单击“确定”,则会调用上面显示的installService方法。

其他提示

如果您处于这种情况下,我建议您从公司服务器托管APK。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top