2012-10-11 14 views
10

Szukałem tego konkretnego przykładu i nie mogłem go znaleźć nigdzie w Internecie.Jak przejść do podglądu tapety na żywo z aplikacji?

Co chcę zrobić, to: Z mojej aplikacji kliknij przycisk i przejdź do podglądu tapety na żywo moich aplikacji na żywo tapety, więc użytkownik może wybrać, aby go aktywować.

Teraz, co przeczytałem online, mam użyć WallpaperManager's ACTION_CHANGE_LIVE_WALLPAPER z EXTRA_LIVE_WALLPAPER_COMPONENT wskazując na moją nazwę LiveWallpapers ComponentName.

Oto mój kod tego, co mam do tej pory. Czy ktoś wie, co robię źle? Od tej chwili klikam przycisk i nic się nie dzieje ... (zalogowałem się i faktycznie dotarłem do tego kodu).

Jeśli potrzebujesz więcej informacji, o których zapomniałem napisać, daj mi znać.

* Jestem również świadomy tego jest API 16+, to jest właśnie mój przypadek, gdy telefon jest API 16+

Odpowiedz

18

nie mogę znaleźć przykład albo. Po pierwsze zauważyłem, że EXTRA_LIVE_WALLPAPER_COMPONENT nie wymaga String, ale ComponentName. Moje pierwsze cięcie z ComponentName wyglądał następująco:

ComponentName component = new ComponentName(getPackageName(), "LiveWallpaperService"); 
intent = new Intent(WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER); 
intent.putExtra(WallpaperManager.EXTRA_LIVE_WALLPAPER_COMPONENT, component); 
startActivityForResult(intent, REQUEST_SET_LIVE_WALLPAPER); 

To nie wyciąć go, więc sięgnął do kodu źródłowego Androida i stwierdzili, że następujące w LiveWallpaperChange.java:

Intent queryIntent = new Intent(WallpaperService.SERVICE_INTERFACE); 
queryIntent.setPackage(comp.getPackageName()); 
List<ResolveInfo> list = getPackageManager().queryIntentServices(queryIntent, PackageManager.GET_META_DATA); 

Trochę debugowanie z powyżej fragmencie, a to jest moja ostateczna forma ...

ComponentName component = new ComponentName(getPackageName(), getPackageName() + ".LiveWallpaperService"); 
intent = new Intent(WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER); 
intent.putExtra(WallpaperManager.EXTRA_LIVE_WALLPAPER_COMPONENT, component); 
startActivityForResult(intent, REQUEST_SET_LIVE_WALLPAPER); 

kluczem było w drugim parametrze do ComponentName.

Technicznie rzecz biorąc, moja ostateczna forma obsługuje hierarchię nowej pierwszej metodzie, po czym stary, a następnie konkretnej intencji Nook Tablet/Nook Kolor:

Intent intent; 

// try the new Jelly Bean direct android wallpaper chooser first 
try { 
    ComponentName component = new ComponentName(getPackageName(), getPackageName() + ".LiveWallpaperService"); 
    intent = new Intent(WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER); 
    intent.putExtra(WallpaperManager.EXTRA_LIVE_WALLPAPER_COMPONENT, component); 
    startActivityForResult(intent, REQUEST_SET_LIVE_WALLPAPER); 
} 
catch (android.content.ActivityNotFoundException e3) { 
    // try the generic android wallpaper chooser next 
    try { 
     intent = new Intent(WallpaperManager.ACTION_LIVE_WALLPAPER_CHOOSER); 
     startActivityForResult(intent, REQUEST_SET_LIVE_WALLPAPER); 
    } 
    catch (android.content.ActivityNotFoundException e2) { 
     // that failed, let's try the nook intent 
     try { 
      intent = new Intent(); 
      intent.setAction("com.bn.nook.CHANGE_WALLPAPER"); 
      startActivity(intent); 
     } 
     catch (android.content.ActivityNotFoundException e) { 
      // everything failed, let's notify the user 
      showDialog(DIALOG_NO_WALLPAPER_PICKER); 
     } 
    } 
} 
+1

Ah, dzięki. Zrezygnowałem z realizacji tego pomysłu, ponieważ jest to tylko API 16+, ale najprawdopodobniej wykorzystam ten kod w późniejszym terminie. Dzięki za opisową odpowiedź! –

+5

Dostaję błąd 12-06 14: 18: 26.936: W/CHANGE_LIVE_WALLPAPER (11898): brak żywych tapety: ComponentInfo {com.android.noisefield/com.android.noisefield.LiveWallpaperService} można proszę powiedz mi, jak zmienić tapetę, jeśli nie jestem jej właścicielem? Zamiast getPackageName(), aby umieścić pakiet jako ciąg? Na przykład String packageName = "com.android.noisefield"; Jak zamienić nazwę pakietu na wartość getPackageName()? Dzięki, sir. – Naskov

Powiązane problemy