导入android.os.ServiceManager无法解析

时间:2010-12-15 03:38:05

标签: android aidl

我正在使用aidl自动接听电话,代码如下:

ITelephony.Stub.asInterface(ServiceManager.getService("phone"))
    .answerRingingCall();

我导入ServiceManager.class

import android.os.ServiceManager;

但是有一个问题:无法解析导入android.os.ServiceManager

我怎样才能让它发挥作用?感谢

3 个答案:

答案 0 :(得分:6)

android.os.ServiceManager是一个隐藏的类(即@hide)和隐藏的类(即使它们在Java意义上是公共的)从android.jar中删除,因此当你尝试时会出现错误导入ServiceManager。隐藏的类是Google不希望成为已记录的公共API的一部分。

使用非公共API的应用程序无法轻松编译,此类将有不同的平台版本。

答案 1 :(得分:2)

虽然很旧,但还没有人回答。可以使用反射API来使用任何隐藏类。以下是通过反射API使用Service Manager获取服务的示例:

if(mService == null) {
            Method method = null;
            try {
                method = Class.forName("android.os.ServiceManager").getMethod("getService", String.class);
                IBinder binder = (IBinder) method.invoke(null, "My_SERVICE_NAME");
                if(binder != null) {
                    mService = IMyService.Stub.asInterface(binder);
                }

                if(mService != null)
                    mIsAcquired = true;

            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }

        } else {
            Log.i(TAG, "Service is already acquired");
        }

答案 2 :(得分:0)

如上所述,这些方法仅适用于Word上的Android N的System应用程序或框架应用程序。 仍然可以通过反射Android代码来为Service Manager使用的System app编写代码,如下所示:

stockqty