当前位置:   article > 正文

FRAMEWORK 添加新的接口_soft wareresskills中怎样新增接口?

soft wareresskills中怎样新增接口?

如何添加

建立接口目录

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();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

另外注意,上面的 /** @hide */ 必须要加,否则make整个系统的时候会报错,会提示make update-api之类的错误

添加编译路径

在 Android.mk 中添加编译路径
打开frameworks/base/Android.mk文件,在LOCAL_SRC_FILES变量中加入:

core/java/ carson/alexa/avs/voiceact/IAlexaVoiceService.aidl
  • 1

编译后,系统会自动生成对应的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 {
}
  • 1
  • 2
  • 3
  • 4

将新服务添加进系统服务中去
打开上述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); 
}  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

注意,要记住这个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.
******************************
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

请问这个要怎么处理?下面两种方式是否正确?

第一种:
如果make update-api
Make update后提交以下文件就可以

modified:   api/current.txt
         modified:   api/system-current.txt
         modified:   api/test-current.txt
  • 1
  • 2
  • 3

第二种:在carson/alexa/avs/voiceact/IAlexaVoiceService.aidl中加/* @hide /

/** @hide */
interface IAlexaVoiceService {
…
  • 1
  • 2
  • 3
  • 4

关于@SystemApi @hide @Nonnull @TargetApi

@SystemApi 是 @PrivateApi的别名;使用@hide标记的API可以不使用@SystemApi进行标;但是当使用@SystemApi标记的API则必须使用@hide

在Android源码中,有两种类型的API无法通过标准的SDK进行访问

位于com.android.internal包中的
类/方法 被 @hide修饰的
  • 1
  • 2

值得注意的是:隐藏的方法(使用@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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

但是我们可以通过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});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

下面来看看@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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/272970
推荐阅读
相关标签
  

闽ICP备14008679号