FRAMEWORK 添加新的接口

如何添加

建立接口目录

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 @hide @Nonnull @TargetApi

@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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安德路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值