2

com.android.internal.telephony.Call にアクセスする必要があります。

そうする:

// Initialize the telephony framework
PhoneFactory.makeDefaultPhones (this);

// Get the default phone
Phone phone = PhoneFactory.getDefaultPhone ();

CallManager mCM = CallManager.getInstance ();
mCM.registerPhone (phone);

Call call = mCM.getFirstActiveBgCall();

ただし、フレームワークを初期化するために拡張しません。

コールの初期化を手伝ってください。

IDLE、ACTIVE、HOLDING、DIALING、ALERTING、INCOMING、WAITING、DISCONNECTED、DISCONNECTING などのコールの状態を読み取る必要があります。

4

2 に答える 2

0

PhoneStateListenerを利用する必要があり ます。これにより、アプリケーションが電話のさまざまな状態をリッスンする機能が提供されます。<uses-permission android:name="android.permission.READ_PHONE_STATE"/>マニフェストファイルに入れる必要があります

于 2012-06-10T09:19:16.077 に答える
0

できますが、重要な要件があります。アプリケーションはシステム レベルで署名されている必要があります。つまり、あなたが製造者であるということです。

フォアグラウンド コール状態が変化するたびにインテントをブロードキャストする Service を作成する方法を次に示します。

/*
 * This implementation uses the com.android.internal.telephony package: you have
 * to extract the framework classes .jar file from the platform (or the
 * emulator) to compile this code. Also, add the jar file to the external
 * libraries in the Java Build Path/libraries of the android project. </p>
 * 
 * The jar file must match the android version you are building the application
 * for. Because this implementation is using the internal packages it cannot be
 * guaranteed to operate on later versions of android.
 */
public class CallStateNotificationService extends Service {

    private static final String LOG_TAG = CallStateNotificationService.class.getSimpleName();

    private Handler mHandler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub
            super.handleMessage(msg);

            if (msg.what == 101) {
                CallManager callManager = CallManager.getInstance();
                Call.State state = callManager.getActiveFgCallState();

                Intent intent = new Intent(PhoneIntents.ACTION_PRECISE_CALL_STATE);
                intent.putExtra(PhoneIntents.PRECISE_CALL_STATE, state.name());

                Context context = getApplicationContext();
                context.sendBroadcast(intent);
            }
        }
    };

    @Override
    public void onCreate() {
        super.onCreate();

        try {
            CallManager callManager = CallManager.getInstance();
            if (callManager != null) {
                callManager.registerForPreciseCallStateChanged(mHandler, 101, null);
            } else {
                Log.w(LOG_TAG, "Can't resolve CallManager reference"); //$NON-NLS-1$
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        CallManager callManager = CallManager.getInstance();
        if (callManager != null) {
            callManager.unregisterForPreciseCallStateChanged(mHandler);
        } else {
            Log.w(LOG_TAG, "Can't resolve CallManager reference"); //$NON-NLS-1$
        }
    }

カスタム ブロードキャスト インテントの定義は次のとおりです。

/** Intent action and extra argument names for CallStateNotificationService */
public final class PhoneIntents {

    public static final String ACTION_PRECISE_CALL_STATE = "com.myorg.myapp.CALL_STATE";

    public static final String PRECISE_CALL_STATE = "precise_call_state";
}

このコードをコンパイルしてリンクするには、もちろん、Android ディストリビューション自体の一部としてプログラムをビルドするか、インターネット上の他の場所で説明されている方法でクラス フレームワークをインポートする必要があります。

これらはすべて、現在制作中のアプリにあります。

于 2013-05-15T08:15:36.867 に答える