我一直在寻找有关此问题的具体示例,但无法在任何地方在线找到它。

我想做的是:从我的应用程序中单击一个按钮,然后移至我的应用程序动态壁纸的“动态壁纸”预览,以便用户可以选择激活它。

现在,我已经在网上阅读了一些内容,现在使用WallpaperManager's ACTION_CHANGE_LIVE_WALLPAPER和EXTRA_LIVE_WALLPAPER_COMPONENT指向我的LiveWallpapers ComponentName。

这是我到目前为止的代码。有人知道我在做什么错吗?到目前为止,我单击该按钮,但没有任何 react ...(我记录了该消息,它实际上已到达此代码)。

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+的情况

最佳答案

我也找不到一个例子。我注意到的第一件事是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.java中找到了以下内容:
Intent queryIntent = new Intent(WallpaperService.SERVICE_INTERFACE);
queryIntent.setPackage(comp.getPackageName());
List<ResolveInfo> list = getPackageManager().queryIntentServices( queryIntent, PackageManager.GET_META_DATA);

使用上面的代码块进行一些调试,这是我的最终形式...
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的第二个参数中。

从技术上讲,我的最终形式首先支持新方法的层次结构,然后是旧方法,然后是Nook Tablet/Nook Color特定 Intent :
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);
        }
    }
}

09-11 10:59