SORU
25 Temmuz 2011, PAZARTESİ


Kaldır APKs yükle / Program aracılığıyla (PackageManager vs Niyet)

Benim uygulama diğer uygulamalar yükler ve yüklediği ne izlemek gerekiyor. Tabii ki, bu sadece yüklü uygulamaların bir listesini tutmak elde edilebilir. Ama bu gerekli olmamalıdır! (A, b) installedBy ilişkiyi korumak için PackageManager sorumluluğu olmalıdır. Bu API göre aslında:

kamu soyut DizegetİnstallerPackageName(Dize packageName) - . ben^>Bir paket yüklü uygulama paketi adını almak. Bu paketi gelen tanımlar.

Geçerli bir yaklaşım

Niyet kullanarak MUAYENE yükleyin

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
startActivity(intent);

Kaldır MUAYENE Niyet kullanarak:

Intent intent = new Intent(Intent.ACTION_DELETE, Uri.fromParts("package",
getPackageManager().getPackageArchiveInfo(apkUri.getPath(), 0).packageName,null));
startActivity(intent);

Bu tabii ki örneğin Android Market yükler / kaldırır paketleri bu şekilde değil. Bu PackageManager daha zengin bir versiyonunu kullanıyorlar. Bu Android Git deposundan arı, Android indirerek görülen kaynak kodu. Aşağıda Niyet yaklaşımı karşılık gelen iki gizli yöntem. Ne yazık ki dış geliştiriciler için kullanılabilir. Ama belki de gelecekte olacaklar?

Daha iyi bir yaklaşım

Yükleme APK PackageManager kullanarak

/**
 * @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);

Kaldırma APK PackageManager kullanarak

/**
 * 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

  • Niyet kullanırken yerel Paket Yöneticisi yükleme kaynaklanan farkında değildir. Özellikle, getİnstallerPackageName(...) null döndürüyor.

  • Gizli yöntemi ınstallpackage(...) bir parametre olarak yükleyici paketi adını alır, ve büyük olasılıkla bu değer ayarlama yeteneğine sahiptir.

Soru

Paket yükleyici adını kullanarak hedefleri belirlemek mümkün mü? . ben^>(Yükleyici paketinin belki de adını yüklemesi için ekstra bir niyet olarak eklenebilir mi?)

. ben^>İpucu: Eğer Android kaynak kodunu indirmek istiyorsanız burada anlatılan adımları takip edebilirsiniz: Kaynak Ağacı. İndirme *Ayıklamak için.java dosya ve klasörleri koydum bu düzenli komut dosyası kontrol edebilirsiniz paket hiyerarşiye göre: View Android Source Code in Eclipse.

CEVAP
9 EKİM 2011, Pazar


Bu üçüncü taraf uygulamaları için şu anda kullanılabilir değil. Hatta erişmek için yansıma veya diğer teknikleri kullanarak ınstallpackage not() sadece sistem uygulamaları kullanabilir çünkü. (Bu düşük seviye mekanizması, izinlerini düzenli uygulamalara erişim için güvenli değildir; bu nedenle, kullanıcı tarafından onaylanması, sonra yükleyin.)

Ayrıca ınstallpackage() işlevi, bağımsız değişken genellikle platform bültenleri, platformun çeşitli diğer sürümlerinde başarısız olur erişimi çalışırken yaptığınız her şey değişti.

DÜZENLEME:

Ayrıca bu installerPackage sadece oldukça son zamanlarda platforma eklenen işaret değer (2.2?) ve aslında gerçekten izlemek için kullanılan bir Android Uygulama Geribildirim için app hata raporlama, zaman başlatmak için kimin belirlemek için bir platform, bu uygulaması yüklü olan. (Bu da zamanın argümanlar değişti API yöntemi biriydi.) En azından uzun bir süre sonra tanıtıldı, Pazar hala gelmedi kullanmak için takip uygulamaları vardır yüklü (ve hala yok), ama bunun yerine sadece kullanılan bu set Android Geribildirim uygulaması (ayrı Pazar) olarak "sahibi" göz kulak olmak için geri bildirim.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Julia Graf

    Julia Graf

    6 Mayıs 2006
  • Stevie

    Stevie

    2 Mayıs 2010
  • Thehalopianoplayer

    Thehalopiano

    4 ŞUBAT 2011