Импорт android.os.ServiceManager не может быть разрешен
Я использую aidl для автоматического ответа на вызов, код следующий:
ITelephony.Stub.asInterface(ServiceManager.getService("phone"))
.answerRingingCall();
Я импортирую ServiceManager.class
import android.os.ServiceManager;
но есть проблема: импорт android.os.ServiceManager не может быть решен
Как я могу заставить это работать? Спасибо
3 ответа
android.os.ServiceManager
это скрытый класс (т.е. @hide
) и скрытые классы (даже если они являются общедоступными в смысле Java) удаляются из android.jar, поэтому вы получаете ошибку при попытке импорта ServiceManager
, Скрытые классы - это те, которые Google не хочет быть частью задокументированного публичного API.
Приложения, использующие непубличный API, не могут быть легко скомпилированы, будут разные версии платформ этого класса.
Хотя он старый, но никто еще не ответил на него. Любые скрытые классы могут быть использованы с помощью API-интерфейсов отражения. Вот пример получения сервиса с помощью Service Manager через API отражения:
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");
}
Как уже было сказано выше, эти методы работают только на системных приложениях или приложениях-фреймворках из Android N на словах. Тем не менее, мы можем кодировать системное приложение для использования ServiceManager, как показано ниже, используя отражение кода Android.
@SuppressLint("PrivateApi")
public IMyAudioService getService(Context mContext) {
IMyAudioService mService = null;
Method method = null;
try {
method = Class.forName("android.os.ServiceManager").getMethod("getService", String.class);
IBinder binder = (IBinder) method.invoke(null, "YOUR_METHOD_NAME");
if (binder != null) {
mService = IMyAudioService .Stub.asInterface(binder);
}
} catch (NoSuchMethodException | ClassNotFoundException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
return mService;
}