2

更新:

「最新の状態については、以下のコメントを参照してください。」

アプリでこのクラス「com.android.internal.CallManager」を使用しようとしています。私はこのトピックを数日間研究しました。しかし、これこれしか見つかりませんでした。どちらも私の問題を解決できません。Android の隠し API を呼び出すには 2 つの方法を使用しました。

1) 隠し API を呼び出すために使用する最初の方法は、Java リフレクションです。ここに私のサンプルコードがあります:

ClassLoader classLoader = context.getClass().getClassLoader();
final Class<?> callManagerClass = classLoader.loadClass("com.android.internal.telephony.CallManager");

Method getInstanceMethod = callManagerClass.getDeclaredMethod("getInstance");
getInstanceMethod.setAccessible(true);
mCallManager = getInstanceMethod.invoke(null);

mActiveFgMethod = callManagerClass.getDeclaredMethod("hasActiveFgCall");
Object res = mActiveFgMethod.invoke(mCallManager);

boolean result = ((Boolean) res).booleanValue();

ご覧のとおり、Java Reflection を使用して CallManager にアクセスし、「hasActiveFgCall」関数にアクセスします。しかし、電話の状態がどうであれ、結果はfalseになります。

2)私が使用する2番目の方法は、このサイト(http://devmaze.wordpress.com/2011/01/18/using-com-android-internal-part-1-introduction /)が使用したものと似ています。以下はサンプルコードです。

import com.android.internal.telephoney.CallManager;

CallManager mCallManager = CallManager.getInstance();
boolean result = mCallManager.hasActiveFgCall();

Android 4.1.2 のソース コードをダウンロードしてコンパイルしました。jarファイルはこの「out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar」でした。クラスと関数を正常に呼び出すことができました。残念ながら、結果は同じfalseです。

追加した権限は次のとおりです。

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.CALL_PHONE"/>
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.READ_CALL_LOG" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CALL_LOG" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.USE_SIP" />

このクラス ファイル (CallManager.java) のコードを確認したところ、次の関数呼び出しリストが見つかりました: hasActiveFgCall() --> getFirstActiveCall() --> isIdle()。電話の状態を誤解していると思ったので、電話の状態を確認するアプリを作成しました。コードは次のとおりです。

public class MainActivity extends Activity {
    private static final String TAG = "Telephony";

    TextView t1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        t1 = (TextView) this.findViewById(R.id.text1);

        TelephonyManager mTelephonyMgr = (TelephonyManager) 
                this.getSystemService(Context.TELEPHONY_SERVICE);

        mTelephonyMgr.listen(new TeleListener(), 
                PhoneStateListener.LISTEN_CALL_STATE);

        t1.setText("listen the state of phone:\n"); 
    }

    class TeleListener extends PhoneStateListener {
        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
            super.onCallStateChanged(state, incomingNumber);
            switch (state) {
            case TelephonyManager.CALL_STATE_IDLE:
                Log.e(TAG, "CALL_STATE_IDEL");
                t1.append("CALL_STATE_IDLE"+"\n");
                break;
            case TelephonyManager.CALL_STATE_OFFHOOK:
                Log.e(TAG, "CALL_STATE_OFFHOOK");
                t1.append("CALL_STATE_OFFHOOK" + "\n");
                break;
            case TelephonyManager.CALL_STATE_RINGING:
                Log.e(TAG, "CALL_STATE_RINGING");
                t1.append("CALL_STATE_RINGING"+"\n");
                break;

            default:
                break;

            }
        }
    }
}

しかし、私は正しかった。OFFHOOK、IDLE、RINGING など、電話の状態に関係なく、関数「hasActivieFgCall()」は false を返しました。これは非常にイライラします。

返信をいただければ幸いです。

4

1 に答える 1

0

ITelephony のように Java Reflection や aidl で使用できる Service は好きではありません。使用する唯一の方法CallManagerは、アプリにシステム許可を与えることだと思います

android:sharedUserId="android.uid.system"apk に署名し、mainfest ファイルに追加する必要があります。

于 2014-03-05T07:55:38.840 に答える