赞
踩
framework/base/core/java/com下新添加了carson/alexa/avs/voiceact/IAlexaVoiceService.aidl
// IAlexaVoiceService.aidl
package com.carson.alexa.avs.voiceact;
/** @hide */
interface IAlexaVoiceService {
/*Get authorize status*/
boolean getAuthStatus();
/*Return alexa voice service status, such as listening, thinking and etc.*/
int getAVSStatus();
/*Start a new voice request*/
void startSession();
/*Sign in interface*/
void signIn();
/*Sign out interface*/
void signOut();
}
另外注意,上面的 /** @hide */
必须要加,否则make整个系统的时候会报错,会提示make update-api之类的错误
在 Android.mk 中添加编译路径
打开frameworks/base/Android.mk文件,在LOCAL_SRC_FILES变量中加入:
core/java/ carson/alexa/avs/voiceact/IAlexaVoiceService.aidl
编译后,系统会自动生成对应的IAlexaVoiceService.Stub接口类。
如果需要在Framework编写具体的接口实现,需要
进入frameworks/base/core/services/java/com/android/server/目录,新增AlexaVoiceService.java:
package com.android.server;
import android.os. IAlexaVoiceService;
public class AlexaVoiceService extends IAlexaVoiceService.Stub {
}
将新服务添加进系统服务中去
打开上述frameworks/base/services/java/com/android/server/SystemServer.java文件,在ServerThread::run()方法中添加加载代码:
try {
Slog.i(TAG, "AlexaVoice Service");
ServiceManager.addService("AlexaVoice", new AlexaVoiceService());
} catch (Throwable e) {
Slog.e(TAG, "Failure starting AlexaVoice Service", e);
}
注意,要记住这个tag字符串”AlexaVoice”,APP会通过该tag获取该服务。
问题一:关于make update api
因为想要在手机侧键Key单击的时候调用startSession()进行启动,所以在framework/base/services/core/java/com/android/server/policy/PhoneWindowManager.java中使用startSession(),但是编译出现
To make these errors go away, you have two choices:
1) You can add "@hide" javadoc comments to the methods, etc. listed in the
errors above.
2) You can update current.txt by executing the following command:
make update-api
To submit the revised current.txt to the main Android repository,
you will need approval.
******************************
请问这个要怎么处理?下面两种方式是否正确?
第一种:
如果make update-api
Make update后提交以下文件就可以
modified: api/current.txt
modified: api/system-current.txt
modified: api/test-current.txt
第二种:在carson/alexa/avs/voiceact/IAlexaVoiceService.aidl中加/* @hide /
…
/** @hide */
interface IAlexaVoiceService {
…
@SystemApi 是 @PrivateApi的别名;使用@hide标记的API可以不使用@SystemApi进行标;但是当使用@SystemApi标记的API则必须使用@hide
在Android源码中,有两种类型的API无法通过标准的SDK进行访问
位于com.android.internal包中的
类/方法 被 @hide修饰的
值得注意的是:隐藏的方法(使用@hide修饰的)仍然可以通过Java反射机制进行访问;@hide标识只是javadoc的一部分(也是Android doc的一部分),所以@hide修饰符仅仅指示了method/class/field 不会被暴露到API中。
例如ActivityManager.java 中的方法checkUidPermission 是被@hide修饰的
/** @hide */
public static int checkUidPermission(String permission, int uid) {
try {
return AppGlobals.getPackageManager()
.checkUidPermission(permission, uid);
} catch (RemoteException e) {
// Should never happen, but if it does... deny!
Slog.e(TAG, "PackageManager is dead?!?", e);
}
return PackageManager.PERMISSION_DENIED;
}
但是我们可以通过java的反射机制来访问
Class c;
c = Class.forName("android.app.ActivityManager");
Method m = c.getMethod("checkUidPermission",
new Class[] {String.class, int.class});
Object o = m.invoke(null,
new Object[]{"android.permission.READ_CONTACTS", 10010});
下面来看看@SystemApi 和@hide的不同之处:
如上文所示:使用@hide修饰的method/class/field,我们仍然何以通过java反射机制进行访问。
但是使用@SystemApi修饰的method/class/field,无法通过java 反射机制进行访问(会触发invocationTargetException异常)
WifiManager manager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
Method method = manager.getClass()
.getMethod("getPrivilegedConfiguredNetworks");
List<WifiConfiguration> configs =
(List<WifiConfiguration>)method.invoke(manager);
TargetApi的常见用法是指定当前class/method/field所使用的api版本,也就是所谓的android 4.4/5.0/5.1/
NonNull常见用于修饰参数,用于表明该参数不为空!
参考android SDK中添加自定义api
http://blog.csdn.net/a624731186/article/details/23548409?utm_source=tuicool&utm_medium=referral
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。