2012-10-11 22 views
10

He estado buscando un ejemplo específico de esto y no pude encontrarlo en línea en ninguna parte.¿Cómo me muevo a la vista previa de Live Wallpaper desde la aplicación?

Lo que quiero hacer es: desde mi aplicación, haga clic en un botón y vaya a la vista previa de Live Wallpaper de mi fondo de pantalla animado de aplicaciones, para que el usuario pueda elegir activarlo.

Ahora de lo que he leído en línea, voy a usar WallpaperManager's ACTION_CHANGE_LIVE_WALLPAPER con EXTRA_LIVE_WALLPAPER_COMPONENT apuntando a mi LiveWallpapers ComponentName.

Aquí está mi código de lo que tengo hasta ahora. ¿Alguien sabe lo que estoy haciendo mal? A partir de ahora, hago clic en el botón y no pasa nada ... (Lo registré y en realidad está llegando a este código).

Intent i = new Intent(); 
i.setAction(WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER); 
i.putExtra(WallpaperManager.EXTRA_LIVE_WALLPAPER_COMPONENT, "com.example.myapp.livewallpaper.LiveWallpaperService"); 
startActivity(i); 

Si necesita más información que me olvidé de publicar, hágamelo saber.

* También soy consciente de que esto es la API de 16 años, esto es sólo mi caso para cuando el teléfono está API 16+

Respuesta

18

no pude encontrar un ejemplo bien. Lo primero que noté fue que el EXTRA_LIVE_WALLPAPER_COMPONENT no requiere una cadena, sino un ComponentName. Mi primer corte con ComponentName veía así:

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); 

Eso no lo cortó, así que se clavó en el código fuente de Android y se encontró lo siguiente en LiveWallpaperChange.java:

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

Un poco de depuración con el por encima de trozo, y esta es mi forma final ...

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); 

la clave estaba en el segundo parámetro a ComponentName.

Técnicamente, mi forma final soporta una jerarquía del nuevo método en primer lugar, seguido por la edad, seguido por la intención específica Tablet Rincón/Rincón de color:

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, gracias. Me alejé de implementar esta idea, ya que solo es API 16+, pero lo más probable es que use este código en una fecha posterior. Gracias por la respuesta descriptiva! –

+5

estoy recibiendo un error 12-06 14: 18: 26.936: W/CHANGE_LIVE_WALLPAPER (11898): No es un fondo de pantalla en vivo: ComponentInfo {com.android.noisefield/com.android.noisefield.LiveWallpaperService} ¿Puede usted por favor dime cómo cambiar el fondo de pantalla si no soy el dueño de ese? ¿En lugar de getPackageName() para colocar el paquete como una cadena? Por ejemplo String packageName = "com.android.noisefield"; Cómo reemplazar packageName con getPackageName()? Gracias señor. – Naskov

Cuestiones relacionadas