Uygulamam diğer uygulamaları yüklüyor ve hangi uygulamaları yüklediğini takip etmesi gerekiyor. Tabii ki, bu sadece kurulu uygulamaların bir listesini tutarak elde edilebilir. Ama bu gerekli olmamalı! Kurulu (a, b) ilişkisini sürdürmek PackageManager'ın sorumluluğunda olmalıdır. Aslında, API'ye göre:
public abstract String getInstallerPackageName (String packageName) - Bir paketi yükleyen uygulamanın paket adını alır. Bu, paketin hangi pazardan geldiğini tanımlar.
Mevcut yaklaşım
Niyeti kullanarak APK yükle
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
startActivity(intent);
APK'yı Amaç kullanarak kaldırın:
Intent intent = new Intent(Intent.ACTION_DELETE, Uri.fromParts("package",
getPackageManager().getPackageArchiveInfo(apkUri.getPath(), 0).packageName,null));
startActivity(intent);
Bu, Android Market'in paketleri kurması / kaldırması gibi bir şey değildir. PackageManager'ın daha zengin bir sürümünü kullanırlar. Bu, Android Git deposundan Android kaynak kodunu indirerek görülebilir. Aşağıda, Niyet yaklaşımına karşılık gelen iki gizli yöntem bulunmaktadır. Ne yazık ki harici geliştiriciler tarafından kullanılamıyor. Ama belki de gelecekte olacaklar?
Daha iyi yaklaşım
PackageManager'ı kullanarak APK yükleme
/**
* @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);
APK'yı PackageManager kullanarak kaldırma
/**
* 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);
farklılıklar
Amaçları kullanırken, yerel paket yöneticisi yüklemenin hangi uygulamadan kaynaklandığı konusunda bilgilendirilmez. Özellikle, getInstallerPackageName (...) null değerini döndürür.
Gizli installPackage (...) yöntemi, yükleyici paketinin adını parametre olarak alır ve büyük olasılıkla bu değeri ayarlayabilir.
Soru
Amaçlarını kullanarak paket yükleyici adını belirtmek mümkün mü? (Belki de kurulum paketinin adı kurulum amacına ekstra olarak eklenebilir?)
İpucu: Android kaynak kodunu indirmek istiyorsanız, burada açıklanan adımları takip edebilirsiniz: Kaynak Ağacını İndirme. * .Java dosyalarını ayıklamak ve paket hiyerarşisine göre klasörlere koymak için bu düzgün komut dosyasına göz atabilirsiniz: Eclipse'de Android Kaynak Kodunu Görüntüle .