как определить конец исходящего рингтона?

Я хочу сделать вызов с помощью моей программы и после этого распознать статус вызова. Я хочу определить конец исходящего рингтона.

Как определить конец исходящего рингтона?

Я использую Flowing code для совершения вызова.

EditText ed = (EditText) findViewById(R.id.txtcall);        
Uri uri = Uri.fromParts("tel", ed.getText().toString(), null);
callIntent = new Intent(Intent.ACTION_CALL,uri);
startActivity(callIntent);

person Amir Niazi    schedule 15.02.2013    source источник


Ответы (3)


Следующий фрагмент кода может помочь вам найти текущую статую телефонного звонка, независимо от того, выбран ли он, звонит или находится в режиме ожидания. Вы можете легко использовать эти состояния и соответствующим образом реализовывать свою функциональность.

 private class CustomPhoneStateListener extends PhoneStateListener
 {        
            @Override
            public void onCallStateChanged(int state, String incomingNumber) 
            {
                super.onCallStateChanged(state, incomingNumber);

                //TelephonyManager.CALL_STATE_IDLE
                //TelephonyManager.CALL_STATE_OFFHOOK
                //TelephonyManager.CALL_STATE_RINGING
            }
 }
person Pawan Maheshwari    schedule 15.02.2013
comment
Пожалуйста, дайте мне еще несколько объяснений - person Amir Niazi; 15.02.2013
comment
Просто сделайте звонок, и после этого всякий раз, когда вы обнаружите, что статус звонка CALL_STATE_IDLE, означает, что он отклонен или мелодия звонка закончилась на другой стороне. - person Pawan Maheshwari; 18.02.2013

Проверьте это: - вы сможете позвонить пользователю

Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setData(Uri.parse("tel:+9189745847"));
startActivity(callIntent);

а также использовать в файле androidmanifest.xml:

 <uses-permission android:name="android.permission.CALL_PHONE" />
person Rahul Rawat    schedule 15.02.2013
comment
Большое спасибо. Я хочу определить конец исходящего рингтона. Как я могу это сделать? - person Amir Niazi; 15.02.2013

Посмотрите на намерение NEW_OUTGOING_CALL

 <receiver android:name=".receiver.OutgoingCallReceiver" >
        <intent-filter>
            <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
        </intent-filter>
    </receiver>

Затем вы можете проверить состояние вызова с помощью PhoneStateListener :

public class OutgoingCallReceiver extends BroadcastReceiver {

protected static final String CLASS_TAG = "OutgoingCallReceiver : ";

@Override
public void onReceive(Context context, Intent intent) {
    Bundle bundle = intent.getExtras();
    if(null == bundle) return;

    String phonenumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
    Log.i(LOG_TAG, CLASS_TAG + "phone number " + phonenumber);

        final TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        tm.listen(new PhoneStateListener() {
            @Override
            public void onCallStateChanged(int state, String incomingNumber) {
                switch (state) {
                case TelephonyManager.CALL_STATE_RINGING:
                    Log.d(LOG_TAG, CLASS_TAG + "RINGING");
                    break;
                case TelephonyManager.CALL_STATE_OFFHOOK:
                    Log.d(LOG_TAG, CLASS_TAG + "OFFHOOK");
                    Process.onCallStateIsOFFHOOK();
                    break;
                case TelephonyManager.CALL_STATE_IDLE:
                    Process.onCallStateIsIDLE();
                    Log.d(LOG_TAG, CLASS_TAG + "IDLE");
                    break;
                default:
                    Log.d(LOG_TAG, CLASS_TAG + "Default: " + state);
                    break;
                }
            }
        }, PhoneStateListener.LISTEN_CALL_STATE);
    }
}

В классе Process вы можете определить мелодию звонка и создать дополнительные состояния, такие как CALLBEGINS, CALLANSWERED, записав VOICE_CALL. Пример onCallStateIsIDLE() :

public void onCallStateIsIDLE() {
    setSpeakingOn(false);
    if (stateCall == STATE_CALLANSWERED ||
            stateCall == STATE_CALLBEGINS ||
            stateCall == STATE_DIALISOFFHOOK ||
            stateCall == STATE_DIALENDREQUESTED) {
        Log.i(LOG_TAG, CLASS_TAG + " - forcing state : STATE_DIALREADY : old state = " + stateCall);
        stateCall = STATE_DIALREADY;
    }
}
person Dany Pop    schedule 15.02.2013
comment
пожалуйста, объясните больше о классе процесса. - person Amir Niazi; 15.02.2013