2014-05-05 21 views
6

Sto lavorando alle registrazioni di una telefonata. Sfortunatamente, quando inizio un record su una telefonata, purtroppo si ferma. & viene restituito l'errore MediaRecorder start fail -2147483648. Mi riferisco a questa risposta link. Ma non capisco. Per favore dimmi qual è il problema nel mio codice? Ecco il mio codice.Registrazione media Android: java.lang.RuntimeException: avvio non riuscito

public class IncomingCall extends BroadcastReceiver { 

Context pcontext; 
private static MediaRecorder recorder; 
private boolean recordedStart = false; 

@SuppressWarnings("unchecked") 
public void onReceive(Context context, Intent intent) { 
    pcontext = context; 
    recorder = new MediaRecorder(); 

try { 
      TelephonyManager tmgr = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 
      MyPhoneStateListener PhoneListener = new MyPhoneStateListener(); 
      tmgr.listen(PhoneListener, PhoneStateListener.LISTEN_CALL_STATE); 

    } catch (Exception e) { 
     Log.e("Phone Receive Error", " " + e); 
    } 

} 

private class MyPhoneStateListener extends PhoneStateListener { 
    public void onCallStateChanged(int state, String incomingNumber) { 



     switch (state) { 
     case TelephonyManager.CALL_STATE_RINGING: 
      Log.e("MyPhoneListener",state+" incoming no:"+incomingNumber); 
      Log.e("CALL_STATE_RINGING", "CALL_STATE_RINGING"); 

      break; 

     case TelephonyManager.CALL_STATE_OFFHOOK: 

      recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL); 
      recorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); 
      recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); 
      recorder.setOutputFile(Environment.getExternalStorageDirectory()+"/MyRecorder.mp3"); 
      Log.e("Path", ""+Environment.getExternalStorageDirectory()+"/MyRecorder.mp3"); 
      try { 
       recorder.prepare(); 
       recorder.start(); 
       recordedStart = true; 
       Log.e("Start", "Recorder Start"); 
      } catch (IllegalStateException | IOException e) { 
       // TODO Auto-generated catch block 
       Log.e("Error", ""+e); 
      } 

      break; 
     case TelephonyManager.CALL_STATE_IDLE: 
      Log.e("CALL_STATE_IDLE", "CALL_STATE_IDLE"); 
      if (recordedStart == true) { 
       recorder.stop(); 
       recorder.release(); 
       recordedStart = false; 
       Log.e("Stop", "Recorder Stop"); 
      } 
      break; 
     } 
    } 
} 

}

Logcat errore

05-05 10:57:23.771: E/MediaRecorder(12812): start failed: -2147483648 
05-05 10:57:23.771: D/AndroidRuntime(12812): Shutting down VM 
05-05 10:57:23.771: W/dalvikvm(12812): threadid=1: thread exiting with uncaught exception (group=0x416bdd40) 
05-05 10:57:23.774: E/AndroidRuntime(12812): FATAL EXCEPTION: main 
05-05 10:57:23.774: E/AndroidRuntime(12812): Process: web.revolution.autocallanswer, PID: 12812 
05-05 10:57:23.774: E/AndroidRuntime(12812): java.lang.RuntimeException: start failed. 
05-05 10:57:23.774: E/AndroidRuntime(12812): at android.media.MediaRecorder.start(Native Method) 
05-05 10:57:23.774: E/AndroidRuntime(12812): at web.revolution.autocallanswer.IncomingCall$MyPhoneStateListener.onCallStateChanged(IncomingCall.java:98) 
05-05 10:57:23.774: E/AndroidRuntime(12812): at android.telephony.PhoneStateListener$2.handleMessage(PhoneStateListener.java:389) 
05-05 10:57:23.774: E/AndroidRuntime(12812): at android.os.Handler.dispatchMessage(Handler.java:102) 
05-05 10:57:23.774: E/AndroidRuntime(12812): at android.os.Looper.loop(Looper.java:136) 
05-05 10:57:23.774: E/AndroidRuntime(12812): at android.app.ActivityThread.main(ActivityThread.java:5102) 
05-05 10:57:23.774: E/AndroidRuntime(12812): at java.lang.reflect.Method.invokeNative(Native Method) 
05-05 10:57:23.774: E/AndroidRuntime(12812): at java.lang.reflect.Method.invoke(Method.java:515) 
05-05 10:57:23.774: E/AndroidRuntime(12812): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
05-05 10:57:23.774: E/AndroidRuntime(12812): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
05-05 10:57:23.774: E/AndroidRuntime(12812): at dalvik.system.NativeStart.main(Native Method) 
05-05 10:57:25.586: I/Process(12812): Sending signal. PID: 12812 SIG: 9 
05-05 10:57:27.052: E/CALL_STATE_IDLE(13255): CALL_STATE_IDLE 

risposta

9

questo problema che causa da questa fonte Audio

recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL); 

non funziona sul vostro dispositivo e Android! cambiare la situazione a

recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 

o di altre fonti.

anche è possibile rimuovere FC dal cambiamento recorderstart() per try/catch con IllegalStateException, Exception stesso di questo

 try { 
     recorder.prepare(); 

    } catch (IllegalStateException e) { 
     // TODO Auto-generated catch block 
     Log.d("ERROR ","IllegalStateException"); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     Log.d("ERROR ","IOException"); 
     e.printStackTrace(); 
    } 
    try { 
    recorder.start(); 
    } catch (Exception e) { 

    } 

ho avuto questo problema me stesso, questo sta lavorando molto per la registrazione delle chiamate, ma avendo problema con la qualità della voce del ricevitore è molto bassa se trovi una soluzione anche a me.

1

Ho affrontato lo stesso problema quando ho provato a registrare VOICE_CALL/VOICE_DOWNLINK/VOICE_UPLINK sul mio Nexus5. Non voglio parlare a lungo, questo problema è indeciso su molti smartphone con Android. Ma ci sono diversi dispositivi che funzionano normalmente con questa sorgente audio. Uno di questi è Samsung specificamente Note3 (Android 4.3). Ho provato questo su quel dispositivo e tutto è andato bene. Come ho sentito, questo problema apparirà di nuovo quando l'aggiornamento 4.4.2/3 raggiunge Note3, probabilmente a causa di conflitti con la legge degli Stati Uniti. Ma ora puoi usare questa funzione su Note3 senza alcuna condizione.

Se si utilizza questa fonte audio su altro dispositivo si dovrà evitare che l'incidente di applicazione con questo codice:

try { 
    mRecorder.start(); 
    } catch (Throwable t) { 
     t.printStackTrace(); 
     Log.w(LOG_TAG, t); 
    } 

allora non tutti i problemi con questo problema ...

Cosa altro dispositivo che funzionerebbe bene con questa fonte, non lo so. Ho provato solo su Note3. Interessante come funziona su Galaxy3/4/5.

0

So che è tardi per rispondere, ma per gli altri che hanno lo stesso problema, la mia soluzione è impostare la sorgente audio su MediaRecorder.AudioSource.VOICE_COMMUNICATION, in modo che la qualità della voce del ricevitore non diminuisca.