Android STATE_IDLE_响铃而非CALL_STATE_摘机

Android STATE_IDLE_响铃而非CALL_STATE_摘机,android,phone-state-listener,Android,Phone State Listener,我正在制作一个用于录制语音通话的应用程序。据我所知,一旦我们打电话,电话就会挂断 这就是应该发生的事情。 但我的应用程序正在录制我第一次打电话。之后,无论何时我打电话,电话都会一直处于响铃状态。我为所有状态设置了一个Log.I()语句,这样每次手机状态发生变化时,我都可以得到它的状态。每次我打电话时,电话都会一直响个不停 代码如下:- public class CallRecorder extends Service{ private MediaRecorder rec; private bo

我正在制作一个用于录制语音通话的应用程序。据我所知,一旦我们打电话,电话就会挂断

这就是应该发生的事情。 但我的应用程序正在录制我第一次打电话。之后,无论何时我打电话,电话都会一直处于响铃状态。我为所有状态设置了一个Log.I()语句,这样每次手机状态发生变化时,我都可以得到它的状态。每次我打电话时,电话都会一直响个不停

代码如下:-

public class CallRecorder extends Service{

private MediaRecorder rec;
private boolean recordStarted;
private File file;
//private TelephonyManager manager;
//private StateListener listener;

@Override
public IBinder onBind(Intent arg0) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    super.onStartCommand(intent, flags, startId);

    Bundle b = intent.getExtras();
    file = Environment.getExternalStorageDirectory();


    rec = new MediaRecorder();
    rec.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);
    rec.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    rec.setOutputFile(file.getAbsolutePath() + "/TESTRECORD.3gp");
    rec.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);


    TelephonyManager manager = (TelephonyManager) getApplicationContext().getSystemService(getApplicationContext().TELEPHONY_SERVICE);
    manager.listen(new PhoneStateListener(){
        @Override
        public void onCallStateChanged(int state, String incomingNumber) {

            if(TelephonyManager.CALL_STATE_OFFHOOK==state && rec == null)
            {
                try {
                    Log.i("OUTGOING CALL", "CALL_STATE_OFFHOOK");
                    rec.prepare();
                    //Thread.sleep(500);
                    rec.start();
                    recordStarted = true;
                    Toast.makeText(getApplicationContext(), "Recording started", Toast.LENGTH_LONG).show();
                } catch (IllegalStateException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } 

            }
            else if(TelephonyManager.CALL_STATE_IDLE==state)
            {
                Log.i("OUTGOING CALL", "CALL_STATE_IDLE");
                if(rec!=null)
                {
                    try{
                    rec.stop();
                    rec.reset();
                    rec.release();
                    recordStarted = false;
                    stopSelf();
                    }
                    catch (IllegalStateException e) {
                        //Log.e("CALL ERROR",e.getMessage());
                    }// ILLEGALSTATEEXCEPTION WHILE THE CALL ENDS AUTOMATICALLY

                }
            }
            else
            {
                Log.i("OUTGOING CALL", "CALL_STATE_RINGING");   // 2nd time outgoing


            }

        }
        }, PhoneStateListener.LISTEN_CALL_STATE);       // LISTENER REGISTERATION
    Toast.makeText(this, "Calling...", Toast.LENGTH_LONG).show();
    return 0;
}
}
现在,每次我打电话时,“电话\状态\铃声”的日志数量都在增加

我第二次打电话时,它被显示了三次

我第三次打电话时,它被显示了5次

我第4次打电话时,它显示了7次

这是日志

12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:45.621: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:52.071: I/OUTGOING CALL(7614): CALL_STATE_RINGING
每次尝试后,都会显示调用状态空闲

下面给出了一些随机误差

stop is called in an invalid state:4
有谁能告诉我这是为什么和如何发生的吗?
提前感谢。

您还没有取消活动的订阅,所以一切都在累积:)非常简单的修复

以下是我的onReceive方法:

@Override
public void onReceive(Context context, Intent intent) {
    mContext = context;
    mIntent = intent;
    TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
    tm.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
}
这是我在onCallStateChanged事件结束时使用的行:

((TelephonyManager)mContext.getSystemService(Context.TELEPHONY_SERVICE)).listen(phoneStateListener, PhoneStateListener.LISTEN_NONE);
这应该解决它