2011-05-24 14 views
14

Mevcut etkinlik ve/veya ana uygulamasıyla ilişkili logoyu manifest'teki tanımdan yüklemeye çalışıyorum. Bu teknik zaten hem ilişkili başlık ve simge yükleme başarılı şekilde çalışmış, ancak logosu hep null ya da BuradanYük Aktivitesi ve/veya Uygulama Logosu Programatik Olarak Manifest ile

0 döndüren I ile Manifest'ten ilgili bilgi çalışıyorum edilir:

<application 
    android:icon="@drawable/ic_launcher" 
    android:logo="@drawable/ad_logo" 
    android:label="@string/app_name" 
    android:hardwareAccelerated="true"> 

    <activity 
     android:name=".MainActivity" 
     android:label="@string/app_name" 
     android:logo="@drawable/ad_logo"> 

activity yukarıda tanımlı etkinliğin bir örneği olma, ben şu (sonuçlar açıklamalı inline) denedim:

PackageManager pm = activity.getPackageManager(); 
ComponentName cn = activity.getComponentName(); 
ApplicationInfo ai = activity.getApplicationInfo(); 

//ACTIVITY LABEL: Works 
pm.getActivityInfo(cn, PackageManager.GET_ACTIVITIES).loadLabel(pm); 

//APPLICATION LABEL: Works 
ai.loadLabel(pm); 
//APPLICATION LABEL: Works 
pm.getApplicationLabel(ai); 

//ACTIVITY ICON: Works 
pm.getActivityInfo(cn, PackageManager.GET_ACTIVITIES).loadIcon(pm); 
//ACTIVITTY ICON: Works 
pm.getActivityIcon(cn); 

//APPLICATION ICON: Works 
pm.getApplicationIcon(ai); 
//APPLICATION ICON: Works 
ai.loadIcon(pm); 

//ACTIVITY LOGO: Does not work 
pm.getActivityInfo(cn, PackageManager.GET_ACTIVITIES).loadLogo(pm); 
//ACTIVITY LOGO: Does not work 
pm.getActivityInfo(cn, PackageManager.GET_ACTIVITIES).logo 
//ACTIVITY LOGO: Does not work 
pm.getActivityLogo(cn); 

//APPLICATION LOGO: Does not work 
pm.getApplicationLogo(ai); 
//APPLICATION LOGO: Does not work 
pm.getApplicationLogo(activity.getApplication().getPackageName()); 
//APPLICATION LOGO: Does not work 
ai.loadLogo(pm); 

//APPLICATION LOGO: Does not work 
pm.getApplicationInfo(ai.packageName, 0).loadLogo(pm); 
//APPLICATION LOGO: Does not work 
ai.logo; 

kimse doğru bu targ birinde veya her ikisinde için logosunu yüklemek için nasıl biliyor mu ets?

düzenlemek: Logo destek API düzeyi 9. gerektirir Üzerinde test ediyorum cihazlar emülatörleri Fiziksel cihazları Bu kod 3.0+ idam asla tüm koşuyoruz API seviyesi 10. vardır.

+0

Şu anda test edemiyorum, ancak aktivitede bir 'android: logo' olması belki de bir problem mi? Bir etkinlik niteliği değil, bir uygulama niteliğidir. İkincisini çıkarmayı dene. – Aleadam

+0

@Aleadam [spesifikasyon] 'da tanımlanmadığını fark ettim (http://developer.android.com/guide/topics/manifest/activity-element.html) ancak bu yöntem logosunu yüklemek için var. [Google'ın kendi örneklerinde] kullanılmıştır (http://code.google.com/p/styled-action-bar/source/browse/trunk/AndroidManifest.xml). Ben test edeceğim. –

+0

yöntemi fin, manifestodan bahsediyorum. Aşağıda biraz daha yayınlayacağım (yorum sınırlamalarına dayanan) – Aleadam

cevap

3

Testlerimden, kodunuz Honeycomb cihazında düzgün çalışıyor, ancak Gingerbread cihazında veya aşağıdaki cihazlarda çalışmıyor. Bu, API Seviye 8'de mevcut olmasına rağmen android:logo işlevselliğinin temel platformda doğru şekilde uygulanmadığını ima eder.Yani, bir Seviye 8-10 cihazda aynı uygulama apk, logo özniteliğini korumak değildir, ancak bir Seviye 11 cihazı yapar. Bu, sorunun kodla veya AndroidManifest.xml ile değil, platformla olduğu anlamına gelir.

+0

Bunun sebebi olacağından endişelendim. Dün gece etrafta dolanıp durduktan sonra, şimdi bunun OS ile ilgili bir sorun olduğunu kabul ediyorum. Kitaplığımda büyük bir özelliği etkinleştireceğinden çok utanç verici. –

+2

FYI bu *, * doğrudan manifestten sonra gitmek için bir çekme ayrıştırıcısı kullanırsanız yapılabilir. https://github.com/JakeWharton/ActionBarSherlock/blob/c1c187739a1b69340c325577f2f02c8a60dcd717/library/src/com/actionbarsherlock/internal/widget/ActionBarView.java#L267-348 –

1

Eğer android.app.ContextImpl.ApplicationPackageManager (here) kod bakmak, o bulacaksınız nihayetinde (2.3 içinde 2173 için çizgiler 2131) yöntemi

public Drawable getDrawable(String packageName,int resid,ApplicationInfo appInfo) 

kullanır.

(yani Failure retrieving resources for ...)

0

Önce yüklü olan tüm uygulamaları bulmalıyız sen adb aracılığıyla neler olduğunu takip etmek kullanabileceği Log.w çağrıları orada birkaç vardır. Bu amaçla paket yöneticisinden bize aşağıdaki yöntemler için

public abstract List<PackageInfo> getInstalledPackages (int flags) 

more info here

Ayrıca yüklü paketler hakkında bilgi almak için aşağıdaki yöntemi kullanabilirsiniz

.

more info here

public abstract List<ApplicationInfo> getInstalledApplications (int flags) 

Şimdi listesi aldıktan sonra, aşağıdaki yöntemi kullanarak yineleme.
public Drawable getDrawable(String packageName,int resid,ApplicationInfo appInfo) 

more info here

Her yineleme size sorgulanan paketinin ilgili çekilebilir verecektir

. Burada res id simgesinin id ..

R.drawable.icon 
0

@Jake Wharton, sen var olmayan bir şeyi almak için çalışıyoruz. applications, activities'dan farklı olarak ayrı bir logo özniteliği yoktur (uygulamada tanımlanan logo, tüm etkinlikler için varsayılan öznitelik haline gelir). Bu yüzden bir etkinlikten birini alamıyorsunuz.

+0

Kaynak logosunu elde edemem ya da çekilemediğim sürece uygulama logosuna yer verirdim. Bu soruya bir yorumda da değindiğim gibi, açık şemanın bir 'logo' özelliği listelemediğini biliyorum, ancak [Google'ın kendi örnekleri] (http://code.google.com/p/styled-action-bar/source /browse/trunk/AndroidManifest.xml#29) kullanın ve Android 3.0+ sürümünde mükemmel çalışıyor. –

İlgili konular