Grabación de llamadas en android por qué esto no funciona

Estoy empezando un servicio de MainActivity, que se ejecutan indefinidamente buscando las llamadas entrantes y salientes para grabar, ¿Por qué es que el smple "switch-case" trabajo doest …? No se produce ningún error, pero puedo registrar sólo cada uno de entrada y salida .. El servicio se muere después de grabar la llamada, se va a recrear (START_STICKy) .. pero nunca va a empezar … pls ayuda … Gracias en advace ….


¿Hay otros códigos para registrar la llamada entrante y saliente en android? __`

package com.exampled.demoserv; import java.io.File; import java.io.IOException; import android.app.Service; import android.content.Context; import android.content.Intent; import android.media.MediaRecorder; import android.os.Environment; import android.os.Handler; import android.os.IBinder; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; import android.widget.Toast; public class ParentalService extends Service { @Override public void onCreate() { //Toast.makeText(getApplicationContext(), "Service Created", Toast.LENGTH_SHORT).show(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { // TODO Auto-generated method stub //Toast.makeText(getApplicationContext(), "Subu's Monitoring sTARTED", Toast.LENGTH_SHORT).show(); startMonitor(); return START_STICKY_COMPATIBILITY; } @Override public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub Toast.makeText(getApplicationContext(), "Service Binded", Toast.LENGTH_SHORT).show(); return null; } @Override public void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); Toast.makeText(getApplicationContext(), "Destroyed", Toast.LENGTH_SHORT).show(); } public void startMonitor() { TelephonyManager mTelephonyMgr = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); mTelephonyMgr.listen(new TeleListener(), PhoneStateListener.LISTEN_CALL_STATE); } class TeleListener extends PhoneStateListener { boolean recording=false; final MediaRecorder recorder = new MediaRecorder(); String inc_num="",fname; public void onCallStateChanged(int state, String incomingNumber) throws IllegalStateException { super.onCallStateChanged(state, incomingNumber); switch (state) { case TelephonyManager.CALL_STATE_IDLE: //CALL_STATE_IDLE; Toast.makeText(getApplicationContext(), "CALL_STATE_IDLE : "+Boolean.toString(recording), Toast.LENGTH_SHORT).show(); if(recording==true) { recorder.stop(); recorder.reset(); recorder.release(); Toast.makeText(getApplicationContext(), "Released_idle", Toast.LENGTH_SHORT).show(); } break; case TelephonyManager.CALL_STATE_OFFHOOK: Toast.makeText(getApplicationContext(), Boolean.toString(recording)+" : Offhook",Toast.LENGTH_SHORT).show(); recorder.setAudioSource(MediaRecorder.AudioSource.MIC); recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); String file= Environment.getExternalStorageDirectory().toString(); String filepath= file+"/111111111111Aandroid_Subui"; File dir= new File(filepath); dir.mkdirs(); if(inc_num.length()==0) { fname="outgoingNum"; } filepath+="/"+fname+".3gp"; recorder.setOutputFile(filepath); try { recorder.prepare(); } catch (IllegalStateException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } recorder.start(); recording=true; break; case TelephonyManager.CALL_STATE_RINGING: //CALL_STATE_RINGING inc_num = incomingNumber; Toast.makeText(getApplicationContext(), "CALL_STATE_RINGING : "+incomingNumber, Toast.LENGTH_SHORT).show(); break; default: Toast.makeText(getApplicationContext(), "Default reached", Toast.LENGTH_SHORT).show(); } } } } 

Finalmente conseguí el resultado … Ahora puedo registrar las llamadas entrantes y salientes (2.2).

Cambiado toda la estructura ..

Aquí está mi CallRecordingService.java tostado te hará entender lo que va arround … 🙂

 package com.exampled.beta; import java.io.File; import java.io.IOException; import android.app.Service; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.media.MediaRecorder; import android.os.Environment; import android.os.IBinder; import android.telephony.TelephonyManager; import android.widget.Toast; public class CallRecordingService extends Service { final MediaRecorder recorder=new MediaRecorder(); boolean recording=false; int i=0; String fname; BroadcastReceiver CallRecorder=new BroadcastReceiver() { @Override public void onReceive(Context arg0, Intent intent) { // TODO Auto-generated method stub String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE); i++; if(TelephonyManager.EXTRA_STATE_OFFHOOK.equals(state)) { Toast.makeText(getApplicationContext(), state, Toast.LENGTH_LONG).show(); Toast.makeText(arg0, "Start CaLLED "+recording+fname, Toast.LENGTH_LONG).show(); startRecording(); } if(TelephonyManager.EXTRA_STATE_IDLE.equals(state)&&recording==true) { Toast.makeText(getApplicationContext(), state, Toast.LENGTH_LONG).show(); Toast.makeText(arg0, "STOP CaLLED :"+recording, Toast.LENGTH_LONG).show(); stopRecording(); } if(TelephonyManager.EXTRA_STATE_RINGING.equals(state)) { fname=intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER); Toast.makeText(getApplicationContext(), state+" : "+fname, Toast.LENGTH_LONG).show(); } } }; BroadcastReceiver OutGoingNumDetector=new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub fname=intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER); } }; @Override public void onCreate() { // TODO Auto-generated method stub super.onCreate(); Toast.makeText(getApplicationContext(), "Service Created", Toast.LENGTH_LONG).show(); IntentFilter RecFilter = new IntentFilter(); RecFilter.addAction("android.intent.action.PHONE_STATE"); registerReceiver(CallRecorder, RecFilter); IntentFilter OutGoingNumFilter=new IntentFilter(); OutGoingNumFilter.addAction("android.intent.action.NEW_OUTGOING_CALL"); registerReceiver(OutGoingNumDetector, OutGoingNumFilter); } @Override public int onStartCommand(Intent intent, int flags, int startId) { // TODO Auto-generated method stub return super.onStartCommand(intent, flags, startId); } @Override public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub return null; } @Override public void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); unregisterReceiver(CallRecorder); unregisterReceiver(OutGoingNumDetector); Toast.makeText(getApplicationContext(), "Destroyed", Toast.LENGTH_SHORT).show(); } public void startRecording() { if(recording==false) { Toast.makeText(getApplicationContext(), "Recorder_Sarted"+fname, Toast.LENGTH_LONG).show(); recorder.setAudioSource(MediaRecorder.AudioSource.MIC); recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); String file= Environment.getExternalStorageDirectory().toString(); String filepath= file+"/11111111111111"; File dir= new File(filepath); dir.mkdirs(); filepath+="/"+fname+".3gp"; recorder.setOutputFile(filepath); try { recorder.prepare(); } catch (IllegalStateException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } recorder.start(); recording=true; } } public void stopRecording() { if(recording==true) { Toast.makeText(getApplicationContext(), "Recorder_Relesed from "+recording, Toast.LENGTH_LONG).show(); recorder.stop(); recorder.reset(); recorder.release(); recording=false; broadcastIntent(); } } public void broadcastIntent() { Intent intent = new Intent(); intent.setAction("com.exampled.beta.CUSTOM_INTENT"); sendBroadcast(intent); Toast.makeText(getApplicationContext(), "BroadCaste", Toast.LENGTH_LONG).show(); } } 

ServiceCaller.java

 package com.exampled.beta; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.widget.Toast; public class ServiceCaller extends BroadcastReceiver { @Override public void onReceive(Context arg0, Intent arg1) { // TODO Auto-generated method stub arg0.stopService(new Intent(arg0,CallRecordingService.class)); Intent intent=new Intent(arg0, CallRecordingService.class); arg0.startService(intent); Toast.makeText(arg0, "Service Explicitely", Toast.LENGTH_SHORT).show(); } } 

MainActivity.java

 package com.exampled.beta; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.Menu; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent intent = new Intent(this,CallRecordingService.class); startService(intent); finish(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is // present. getMenuInflater().inflate(R.menu.main, menu); return true; } } 

PERMISOS

 <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.RECORD_AUDIO"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/> 

En lugar de myAudioRecorder.setAudioSource (MediaRecorder.AudioSource.MIC);

use myAudioRecorder.setAudioSource (MediaRecorder.AudioSource.VOICE_CALL);

Esta opción particular se describe aquí> http://developer.android.com/reference/android/media/MediaRecorder.AudioSource.html Llamada de voz uplink + fuente de audio de enlace descendente Eso significa que la grabación contendrá ambas voces.

Tenga cuidado al iniciar la grabación. Cuando se inicia la llamada o cuando la otra persona responde a la llamada.

  • Procesamiento de señales (decodificación de código Morse) con aplicación Android
  • Cómo grabar voz en formato "wav" en Android
  • Android, filtros de audio
  • Pausar y reanudar la grabación de audio en Android
  • AudioRecord de Android vs MediaRecorder para la grabación de audio
  • Mejorar la calidad de grabación de audio Android?
  • Archivo .m4a archivo Android
  • Cómo utilizar el altavoz interno para reproducir sonido mientras que un conector de 3,5 mm enchufado para grabar sonido utilizando un micrófono externo
  • Retardo de grabación de audio
  • Grabar / capturar la reproducción interna de sonido de la aplicación de Android y exportar mp3?
  • Excepción de estado ilegal al llamar a MediaCodec.configure ()
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.