由于项目需要,我这边需要在framework层增加一个语音唤醒服务来实现拉通hal层以及android应用层,实现语音黑屏唤醒以及亮屏唤醒的功能,这里我们只看在android7.0和9.0上是怎么增加一个自定义系统服务,其实对着葫芦画瓢就可以了。
下面主要说基于android7.0的添加系统服务,9.0的编译方式改了,改下bp文件就可以了,没什么大的区别,这里删了些复杂的接口,只留了几个比较简单的接口,方便阅读。
1.编写与声明aidl文件
1.1.编写aidl文件
在frameworks/base/core/java/android/新增ovum/ai/IAIManager.aidl文件
package android.ovum.ai;
/**
* {@hide}
*/
interface IAIManager {
byte[] getAudioData();
int getWakeupDoa();
void stopAudioData();
void wakeupAppStarted(String callerPackage);
boolean setEnabled(boolean enabled, String callerPackage);
boolean isEnabled(String callerPackage);
boolean isRecording(String callerPackage);
}
1.2.注册aidl文件
实现完成后需要在frameworks/base/Android.mk 声明我们需要的aidl文件,这个经常忘记了。
core/java/android/ovum/ai/IAIManager.aidl \
core/java/android/ovum/performanceobserver/IPerformanceObserverService.aidl \
1.3.封装aidl的接口实现
实现AIManager的接口封装
package android.ovum.ai;
import android.content.Context;
import android.os.RemoteException;
import android.util.Log;
/**
* {@hide}
*/
public class AIManager {
private static final String TAG = "AIManager";
private final Context mContext;
private final IAIManager mService;
public AIManager(Context context, IAIManager service) {
Log.v(TAG, "AIManager()");
mContext = context;
mService = service;
}
public void stopAudioData() {
try {
mService.stopAudioData();
} catch (RemoteException e) {
e.printStackTrace();
}
}
public int getWakeupDoa() {
try {
return mService.getWakeupDoa();
} catch (RemoteException e) {
e.printStackTrace();
}
return 0;
}
public byte[] getAudioData() {
try {
return mService.getAudioData();
} catch (RemoteException e) {
e.printStackTrace();
}
return null;
}
public void wakeupAppStarted() {
try {
mService.wakeupAppStarted(mContext.getOpPackageName());
} catch (RemoteException e) {
e.printStackTrace();
}
}
public boolean setEnabled(boolean enabled) {
try {
return mService.setEnabled(enabled, mContext.getOpPackageName());
} catch (RemoteException e) {
e.printStackTrace();
}
return false;
}
public boolean isEnabled() {
try {
return mService.isEnabled(mContext.getOpPackageName());
} catch (RemoteException e) {
e.printStackTrace();
}
return false;
}
public boolean isRecording() {
try {
return mService.isRecording(mContext.getOpPackageName());
} catch (RemoteException e) {
e.printStackTrace();
}
return false;
}
}
<