我必须在android电话上使用android ITelephony内部类。我使用ITelephony通过将其实例作为
来进行调用ITelephony phone = ITelephony.Stub.asInterface(
ServiceManager.getService(Context.TELEPHONY_SERVICE)
);
然后使用
进行调用phone.call(destNum);
现在我需要执行其他操作,例如保持通话。 ITelephony没有为此提供API,但我找到了一个具有switchHoldingAndActive()
的Phone类,但为了调用它,我需要一个Phone实例来处理当前正在运行的活动调用。我试过了
Phone PhoneActive = PhoneFactory.getDefaultPhone();
但它给了我一个例外
Caused by: java.lang.RuntimeException:
Can't create handler inside thread that has not called Looper.prepare()
获取电话实例的正确方法是什么?
答案 0 :(得分:5)
没有正确的方法来获取Phone实例。 AFAIK,getDefaultPhone()仅在您的线程(通过PhoneFactory.makeDefaultPhone())创建时才返回当前活动Phone子类(GSM / CDMA)的实例。 但是,我相信该实例是由预先安装的Call应用程序创建的,因此如果您尝试它将无法正常工作。 很久以前我试图使用反射来注册精确的呼叫状态更新并因为安全异常而卡住。我的应用程序必须在系统进程中运行... 我的代码是这样的:
mPhoneFactory = Class.forName("com.android.internal.telephony.PhoneFactory");
Method mMakeDefaultPhone = mPhoneFactory.getMethod("makeDefaultPhone", new Class[] {Context.class});
mMakeDefaultPhone.invoke(null, getContext());
Method mGetDefaultPhone = mPhoneFactory.getMethod("getDefaultPhone", null);
mPhone = mGetDefaultPhone.invoke(null);
Method mRegisterForStateChange = mPhone.getClass().getMethod("registerForPreciseCallStateChanged",
new Class[]{Handler.class, Integer.TYPE, Object.class});
mRegisterForStateChange.invoke(mPhone, mHandler, CALL_STATE_CHANGED, null);
答案 1 :(得分:-1)
Can't create handler inside thread that has not called Looper.prepare()
是在Thread
上调用非UI线程的UI-Thread-only方法时抛出的异常。
尝试使用AsyncTask
代替Thread
,拨打runOnUiThread
或postRunnable
。