android动态壁纸调用的简单实例
调用后动态壁纸其实是显示在Activity的后面,而Activity则是透明显示,这样就可以看到下面的动态壁纸,如果Activity不是透明的则什么也看不到。
代码中有用到两个接口
IWallpaperServicemService;
IWallpaperEnginemEngine;
我们可以看到该目录下面有三个aidl接口,分别是
interfaceIWallpaperConnection{
voidattachEngine(IWallpaperEngineengine);
ParcelFileDescriptorsetWallpaper(Stringname);
}
onewayinterfaceIWallpaperService{
voidattach(IWallpaperConnectionconnection,
IBinderwindowToken,intwindowType,booleanisPreview,
intreqWidth,intreqHeight);
}
onewayinterfaceIWallpaperEngine{
voidsetDesiredSize(intwidth,intheight);
voidsetVisibility(booleanvisible);
voiddispatchPointer(inMotionEventevent);
voiddispatchWallpaperCommand(Stringaction,intx,inty, intz,inBundleextras);
voiddestroy();
}
定义壁纸管理和壁纸信息变量
privateWallpaperManagermWallpaperManager=null;
privateWallpaperInfomWallpaperInfo=null;
privateWallpaperConnectionmWallpaperConnection=null;
privateIntentmWallpaperIntent;
初始化这些变量
mWallpaperManager=WallpaperManager.getInstance(this);
mWallpaperInfo=mWallpaperManager.getWallpaperInfo();//如果返回null则说明当前不是动态壁纸
mWallpaperIntent=newIntent(WallpaperService.SERVICE_INTERFACE);
mWallpaperIntent.setClassName(mWallpaperInfo.getPackageName(),mWallpaperInfo.getServiceName());
绑定动态壁纸服务
bindService(mIntent,this,Context.BIND_AUTO_CREATE);
IWallpaperServicemService;//这里有一个adil接口
在连接监听中试着attach
mService=IWallpaperService.Stub.asInterface(service); try{ mService.attach(this,view.getWindowToken(), // WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA_OVERLAY, true,root.getWidth(),root.getHeight()); }catch(RemoteExceptione){ Log.w("","Failedattachingwallpaper;clearing",e);
publicvoidonServiceConnected(ComponentNamename,IBinderservice){
WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA,
}
}
在bindService的时候发现总是失败,后来发现是权限问题,只有拥有系统权限的apk才可以使用WallpaperService.SERVICE_INTERFACE服务,所以问题就变成了怎么获取系统权限。
相关文章