依存関係を Android マーケットに公開する
-
25-10-2019 - |
質問
私は、Bluetooth ビデオ デバイスに接続する会社用の Android アプリケーションに取り組んでいます。私たちが協力しているサードパーティ企業は Bluetooth カメラを構築し、アプリがカメラと対話するために使用する接続先のサービス (Android サービス) を構築しました。この会社は私たちがソース コードにアクセスすることを望まなかったため、カメラとの対話を行うために携帯電話にインストールする必要があるサービスの形式で SDK を作成しました。サービス (単なる APK) がインストールされていない場合、アプリは動作しません。
ただし、サービスが存在しないことを検出して、APK の取得に進むことはできます。現在、そのための最良の方法を見つけようとしています。UI がなく、インストールしても何も起こらないように見える場合でも、他の会社にこのサービスを Android マーケットで公開してもらうことは可能でしょうか?Android マーケットに何かを入れても、通常のフィルターで表示されないようにすることはできますか (つまり、そのページにアクセスする唯一の方法はページに直接アクセスすることになります)。サードパーティ会社が独自のカメラ (彼らが私たちのために作ったものとほぼ同じ) を販売しており、そのためのアプリケーションを市場に持っているので、彼らは人々にそれをインストールしてほしくないと思います。
もう 1 つの可能性は、ファイルを自分でホストし、ユーザーが最初にアプリをインストールするときにダウンロードすることです。ただし、問題は、アップグレードのための独自の方法論を見つけなければならないことです。
誰かこれに関する経験がある人、または私たちの状況に対処する最善の方法について何かアイデアを持っている人はいますか?
解決 2
結局、アプリケーションの /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();
}
つまり、アプリの最初の起動時に、サービスをインストール (またはアップグレード) する必要があるかどうかを確認します。このコードはもう少し複雑で、ここで行うことの範囲外であるため、投稿しませんでした。ただし、サービスをインストールする必要があると判断した場合は、ユーザーにダイアログを表示し、ユーザーが [OK] をクリックした場合は、上記の installService メソッドを呼び出します。
他のヒント
その状況にある場合は、会社サーバーからAPKをホストすることをお勧めします。