2013-03-27 28 views
3

如何在检测到来电时启动新的活动。在下面的代码我想在CALL_STATE_RINGING状态开始新的活动在服务运行期间创建新的活动

public String getCurrentCallState(final TelephonyManager mytelMgr) { 
     int callState = mytelMgr.getCallState(); 
     String callStateString = "NOTKNOWN"; 
     switch (callState) { 
      case TelephonyManager.CALL_STATE_IDLE: 
       callStateString = "IDLE"; 
       break; 
      case TelephonyManager.CALL_STATE_OFFHOOK: 
       callStateString = "OFFHOOK"; 
       break; 
      case TelephonyManager.CALL_STATE_RINGING: 
       callStateString = "RINGING"; 
       break; 
     } 
} 

现在,我做了一些改变。在* CALL_STATE_RINGING *状态,但它无法正常工作。每当通话即将到来,我的应用程序正在退出。 其实我想在来电铃声时致电该活动。

import android.app.Activity; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.telephony.PhoneStateListener; 
import android.telephony.TelephonyManager; 
import android.widget.Toast; 


public class CallHelper extends Activity 
{ 


    /** 
    * Listener to detect incoming calls. 
    */ 
    private class CallStateListener extends PhoneStateListener 
    { 


     @Override 
     public void onCallStateChanged(int state, String incomingNumber) 
     { 

      switch (state) { 
      case TelephonyManager.CALL_STATE_RINGING: 
       // called when someone is ringing to this phone 
       Intent i = new Intent(getApplicationContext(), out.class); 
       i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //must be provided 
       getApplicationContext().startActivity(i); 



      Toast.makeText(ctx, "Incoming: "+incomingNumber, Toast.LENGTH_LONG).show(); 


       break; 
      } 
     } 
    } 

    /** 
    * Broadcast receiver to detect the outgoing calls. 
    */ 
    public class OutgoingReceiver extends BroadcastReceiver { 
     public OutgoingReceiver() { 
     } 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      String number = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER); 

      Toast.makeText(ctx, "Outgoing: "+number, Toast.LENGTH_LONG).show(); 
     } 

    } 

    private Context ctx; 
    private TelephonyManager tm; 
    private CallStateListener callStateListener; 

    private OutgoingReceiver outgoingReceiver; 

    public CallHelper(Context ctx) { 
     this.ctx = ctx; 

     callStateListener = new CallStateListener(); 
     outgoingReceiver = new OutgoingReceiver(); 
    } 

    /** 
    * Start calls detection. 
    */ 
    public void start() { 
     tm = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE); 
     tm.listen(callStateListener, PhoneStateListener.LISTEN_CALL_STATE); 

     IntentFilter intentFilter = new IntentFilter(Intent.ACTION_NEW_OUTGOING_CALL); 
     ctx.registerReceiver(outgoingReceiver, intentFilter); 
    } 

    /** 
    * Stop calls detection. 
    */ 
    public void stop() { 
     tm.listen(callStateListener, PhoneStateListener.LISTEN_NONE); 
     ctx.unregisterReceiver(outgoingReceiver); 
    } 

} 

回答

2

有没有区别 - 除了一个重要标志 - 从Service甚至BroadcastReceiver启动一个Activity时。请使用您 CALL_STATE_RINGING情况如下:

Intent i = new Intent(getApplicationContext(), YourActivity.class); 
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //must be provided 
getApplicationContext().startActivity(i); 

确保您的发射活动是在AndroidManifest过定义。