次のコードを使用して、Android ソース コード内に配置したアプリケーションからアプリケーションをインストールします。
エミュレーターをコンパイルしてビルドしました。Android ソースからビルドされたエミュレーター内でアプリケーションが完全に動作することがわかります。
アプリケーションの特定の時点で、アプリケーション内から別のアプリケーションをインストールしようとしました。インストールしようとしているアプリケーションの APK パスは次のとおりです。
/data/data/com.games.golf/cache/MyGames/Golf.apk
以下は、アプリケーションから上記のパスにアプリケーションをインストールするために使用するコードです。
private void InstallApplicaiton(String url)
{
PackageParser.Package mPackage = PackageUtil.getPackageInfo(Uri.parse(url));
installingList.addView(getProgressView(mPackage,url));
int installFlags = 0;
PackageManager pm = getPackageManager();
try {
PackageInfo pi = pm.getPackageInfo(mPackage.packageName,
PackageManager.GET_UNINSTALLED_PACKAGES);
if(pi != null) {
System.out.println("Inside pi if not null");
installFlags |= PackageManager.INSTALL_REPLACE_EXISTING;
}
} catch (NameNotFoundException e) {
e.printStackTrace();
}
String installerPackageName = getIntent().getStringExtra(
Intent.EXTRA_INSTALLER_PACKAGE_NAME);
System.out.println("installerPackageName:"+installerPackageName);
PackageInstallObserver observer = new PackageInstallObserver();
pm.installPackage(Uri.parse(url), observer, installFlags, installerPackageName);
}
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case INSTALL_COMPLETE:
System.out.println("package installed");
break;
}
}
};
class PackageInstallObserver extends IPackageInstallObserver.Stub {
public void packageInstalled(String packageName, int returnCode) {
Message msg = mHandler.obtainMessage(INSTALL_COMPLETE);
msg.arg1 = returnCode;
mHandler.sendMessage(msg);
}
}
PackageInstallObserver
パッケージがインストールされていることから、ハンドラー内に SOP メッセージが表示されます。しかし、インストールされたアプリケーションがランチャーに表示されません。
私は、サードパーティ製アプリケーションが APK をプログラムでインストールまたはアンインストールできないことを認識しています。このため、アプリケーションから別のアプリケーションをインストールできるように、アプリケーションを含めてエミュレーターをコンパイルおよびビルドしました。しかし、ここでも上記のコードに行き詰まったとき、その理由がわかりません。
Android がパッケージのインストールに使用するのと同じコードを使用しましたが、上記のコードが機能せず、パッケージがインストールされない理由は理解できません。
ここで気付くことができる唯一の問題は、それString installerPackageName
が常に null であることです。
パッケージがアプリケーションからインストールされるように、この問題を解決するのに役立つこの点に関するヘルプをいただければ幸いです。
編集
以下はログです。そのためか、これはエミュレーターから、それもキャッシュフォルダーからインストールしようとしています - /data/data/com.games.golf/cache
。このフォルダへのアクセス許可と関係がありますか?
05-29 19:31:57.237: W/asset(7490): Asset path /data/data/com.games.golf/cache/MyGames/Golf.apk is neither a directory nor file (type=0).
05-29 19:31:57.237: W/DefContainer(7490): Failed to parse package
05-29 19:31:57.237: W/ActivityManager(79): No content provider found for permission revoke: /data/data/com.games.golf/cache/MyGames/Golf.apk
05-29 19:31:57.297: I/ActivityManager(79): Displayed com.games.golf/.screens.PackageInstaller: +448ms
05-29 19:31:57.607: D/dalvikvm(79): GC_EXPLICIT freed 71K, 11% free 8410K/9415K, paused 4ms+7ms