2011-12-05 9 views
3

私はAndroidのITelephonyをAndroidのテレフォニーの内部クラスに使用する必要があります。私はアンドロイドでPhoneインスタンスを取得するにはどうすればよいですか?

ITelephony phone = ITelephony.Stub.asInterface(
    ServiceManager.getService(Context.TELEPHONY_SERVICE) 
); 

としてそのインスタンスを取得して、今、私は電話を保持するような他のアクションを実行する必要が

phone.call(destNum); 

を呼び出すことにより、呼び出しを行うためにITelephonyを使用しています。 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() 

電話インスタンスを取得するための正しい方法は何を言って例外を与えますか?

答えて

-1
Can't create handler inside thread that has not called Looper.prepare() 

あなたは番目のUIスレッドではありませんThread上のUIスレッドのみ-メソッドを呼び出したときにスローされる例外です。

Threadの代わりにAsyncTaskを使用するか、runOnUiThreadまたはpostRunnableとしてください。

+0

:私のアプリケーションは 私のコードは次のようでした...システム・プロセス内で実行されなければなりませんでした私が何を変更する必要があるか知っているASYNCタスクのonPreExecuteメソッドの – user954299

+0

私はPhone.getDefaultPhone()を呼び出しています。 – user954299

5

Phoneインスタンスを取得する正しい方法はありません。 AFAIK、getDefaultPhone()は、スレッドによって(PhoneFactory.makeDefaultPhone()を介して)作成された場合のみ、現在アクティブなPhoneサブクラス(GSM/CDMA)のインスタンスを返します。 しかし、私はインスタンスが事前にインストールされたコールアプリケーションによって作成されると信じているので、試しても動作しません。 長年前、リフレクションを使用して、正確なコール状態の更新にサインアップし、セキュリティ例外のために立ち往生しようとしました。こんにちははい私のコードに見て、私を聞かせてください鉱山は、そのサービスをスレッドUIはありませんが、私はASYNタスクを使用しています

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); 
関連する問題