5

次のようにコーディングして、自動的に呼び出しに応答するために aidl を使用しています。

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

ServiceManager.class をインポートします

import android.os.ServiceManager;

しかし、問題があります: インポート android.os.ServiceManager を解決できません

どうすればそれを機能させることができますか?ありがとう

4

3 に答える 3

6

android.os.ServiceManagerは隠しクラス (つまり@hide) であり、隠しクラス (Java の意味でパブリックであっても) は android.jar から削除されるため、インポートしようとするとエラーが発生しますServiceManager。非表示のクラスは、Google が文書化されたパブリック API の一部になりたくないクラスです。

非パブリック API を使用するアプリケーションは簡単にコンパイルできません。このクラスにはさまざまなプラットフォーム バージョンがあります。

于 2012-02-15T11:28:23.020 に答える
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");
        }
于 2017-06-26T23:05:17.743 に答える