我正在使用aidl自动接听电话,代码如下:
ITelephony.Stub.asInterface(ServiceManager.getService("phone"))
.answerRingingCall();
我导入ServiceManager.class
import android.os.ServiceManager;
但是有一个问题:无法解析导入android.os.ServiceManager
我怎样才能让它发挥作用?感谢
答案 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