Aplikasi saya menginstal aplikasi lain, dan perlu melacak aplikasi apa yang telah diinstal. Tentu saja, ini dapat dicapai dengan hanya menyimpan daftar aplikasi yang diinstal. Tapi ini seharusnya tidak perlu! Seharusnya menjadi tanggung jawab PackageManager untuk mempertahankan hubungan yang diinstal oleh (a, b). Bahkan, menurut API itu adalah:
public abstrak String getInstallerPackageName (String packageName) - Ambil nama paket aplikasi yang menginstal paket. Ini mengidentifikasi dari pasar mana paket itu berasal.
Pendekatan saat ini
Instal APK menggunakan Intent
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
startActivity(intent);
Copot pemasangan APK menggunakan Intent:
Intent intent = new Intent(Intent.ACTION_DELETE, Uri.fromParts("package",
getPackageManager().getPackageArchiveInfo(apkUri.getPath(), 0).packageName,null));
startActivity(intent);
Ini jelas bukan cara misal Android Market menginstal / mencopot paket. Mereka menggunakan versi PackageManager yang lebih kaya. Ini dapat dilihat dengan mengunduh kode sumber Android dari repositori Android Git. Di bawah ini adalah dua metode tersembunyi yang sesuai dengan pendekatan Intent. Sayangnya mereka tidak tersedia untuk pengembang eksternal. Tapi mungkin mereka akan ada di masa depan?
Pendekatan yang lebih baik
Menginstal APK menggunakan PackageManager
/**
* @hide
*
* Install a package. Since this may take a little while, the result will
* be posted back to the given observer. An installation will fail if the calling context
* lacks the {@link android.Manifest.permission#INSTALL_PACKAGES} permission, if the
* package named in the package file's manifest is already installed, or if there's no space
* available on the device.
*
* @param packageURI The location of the package file to install. This can be a 'file:' or a
* 'content:' URI.
* @param observer An observer callback to get notified when the package installation is
* complete. {@link IPackageInstallObserver#packageInstalled(String, int)} will be
* called when that happens. observer may be null to indicate that no callback is desired.
* @param flags - possible values: {@link #INSTALL_FORWARD_LOCK},
* {@link #INSTALL_REPLACE_EXISTING}, {@link #INSTALL_ALLOW_TEST}.
* @param installerPackageName Optional package name of the application that is performing the
* installation. This identifies which market the package came from.
*/
public abstract void installPackage(
Uri packageURI, IPackageInstallObserver observer, int flags,
String installerPackageName);
Menghapus instalasi APK menggunakan PackageManager
/**
* Attempts to delete a package. Since this may take a little while, the result will
* be posted back to the given observer. A deletion will fail if the calling context
* lacks the {@link android.Manifest.permission#DELETE_PACKAGES} permission, if the
* named package cannot be found, or if the named package is a "system package".
* (TODO: include pointer to documentation on "system packages")
*
* @param packageName The name of the package to delete
* @param observer An observer callback to get notified when the package deletion is
* complete. {@link android.content.pm.IPackageDeleteObserver#packageDeleted(boolean)} will be
* called when that happens. observer may be null to indicate that no callback is desired.
* @param flags - possible values: {@link #DONT_DELETE_DATA}
*
* @hide
*/
public abstract void deletePackage(
String packageName, IPackageDeleteObserver observer, int flags);
Perbedaan
Saat menggunakan maksud, manajer paket lokal tidak mengetahui dari aplikasi mana asalnya. Secara khusus, getInstallerPackageName (...) mengembalikan nol.
Metode tersembunyi installPackage (...) menggunakan nama paket installer sebagai parameter, dan kemungkinan besar mampu mengatur nilai ini.
Pertanyaan
Apakah mungkin untuk menentukan nama pemasang paket menggunakan maksud? (Mungkin nama paket penginstal dapat ditambahkan sebagai tambahan untuk maksud instalasi?)
Tip: Jika Anda ingin mengunduh kode sumber Android, Anda dapat mengikuti langkah-langkah yang dijelaskan di sini: Mengunduh Source Tree. Untuk mengekstrak file * .java dan meletakkannya di folder sesuai dengan hierarki paket, Anda dapat memeriksa skrip yang rapi ini: Lihat Kode Sumber Android di Eclipse .