CALL_STATE_IDLE вызывать несколько раз?

Я создал приложение для записи звонков, которые записывают все входящие и исходящие звонки. Приложение работает отлично, я проверил его. Мне нужно отправить фоновое электронное письмо (без использования пользователя, используя JAVAMAIL) для записанного файла. У меня есть рабочий код для отправки почты с вложением. Я создал вещательный приемник, который слушает PHONE_STATE а также NEW_OUTGOING_CALL, Запуск / остановка Broadcast Receiver Услуга записи в соответствии с изменением состояния телефона. У меня вопрос, как мне интегрировать код отправки электронной почты с приложением. Я знаю, что должен вызвать метод отправки почты в CALL_STATE_IDLE, Но так как метод вызывается несколько раз, я не могу этого сделать.

Я запутался, что это CALL_STATE_IDLE это правильное место для отправки электронной почты в фоновом режиме, потому что это происходит несколько раз.

Для входящего вызова состояние телефонаCALL_STATE_RINGINGCALL_STATE_OFFHOOKCALL_STATE_IDLE

Для исходящего звонка состояние телефонаCALL_STATE_IDLECALL_STATE_OFFHOOKCALL_STATE_IDLE

любая помощь плз.. спасибо заранее

CallBroadcastReceiver.java

public class CallBroadcastReceiver extends BroadcastReceiver {
    public static boolean IsOutgoingCall = false;
    public static String callNumber = "";

    public void onReceive(Context context, Intent intent) {

        Log.d("CallRecorder", "CallBroadcastReceiver::onReceive got Intent: "
                + intent.toString());
        if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {

            String numberToCall = intent
                    .getStringExtra(Intent.EXTRA_PHONE_NUMBER);
            Log.d("CallRecorder",
                    "CallBroadcastReceiver intent has EXTRA_PHONE_NUMBER: "
                            + numberToCall);
            IsOutgoingCall = true;
            callNumber = numberToCall;
        }

        PhoneListener phoneListener = new PhoneListener(context, intent);
        TelephonyManager telephony = (TelephonyManager) context
                .getSystemService(Context.TELEPHONY_SERVICE);
        telephony.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE);
        Log.d("PhoneStateReceiver::onReceive", "set PhoneStateListener");

    }
}

PhoneListener

public class PhoneListener extends PhoneStateListener {
    public static Context context;
    private Intent intent;

    public PhoneListener(Context c, Intent i) {
        Log.i("CallRecorder", "PhoneListener constructor");
        context = c;
        intent = i;
    }

    public void onCallStateChanged(int state, String incomingNumber) {
        Log.d("CallRecorder", "PhoneListener::onCallStateChanged state:"
                + state + " incomingNumber:" + incomingNumber);

        switch (state) {
        case TelephonyManager.CALL_STATE_IDLE:
            Log.d("CallRecorder", "CALL_STATE_IDLE, stoping recording");
            Boolean stopped = context.stopService(new Intent(context,
                    RecordService.class));
            Log.i("CallRecorder", "stopService for RecordService returned "
                    + stopped);

            break;
        case TelephonyManager.CALL_STATE_RINGING:

            Log.d("CallRecorder", "CALL_STATE_RINGING");
            Log.d("CallRecorder",
                    "CallBroadcastReceiver intent has EXTRA_PHONE_NUMBER: "
                            + incomingNumber);
            CallBroadcastReceiver.IsOutgoingCall = false;

            CallBroadcastReceiver.callNumber = incomingNumber;

            break;
        case TelephonyManager.CALL_STATE_OFFHOOK:

            Log.d("CallRecorder", "CALL_STATE_OFFHOOK starting recording");
            Intent callIntent = new Intent(context, RecordService.class);
            ComponentName name = context.startService(callIntent);
            if (null == name) {
                Log.e("CallRecorder",
                        "startService for RecordService returned null ComponentName");
            } else {
                Log.i("CallRecorder",
                        "startService returned " + name.flattenToString());
            }
            break;
        }
    }
}

sendEmailWithAttachment ()

File attachedFile = new File("/mnt/sdcard/Recording/123456789.mp4");
if(attachedFile.exists() && attachedFile.canRead()) {
    Log.v("SendMail", "File Exists");
    GMailSender sender = new GMailSender("your@gmail.com","your@gmail.com"); //<<< Enter Here
    sender.sendMail("Subject", "Body ", 
            "your@gmail.com", "to@gmail.com", attachedFile);

    emailsStatus = 1; // Send
} else {
    emailsStatus = 2; // File Not Exists
    Log.v("SendMail", "File Not Exists");
}

1 ответ

Решение

При входящем звонке состояние будет,

Если выбрано получателем:

CALL_STATE_RINGING CALL_STATE_OFFHOOK CALL_STATE_IDLE

Если не выбрано получателем:

CALL_STATE_RINGING CALL_STATE_IDLE

При исходящем звонке состояние будет:

Если выбрано получателем:

NEW_OUTGOING_CALL CALL_STATE_OFFHOOK CALL_STATE_IDLE

Если не выбрано получателем:

NEW_OUTGOING_CALL  CALL_STATE_IDLE

В вашем случае вы хотели бы отправлять почту только в том случае, если вызов был получен, поэтому я бы предложил в CALL_STATE_OFFHOOK установить логическую переменную в значение true, чтобы знать, что вызов был получен, и позже, если переменная имеет значение true, тогда в CALL_STATE_IDLE отправьте письмо и установить переменную false для следующего вызова. Вы не против, если это был входящий звонок или исходящий звонок.

Boolean iscallreceived=false;
switch (state) {
    case TelephonyManager.CALL_STATE_OFFHOOK:
       iscallreceived=true;
        //your other code
    case TelephonyManager.CALL_STATE_IDLE:
       if(iscallreceived){
          sendmail();
          iscallreceived=false;
 }
Другие вопросы по тегам