Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 呼叫\状态\空闲呼叫多次?_Android_Jakarta Mail_Telephonymanager - Fatal编程技术网

Android 呼叫\状态\空闲呼叫多次?

Android 呼叫\状态\空闲呼叫多次?,android,jakarta-mail,telephonymanager,Android,Jakarta Mail,Telephonymanager,我已经创建了一个呼叫记录应用程序,它记录所有传入和传出的呼叫。该应用程序运行完美,我已经测试过了。我需要为录制的文件发送背景电子邮件(无需用户使用JAVAMAIL)。我有发送带有附件的邮件的工作代码。我已经创建了一个广播接收器,可以收听电话状态和新的外出通话。广播接收器根据手机状态变化启动/停止录制服务。我的问题是如何将我的电子邮件发送代码与应用程序集成。我知道我必须在CALL\u STATE\u IDLE中调用邮件发送方法。但是由于该方法多次调用,我无法这样做 我感到困惑的是,CALL\u S

我已经创建了一个呼叫记录应用程序,它记录所有传入和传出的呼叫。该应用程序运行完美,我已经测试过了。我需要为录制的文件发送背景电子邮件(无需用户使用
JAVAMAIL
)。我有发送带有附件的邮件的工作代码。我已经创建了一个广播接收器,可以收听
电话状态
新的外出通话
。广播接收器根据手机状态变化启动/停止录制服务。我的问题是如何将我的电子邮件发送代码与应用程序集成。我知道我必须在
CALL\u STATE\u IDLE
中调用邮件发送方法。但是由于该方法多次调用,我无法这样做

我感到困惑的是,
CALL\u STATE\u IDLE
是在后台发送电子邮件的正确位置,因为它会多次出现

对于来电,电话状态为
CALL\u STATE\u RINGING
CALL\u STATE\u OFFHOOK
CALL\u STATE\u IDLE

对于传出呼叫,电话状态为
CALL\u STATE\u IDLE
CALL\u STATE\u OFFHOOK
CALL\u STATE\u 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;
        }
    }
}
sendmailwithattachment()

File attachedFile=新文件(“/mnt/sdcard/Recording/123456789.mp4”);
if(attachedFile.exists()&&attachedFile.canRead()){
Log.v(“SendMail”,“文件存在”);
Gmail发件人=新的Gmail发件人(“your@gmail.com","your@gmail.com"); //
来电时,状态为,

如果由收件人选择:

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_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_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_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_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,以了解呼叫已收到,稍后在call_STATE_IDLE中,如果该变量为true,则发送邮件并将变量设置为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;
 }

对不起,您的代码对我不起作用,但是如果呼入和呼出的呼叫都处于
状态,则控制永远不会进入
状态。是的,我这样做了…代码中有一个修改,它的工作方式类似于HAVE…需要声明
iscallreceived
为全局,它工作得非常好。感谢老兄,您让我度过了这一天…它对我不起作用,我是c已将变量isCallReceived更改为全局变量。如果您有任何解决方案,请提供帮助