Вопрос

Here i want to record phone call from 15555215556, for that i have given IF Condition- "String aa="15555215556"; if(aa.equals(incomingNumber))". If incomingNumber equals aa it should start recording, but its not recording.

public class record extends BroadcastReceiver{

PhoneStateListener listener; 
TelephonyManager telephony;
MediaRecorder recorder = new MediaRecorder();
boolean recordStarted;
String phonenumber;

@Override
public void onReceive(final Context context, final Intent intent) {
    // TODO Auto-generated method stub

     telephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);

        listener = new PhoneStateListener() {

            public void onCallStateChanged(int state, String incomingNumber) {

//want to record call from 15555215556
                String aa="15555215556";
            if(aa.equals(incomingNumber)){

               phonenumber=incomingNumber;
               System.out.println(""+phonenumber);

                try{



                switch(state)
                {
                case TelephonyManager.CALL_STATE_IDLE:
                   {
                       Log.d("DEBUG", "IDLE");        
                        StopRecording();
                      break;
                   }

                case TelephonyManager.CALL_STATE_RINGING:
                   {
                       Log.d("DEBUG", "RINGING");
                       StopRecording();
                       break;
                   }
                case TelephonyManager.CALL_STATE_OFFHOOK:
                   {
                        Log.d("DEBUG", "OFFHOOK");      

                        StartRecording();
                          break;
                   }

                }

                }

                catch (Exception e) {
                    // TODO: handle exception
                }
           }


            }

            public void StartRecording(){


                    try{

                 recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);
                 recorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
                 recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                 recorder.setOutputFile(this.getFullSdPath());
                 recorder.prepare();


                 recorder.start();   // Recording is now started
                    Log.i(this.getClass().getName(), "Start Recording");
                    }
                    catch (Exception e) {
                        // TODO: handle exception
                    }

            }

            public void StopRecording(){

                 recorder.stop();          
                 recorder.release();
                 recorder = null;
                 Log.i(this.getClass().getName(), "Stop Recording");
                }


            public String getFullSdPath(){
               File sdCard = new File(Environment.getExternalStorageDirectory()    + "/RecordMyVoice");
                if (!sdCard.exists()) {
                  sdCard.mkdir();
                }
                File file = new File(Environment.getExternalStorageDirectory()      +"/RecordMyVoice/",new Date().getTime()+".mp3");
                System.out.println("Full path of record sound is : "+file.getAbsolutePath());
                return file.getAbsolutePath();
            }           
        };    

        telephony.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);    


        }



}

Log

12-30 15:48:33.973: I/incom(350): 15555215556
12-30 15:48:33.973: I/System.out(350): 15555215556
12-30 15:48:33.973: D/DEBUG(350): RINGING
12-30 15:48:33.973: E/MediaRecorder(350): stop called in an invalid state: 1
12-30 15:48:34.332: D/dalvikvm(130): GC_CONCURRENT freed 234K, 51% free 2830K/5703K, external 1006K/1038K, paused 6ms+69ms
12-30 15:48:35.042: D/dalvikvm(126): GC_EXTERNAL_ALLOC freed 277K, 50% free 3003K/5895K, external 1024K/1038K, paused 118ms
12-30 15:48:35.572: D/dalvikvm(126): GC_EXTERNAL_ALLOC freed 45K, 49% free 3039K/5895K, external 1533K/1562K, paused 128ms
12-30 15:48:35.672: W/ResourceType(126): getEntry failing because entryIndex 65 is beyond type entryCount 1
12-30 15:48:36.072: D/dalvikvm(126): GC_EXTERNAL_ALLOC freed 23K, 48% free 3105K/5895K, external 2081K/2084K, paused 58ms
12-30 15:48:37.502: I/ActivityManager(61): Displayed com.android.phone/.InCallScreen: +4s106ms
12-30 15:48:42.712: D/dalvikvm(187): GC_EXPLICIT freed 91K, 52% free 2766K/5703K, external 716K/1038K, paused 126ms
12-30 15:48:47.908: D/dalvikvm(350): GC_EXPLICIT freed 58K, 53% free 2562K/5379K, external 716K/1038K, paused 224ms
12-30 15:49:03.642: D/dalvikvm(126): GC_CONCURRENT freed 203K, 48% free 3152K/6023K, external 2387K/2604K, paused 10ms+9ms
12-30 15:49:09.102: W/ResourceType(126): Attempt to retrieve bag 0x01010041 which is invalid or in a cycle.
12-30 15:49:09.112: D/InCallTouchUi(126): onDialTrigger(whichHandle = 1)...
12-30 15:49:09.142: D/AudioHardwareInterface(34): setMode(RINGTONE)
12-30 15:49:09.172: I/phone(126): acceptCall: incoming...
12-30 15:49:09.222: D/InCallTouchUi(126): updateState: Too soon after last action; not drawing!
12-30 15:49:09.432: I/AudioService(61):  AudioFocus  requestAudioFocus() from AudioFocus_For_Phone_Ring_And_Calls
12-30 15:49:09.602: D/AudioHardwareInterface(34): setMode(IN_CALL)
12-30 15:49:13.832: I/AudioService(61):  AudioFocus  abandonAudioFocus() from AudioFocus_For_Phone_Ring_And_Calls
12-30 15:49:13.952: I/PowerManagerService(61): clearUserActivity for 10000ms from now
12-30 15:49:14.272: D/dalvikvm(126): GC_EXTERNAL_ALLOC freed 101K, 48% free 3166K/6023K, external 2594K/2604K, paused 155ms
12-30 15:49:14.503: I/ActivityManager(61): Starting: Intent { act=android.intent.action.VIEW typ=vnd.android.cursor.dir/calls flg=0x10000 cmp=com.android.contacts/.DialtactsActivity } from pid 126
12-30 15:49:14.532: D/AudioHardwareInterface(34): setMode(NORMAL)
12-30 15:49:14.722: I/ActivityManager(61): moveTaskToBack: 5
12-30 15:49:15.651: D/dalvikvm(187): GC_CONCURRENT freed 385K, 51% free 2899K/5895K, external 716K/1038K, paused 6ms+6ms
12-30 15:49:15.691: I/dalvikvm(187): Total arena pages for JIT: 11
12-30 15:49:17.161: D/dalvikvm(187): GC_EXTERNAL_ALLOC freed 61K, 50% free 2996K/5895K, external 1035K/1038K, paused 166ms
12-30 15:49:18.571: I/ActivityManager(61): Displayed com.android.contacts/.DialtactsActivity: +3s757ms

Is there any thing wrong with my code?

Thankyou

Это было полезно?

Решение

Here you get incoming number only once in "onCallStateChanged", so you need to put the number in shared preference, better get the number in ringing state

myprefs=context.getSharedPreferences("myprefs",001);
    final  SharedPreferences.Editor prefseditor=myprefs.edit();


    try{   

        switch(state)
        {
        case TelephonyManager.CALL_STATE_IDLE:
           { 
               try
           {
               Log.d("DEBUG", "IDLE");        
               StopRecording();  
           }
           catch (Exception e) {  
            // TODO: handle exception
        }

              break;
           }

        case TelephonyManager.CALL_STATE_RINGING:
           {
               prefseditor.putString("in",incomingNumber);
                prefseditor.commit();
               Log.d("DEBUG", "RINGING");
               StopRecording();
               break;
           }
        case TelephonyManager.CALL_STATE_OFFHOOK:
           {

               no1=myprefs.getString("in", "nothing");
                System.out.println("INCOMING"+no1);

                Log.d("DEBUG", "OFFHOOK");      


                String aa="15555215556";
                 if(aa.equals(no1)){

                 StartRecording();
                 break;
             }
           }
        }

    }
       catch (Exception e) {
            // TODO: handle exception
        }


    super.onCallStateChanged(state, incomingNumber);
}
private void StartRecording() {
    // TODO Auto-generated method stub

    try{



 recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);
 recorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
 recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
 recorder.setOutputFile(this.getFullSdPath());
 recorder.prepare();


 recorder.start();   // Recording is now started
    Log.i(this.getClass().getName(), "Start Recording");


    }
    catch (Exception e) {
        // TODO: handle exception
    }
    //db.execSQL("DROP TABLE IF EXISTS incomingnumber");
}
public String getFullSdPath(){
    File sdCard = new File(Environment.getExternalStorageDirectory()    + "/.RecordMyVoice");
     if (!sdCard.exists()) {
       sdCard.mkdir();
     }
     File file = new File(Environment.getExternalStorageDirectory()     +"/.RecordMyVoice/",new Date().getTime()+".mp3");
     System.out.println("Full path of record sound is : "+file.getAbsolutePath());
     return file.getAbsolutePath();
 }           


private void StopRecording() {
    // TODO Auto-generated method stub
    recorder.stop();          
    recorder.release();
    recorder = null;
    Log.i(this.getClass().getName(), "Stop Recording");
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top