android动态壁纸调用
动态壁纸的实现其实就是在Activity中调用动态壁纸服务,通过绑定服务得到IWall易做图Service,调用该接口中的attach函数实现壁纸的调用。
调用后动态壁纸其实是显示在Activity的后面,而Activity则是透明显示,这样就可以看到下面的动态壁纸,如果Activity不是透明的则什么也看不到。
代码中有用到两个接口
IWall易做图Service mService;
IWall易做图Engine mEngine;
我们可以看到该目录下面有三个aidl接口,分别是
inte易做图ce IWall易做图Connection {
void attachEngine(IWall易做图Engine engine);
ParcelFileDescriptor setWall易做图(String name);
}
oneway inte易做图ce IWall易做图Service {
void attach(IWall易做图Connection connection,
IBinder windowToken, int windowType, boolean isPreview,
int reqWidth, int reqHeight);
}
oneway inte易做图ce IWall易做图Engine {
void setDesiredSize(int width, int height);
void setVisibility(boolean visible);
void dispatchPointer(in MotionEvent event);
void dispatchWall易做图Command(String action, int x, int y, int z, in Bundle extras);
void destroy();
}
定义壁纸管理和壁纸信息变量
private Wall易做图Manager mWall易做图Manager = null;
private Wall易做图Info mWall易做图Info = null;
private Wall易做图Connection mWall易做图Connection = null;
private Intent mWall易做图Intent;
初始化这些变量
mWall易做图Manager = Wall易做图Manager.getInstance(this);
mWall易做图Info = mWall易做图Manager.getWall易做图Info();//如果返回null则说明当前不是动态壁纸
mWall易做图Intent = new Intent(Wall易做图Service.SERVICE_INTERFACE);
mWall易做图Intent.setClassName(mWall易做图Info.getPackageName(), mWall易做图Info.getServiceName());
绑定动态壁纸服务
bindService(mIntent, this, Context.BIND_AUTO_CREATE);
IWall易做图Service mService;//这里有一个adil接口
在连接监听中试着attach
public void onServiceConnected(ComponentName name, IBinder service) {
mService = IWall易做图Service.Stub.asInte易做图ce(service);
try {
mService.attach(this, view.getWindowToken(),
// WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA_OVERLAY,
WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA,
true, root.getWidth(), root.getHeight());
} catch (RemoteException e) {
Log.w("", "Failed attaching wall易做图; clearing", e);
}
}
在bindService的时候发现总是失败,后来发现是权限问题,只有拥有系统权限的apk才可以使用Wall易做图Service.SERVICE_INTERFACE服务,所以问题就变成了怎么获取系统权限。
补充:移动开发 , Android ,