I\'m writing a live wallpaper that creates an effect over a background. I want the user to be able to choose the background from any of the system wallpapers and camera pho
Nope, that's pretty much the best way to go about it. Anything that responds to android.intent.action.SET_WALLPAPER would be a wallpaper provider of one form or another. The problem is that giving them that list will take your control out of the equation. Essentially having them pick something from another provider will unset your Live Wallpaper. You could probably get around this with with some creative Manifest settings and or some "startActivityForResult" type calls.
After they choose something though it's a simple matter of something like this in your WallpaperService.Engine:
@Override
public void onSurfaceChanged( SurfaceHolder holder, int format, int width, int height )
{
super.onSurfaceChanged( holder, format, width, height );
if( isVisible() )
{
mSurfaceHolder = holder;
final Drawable drawable = WallpaperManager.getInstance( getBaseContext() ).getFastDrawable();
mSurfaceHolder.setFormat( RenderThread.pixFormat );
Canvas c = mSurfaceHolder.lockCanvas();
if( c != null )
{
drawable.draw( c );
mSurfaceHolder.unlockCanvasAndPost( c );
}
}
}