我正在为我的公司开发一个连接到蓝牙视频设备的Android应用程序。我们正在使用的第三方公司构建了蓝牙摄像头并构建了一个服务(Android服务),我们的应用程序连接到我们用来与摄像头交互的服务。该公司不希望我们访问源代码,因此他们以服务的形式创建了一个SDK,该服务必须安装在手机上才能与相机进行交互。如果未安装该服务(只是一个APK),我们的应用程序将无效。
但是,我们可以检测到该服务不存在,然后继续获取apk,现在我们正在尝试找出最佳方法。是否有可能我们可以让另一家公司在Android市场上发布这项服务,即使它没有ui,安装时似乎什么都不做?你可以在Android市场上放一些东西而不是在正常的过滤器下显示它(意味着到达它的唯一方法是直接进入页面吗?)。我不认为他们希望人们安装它,因为第三方公司确实销售自己的相机(几乎与他们为我们制造的相机),并且他们在市场上有应用。
另一种可能性是我们自己托管文件并在用户首次安装应用程序时下载它。但问题是我们必须弄清楚我们自己的升级方法。
有没有人有这方面的经验或有任何想法可能是处理我们情况的最佳方法?
答案 0 :(得分:0)
如果您处于这种情况,我建议您从公司服务器托管apk。
答案 1 :(得分:0)
我最终通过在我的应用程序的/ assets文件夹下捆绑服务apk来解决问题。 您可以将该数据作为输入流读取并将其写入SD卡,然后您可以启动安装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方法。