BroadcastReceiver没有收听手机状态 - 不幸的是,当应用未被使用时停止

时间:2014-12-05 08:39:26

标签: android broadcastreceiver android-broadcast telephonymanager

我已经在我的应用程序中完成了呼叫记录,并且当电话处于振铃状态时正在呼叫一个活动。在该活动中,我正在显示电话号码和人名。为此,我在我的类中编写了代码,它扩展了BroadcastReceiver。

当我使用该应用程序时,此方案正常工作。但是,如果我关闭应用程序,那么我将获得Unfortunately stopped

这是我的AndroidManifest.xml。

<receiver android:name="com.domyhome.broadcastreceiver.IncomingCallInterceptor" >
        <intent-filter>
            <action android:name="android.intent.action.PHONE_STATE" />
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
 </receiver>

这是我的onRecive方法。当我使用我的应用程序如果我接到一个电话,那么当前活动不会进入后台。所以我编写了完成活动的代码。

@Override
public void onReceive(Context context, Intent intent) {
     LoginActivity.login.finish();
     MainActivity.main.finish();
     telephonyRegister(context,intent);
 }

这是功能。当电话状态为响铃时,我正在呼叫ProjectDailogActivity。当电话参加或结束时,我正在完成相同的活动。

public void telephonyRegister(final Context context, Intent intent)
{
    TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);                      
  ctx=context;
  if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
         TelephonyManager.EXTRA_STATE_IDLE)) {  
     try
     {
     ProjectDailogActivity.projdialog.finish();
     }catch(Exception e)
     {
         e.printStackTrace();
     }

     if(ring==true&&callReceived==false)
     {
         Toast.makeText(context, "THIS IS MISSED CALL FROM"+phoneNumber, Toast.LENGTH_LONG).show();
         String smsmessage = "Thanks for contacting us. We will get back you soon";
         SmsManager smsManager = SmsManager.getDefault();
         smsManager.sendTextMessage(phoneNumber, null, "Dear Customer!"+" "+smsmessage, null, null);
         Log.i("sms",smsmessage);
         Toast.makeText(context, "SMS sent.",
         Toast.LENGTH_LONG).show();     
         callReceived=false;

     }
     else if(callReceived==true)
     {  
         try
         {
         ProjectDailogActivity.projdialog.finish();
         }catch(Exception e)
         {
             e.printStackTrace();
         }

         if(Conntact.isAvailable(phoneNumber))
         {
            try{
                  myAudioRecorder.release();
                  myAudioRecorder.stop();
                  myAudioRecorder = null;
            }
            catch(Exception e)
            {
                System.out.print("error");
            }       
            Toast.makeText(context,"Recording Stopped", Toast.LENGTH_SHORT).show();
     }
     }

    }
 else if(intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
         TelephonyManager.EXTRA_STATE_OFFHOOK))
 {
     try{
         ProjectDailogActivity.projdialog.finish();
         }catch(Exception e)
         {
             e.printStackTrace();
         }
        dir = Environment.getExternalStorageDirectory();
         try {
            file = File.createTempFile("sound", ".mp3", dir);  
           } catch (IOException e) {  
               e.printStackTrace();
             return;  
           }    
              myAudioRecorder = new MediaRecorder();
              myAudioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
              myAudioRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
              myAudioRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
              myAudioRecorder.setOutputFile(file.getAbsolutePath());
     if(Conntact.isAvailable(phoneNumber))
     {
        callReceived = true;
         ring=false;
     try {
         myAudioRecorder.prepare();
         myAudioRecorder.start();
      } catch (IllegalStateException e) {
        e.printStackTrace();
      } catch (IOException e) {
        e.printStackTrace();
      }
      Toast.makeText(context, "recording started", Toast.LENGTH_SHORT).show();
     }
     else
     {

     }

 }
 else if(intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
         TelephonyManager.EXTRA_STATE_RINGING)){
     phoneNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
     ring = true;
     System.out.println("phonenum"+Conntact.isAvailable(phoneNumber));
     if(!Conntact.isAvailable(phoneNumber))
     {
         Toast.makeText(ctx, phoneNumber+"not available", Toast.LENGTH_SHORT).show();
     }
     else if(Conntact.isAvailable(phoneNumber))
     {
         Intent intent11 = new Intent(ctx,ProjectDailogActivity.class);
         intent11.putExtra("incoming_number",phoneNumber);
         intent11.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         ctx.startActivity(intent11);

     }

 } 

 }

Conntact是一个已经存储了一些数字的表。因此,当我接到电话时,我正在检查Conntact表中的主叫号码是否可用。

如果可用,则显示ProjectDailogActivity。如果号码可用且呼叫也被选中则表示然后进行录音。一切都很好。但是当我的应用未被使用时,它会显示Unfortunately stopped

1 个答案:

答案 0 :(得分:3)

从您的应用中退出时,请考虑取消注册广播事件Click here for a SO answer on same issue