Импорт android.os.ServiceManager не может быть разрешен - PullRequest
3 голосов
/ 15 декабря 2010

Я использую aidl для автоматического ответа на вызов, код такой:

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

Я импортирую ServiceManager.class

import android.os.ServiceManager;

, но есть проблема: Импорт android.os.ServiceManager не может быть решен

Как я могу заставить его работать?Спасибо

Ответы [ 3 ]

6 голосов
/ 15 февраля 2012

android.os.ServiceManager - это скрытый класс (т. Е. @hide), и скрытые классы (даже если они являются общедоступными в смысле Java) удаляются из android.jar, поэтому вы получаете ошибку при попытке импортировать ServiceManager.Скрытые классы - это те, которые Google не хочет включать в документированный публичный API.

Приложения, использующие непубличный API, не могут быть легко скомпилированы, будут разные версии платформы этого класса.

2 голосов
/ 27 июня 2017

Хоть он и старый, но еще никто не ответил. Любые скрытые классы могут быть использованы с помощью 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");
        }
0 голосов
/ 16 декабря 2018

Как уже было сказано выше, эти методы работают только на системных приложениях или приложениях-фреймворках из 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;
    }
...