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);
}
}
}
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! –
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