【问题标题】:BroadcastReceiver is not listening the phone state - Unfortunately stopped when app is not in useBroadcastReceiver 没有监听电话状态 - 不幸的是,当应用程序不使用时停止了
【发布时间】:2014-12-05 08:39:26
【问题描述】:

我已经在我的应用程序中完成了通话录音,并在电话处于振铃状态时调用了一个 Activity。在该 Activity 中只显示电话号码和人名。为此,我在我的类中编写了扩展 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 方法。当我使用我的应用程序时,如果我接到电话,那么当前活动不会进入后台。所以我写了代码来完成Activity。

@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

【问题讨论】:

  • 当应用崩溃时总是发布一个 logcat
  • @MysticMagic 我从 putty 打了一个电话。当我与我的模拟器连接时,设备将断开连接。如何获取 Logcat 详细信息?

标签: android broadcastreceiver android-broadcast telephonymanager


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-03
    • 2018-03-23
    • 2015-05-09
    • 2016-11-19
    相关资源
    最近更新 更多