The import android.os.ServiceManager cannot be resolved

醉酒当歌 提交于 2019-11-26 21:44:04

问题


I'm using aidl to answer call automagically, code as following:

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

I import ServiceManager.class

import android.os.ServiceManager;

but there's a problem:The import android.os.ServiceManager cannot be resolved

How can I make it work? Thanks


回答1:


android.os.ServiceManager is a hidden class (i.e., @hide) and hidden classes (even if they are public in the Java sense) are removed from android.jar, hence you get the error when you try to import ServiceManager. Hidden classes are those that Google does not want to be part of the documented public API.

Applications using non-public API cannot be compiled easily, there will be different platform versions of this class.




回答2:


Though it is old one, but no one has answered it yet. Any hidden classes can be used using reflection APIs. Here is an example to acquire a service using Service Manager via reflection APIs:

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");
        }



回答3:


As said above these methods work only on System apps or framework apps from Android N on words. Still we can code for System app for ServiceManager usage as below using reflection of Android Code

  @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;
    }


来源:https://stackoverflow.com/questions/4446469/the-import-android-os-servicemanager-cannot-be-resolved

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!