如何从应用移动到dynamic壁纸预览?

我一直在寻找一个具体的例子,无法在任何地方在网上find它。

我想要做的是:从我的应用程序点击一个button,移动到我的应用程序dynamic壁纸的dynamic壁纸预览,使用户可以select激活它。

现在我已经在线阅读,我将使用WallpaperManager的 ACTION_CHANGE_LIVE_WALLPAPER与EXTRA_LIVE_WALLPAPER_COMPONENT指向我的LiveWallpapers组件名称。

这是我迄今为止的代码。 有人知道我在做什么错了吗? 到目前为止,我单击button,什么也没有发生…(我login,它实际上是达到这个代码)。

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

如果你需要更多的信息,我忘记发布让我知道。

*我也知道这是API 16+,这只是我的情况,当手机是API 16 +

Solutions Collecting From Web of "如何从应用移动到dynamic壁纸预览?"

我也找不到一个例子。 我注意到的第一件事是EXTRA_LIVE_WALLPAPER_COMPONENT不需要一个string,而是一个ComponentName 。 我第一次用ComponentName剪切看起来像这样:

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

这并没有削减,所以我挖入Android源代码,并在LiveWallpaperChange.javafind以下内容:

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

用上面的块进行一些debugging,这是我的最终forms…

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

关键在于ComponentName的第二个参数。

从技术上讲,我的最终forms首先支持新方法的层次结构,其次是旧的,其次是Nook Tablet / Nook 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); } } }