2014-01-17 6 views
1

Я создал небольшое приложение в Android, который записывает входящие звонки, его работает нормально, он записывает вызов, но после записи приложения crashes.I получить сообщение, что приложение, к сожалению прекратилоBroadcast приемник останавливается после выполнения своей задачи

вот мой код.

public class CallReceiver extends BroadcastReceiver 
{ 
    MediaRecorder recorder; 
    File audiofile; 
    String name, phonenumber; 
    String audio_format; 
    public String Audio_Type; 
    int audioSource; 
    Context context; 
    private Handler handler; 
    Timer timer; 
    Boolean offHook = false, ringing = false; 
    Toast toast; 
    Boolean isOffHook = false; 
    public static boolean recordstarted = false; 
    public static boolean wasRinging = false; 

    private static final String ACTION_IN = "android.intent.action.PHONE_STATE"; 
    private static final String ACTION_OUT = "android.intent.action.NEW_OUTGOING_CALL"; 

    Bundle bundle; 
    String state; 
    String inCall, outCall; 

     @Override 

      public void onReceive(Context context, Intent intent) { 
      if (intent.getAction().equals(ACTION_IN)) { 
       if ((bundle = intent.getExtras()) != null) { 
        state = bundle.getString(TelephonyManager.EXTRA_STATE); 
        if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) { 
         inCall = bundle.getString(TelephonyManager.EXTRA_INCOMING_NUMBER); 
         wasRinging = true; 
         Toast.makeText(context, "IN : " + inCall, Toast.LENGTH_LONG).show(); 
        } else if (state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) { 
         if (wasRinging == true) { 

          Toast.makeText(context, "ANSWERED", Toast.LENGTH_LONG).show(); 

          File sampleDir = new File(Environment.getExternalStorageDirectory(), "/TestRecordingDasa"); 
          if (!sampleDir.exists()) { 
           sampleDir.mkdirs(); 
          } 
          String file_name = "Rec"; 
          try { 
           audiofile = File.createTempFile(file_name, ".amr", sampleDir); 
          } catch (IOException e) { 
           e.printStackTrace(); 
          } 
          String path = Environment.getExternalStorageDirectory().getAbsolutePath(); 

          recorder = new MediaRecorder(); 
          recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_COMMUNICATION); 
          recorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB); 
          recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
          recorder.setOutputFile(audiofile.getAbsolutePath()); 
          try { 
           recorder.prepare(); 
          } catch (IllegalStateException e) { 
           e.printStackTrace(); 
          } catch (IOException e) { 
           e.printStackTrace(); 
          } 
          recordstarted = true; 
          recorder.start(); 
          } 
        } else if (state.equals(TelephonyManager.EXTRA_STATE_IDLE)) { 
         wasRinging = false; 
         Toast.makeText(context, "REJECT || DISCO", Toast.LENGTH_LONG).show(); 
         if (recordstarted) { 
          recorder.stop(); 
          recordstarted = false; 
         } 
        } 
       } 
      } else if (intent.getAction().equals(ACTION_OUT)) { 
       if ((bundle = intent.getExtras()) != null) { 
        outCall = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER); 
        Toast.makeText(context, "OUT : " + outCall, Toast.LENGTH_LONG).show(); 
       } 
      } 
     } 

} 
+0

Вы должны рассмотреть возможность использования службы для записи. запустите службу в состоянии OFF_HOOK и остановите ее в состоянии IDLE. –

+0

Просьба поделиться любыми сообщениями об ошибках, которые возникают с момента сбоя приложения. –

ответ

1
  1. сделать рекордер как статический член (частный статический MediaRecorder рекордер;)
  2. Вы должны освободить рекордер после вызова recorder.stop() recorder.release();
  3. Вот отредактированный код:

    package com.example.callreceiver; 
    
    import java.io.File; 
    import java.io.IOException; 
    import java.util.Timer; 
    import java.util.logging.Handler; 
    
    import android.content.BroadcastReceiver; 
    import android.content.Context; 
    import android.content.Intent; 
    import android.media.MediaRecorder; 
    import android.os.Bundle; 
    import android.os.Environment; 
    import android.telephony.TelephonyManager; 
    import android.util.Log; 
    import android.widget.Toast; 
    
    public class CallReceiver extends BroadcastReceiver {  
    
        private static MediaRecorder recorder; 
        private File audiofile; 
        private String name, phonenumber; 
        private String audio_format; 
        private String Audio_Type; 
        private int audioSource; 
        private Context context; 
        private Handler handler; 
        private Timer timer; 
        private Boolean offHook = false, ringing = false; 
        private Toast toast; 
        private Boolean isOffHook = false; 
        private static boolean recordstarted = false; 
        private static boolean wasRinging = false; 
    
        private static final String ACTION_IN = "android.intent.action.PHONE_STATE"; 
        private static final String ACTION_OUT = "android.intent.action.NEW_OUTGOING_CALL"; 
    
        private Bundle bundle; 
        private String state; 
        private String inCall, outCall; 
    
        @Override 
        public void onReceive(Context context, Intent intent) { 
         Log.i("onReceive", "Receive successfully"); 
    
         if (intent.getAction().equals(ACTION_IN)) { 
          Log.i("onReceive", "ACTION IN"); 
          if ((bundle = intent.getExtras()) != null) { 
           Log.i("onReceive", "Bundle != NULL"); 
           state = bundle.getString(TelephonyManager.EXTRA_STATE); 
           Log.i("onReceive", "state:"+state); 
           if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) { 
            Log.i("onReceive", "Phone ringing"); 
            inCall = bundle 
              .getString(TelephonyManager.EXTRA_INCOMING_NUMBER); 
            wasRinging = true; 
            Toast.makeText(context, "IN : " + inCall, Toast.LENGTH_LONG) 
              .show(); 
           } else if (state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) { 
            Log.i("onReceive", "Phone off hook "); 
            if (wasRinging == true) { 
             Log.i("onReceive", "Phone was ringing"); 
             Toast.makeText(context, "ANSWERED", Toast.LENGTH_LONG) 
               .show(); 
    
             File sampleDir = new File(
               Environment.getExternalStorageDirectory(), 
               "/TestRecordingDasa"); 
             if (!sampleDir.exists()) { 
              sampleDir.mkdirs(); 
             } 
             String file_name = "Rec"; 
             try { 
              audiofile = File.createTempFile(file_name, ".amr", 
                sampleDir); 
             } catch (IOException e) { 
              e.printStackTrace(); 
             } 
             String path = Environment.getExternalStorageDirectory() 
               .getAbsolutePath(); 
    
             recorder = new MediaRecorder(); 
             recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_COMMUNICATION); 
             recorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB); 
             recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
             recorder.setOutputFile(audiofile.getAbsolutePath()); 
             try { 
              recorder.prepare(); 
              Log.i("onReceive", "Prepared"); 
             } catch (IllegalStateException e) { 
              e.printStackTrace(); 
             } catch (IOException e) { 
              e.printStackTrace(); 
             } 
             recordstarted = true; 
             Log.i("onReceive", "Start recording"); 
             recorder.start(); 
            } 
           } else if (state.equals(TelephonyManager.EXTRA_STATE_IDLE)) { 
            Log.i("onReceive", "State idle"); 
            wasRinging = false; 
            Toast.makeText(context, "REJECT || DISCO", 
              Toast.LENGTH_LONG).show(); 
            if (recordstarted) { 
             recorder.stop(); 
             recorder.release(); 
             Log.i("onReceive", "Record Stopped"); 
             recordstarted = false; 
            } 
           } 
          } 
         } else if (intent.getAction().equals(ACTION_OUT)) { 
          Log.i("onReceive", "ACTION_OUT"); 
          if ((bundle = intent.getExtras()) != null) { 
           outCall = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER); 
           Toast.makeText(context, "OUT : " + outCall, Toast.LENGTH_LONG) 
             .show(); 
          } 
         } 
    
    
        } 
    
    } 
    
+0

Спасибо, GEM .. Он работал. Теперь он работает нормально. – Nisha

0
it records the call but after recording the application crashes. 
I get the message that Unfortunately application has stopped 

В своем коде, когда он получает OffHook утверждают, что начать запись, но он блокирует на функции на «recorder.start();» и когда в режиме ожидания в режиме ожидания происходит сбой.

Итак, есть две вещи, которые вы можете сделать:

-> Поместите свой стартовый код записи и остановки, как в другом потоке и обрабатывать соответствующим образом.

Или

-> Выполнить обслуживание, положить начало и остановка записи код. Вы можете отправлять широковещательные сообщения на услугу, когда это состояние вызова Idle, offhook вы получаете, затем начинаете и останавливаете запись соответственно.

+0

Я не думаю, что это может быть проблемой для сбоев. –

+0

Тогда что вы думаете? – Hulk

0

Вы создали экземпляр, если еще часть recorder = new MediaRecorder(); попытайтесь выставить это утверждение вне поля &, сделайте это globle, это может решить вашу проблему.

Я столкнулся с такой же проблемой.

Проблема заключается в том, что вы создаете новый MediaRecorder внутри оператора if, который маскирует член класса mRecorder класса MediaRecorder. Так Меняем:

+0

Ваш ответ помог мне, но есть еще некоторые изменения. – Nisha

Смежные вопросы