2016-07-16 2 views
2

Android 앱으로 전화 앱을 만들었습니다. 전화 통화 요청이있을 때마다 내 앱도 앱 목록에 있어야합니다. 이것에 필요한 권한은 무엇입니까?내 앱에서 전화 요청 받기

이 매니페스트 :

+0

당신 싶어 라인 <수신기 안드로이드에서 – Eenvincible

답변

0

이 코드 시도하십시오

import java.util.Date; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.telephony.TelephonyManager; 

public abstract class PhonecallReceiver extends BroadcastReceiver { 

    //The receiver will be recreated whenever android feels like it. We need a static variable to remember data between instantiations 

    private static int lastState = TelephonyManager.CALL_STATE_IDLE; 
    private static Date callStartTime; 
    private static boolean isIncoming; 
    private static String savedNumber; //because the passed incoming is only valid in ringing 


    @Override 
    public void onReceive(Context context, Intent intent) { 

     //We listen to two intents. The new outgoing call only tells us of an outgoing call. We use it to get the number. 
     if (intent.getAction().equals("android.intent.action.NEW_OUTGOING_CALL")) { 
      savedNumber = intent.getExtras().getString("android.intent.extra.PHONE_NUMBER"); 
     } 
     else{ 
      String stateStr = intent.getExtras().getString(TelephonyManager.EXTRA_STATE); 
      String number = intent.getExtras().getString(TelephonyManager.EXTRA_INCOMING_NUMBER); 
      int state = 0; 
      if(stateStr.equals(TelephonyManager.EXTRA_STATE_IDLE)){ 
       state = TelephonyManager.CALL_STATE_IDLE; 
      } 
      else if(stateStr.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)){ 
       state = TelephonyManager.CALL_STATE_OFFHOOK; 
      } 
      else if(stateStr.equals(TelephonyManager.EXTRA_STATE_RINGING)){ 
       state = TelephonyManager.CALL_STATE_RINGING; 
      } 


      onCallStateChanged(context, state, number); 
     } 
    } 

    //Derived classes should override these to respond to specific events of interest 
    protected abstract void onIncomingCallReceived(Context ctx, String number, Date start); 
    protected abstract void onIncomingCallAnswered(Context ctx, String number, Date start); 
    protected abstract void onIncomingCallEnded(Context ctx, String number, Date start, Date end); 

    protected abstract void onOutgoingCallStarted(Context ctx, String number, Date start);  
    protected abstract void onOutgoingCallEnded(Context ctx, String number, Date start, Date end); 

    protected abstract void onMissedCall(Context ctx, String number, Date start); 

    //Deals with actual events 

    //Incoming call- goes from IDLE to RINGING when it rings, to OFFHOOK when it's answered, to IDLE when its hung up 
    //Outgoing call- goes from IDLE to OFFHOOK when it dials out, to IDLE when hung up 
    public void onCallStateChanged(Context context, int state, String number) { 
     if(lastState == state){ 
      //No change, debounce extras 
      return; 
     } 
     switch (state) { 
      case TelephonyManager.CALL_STATE_RINGING: 
       isIncoming = true; 
       callStartTime = new Date(); 
       savedNumber = number; 
       onIncomingCallReceived(context, number, callStartTime); 
       break; 
      case TelephonyManager.CALL_STATE_OFFHOOK: 
       //Transition of ringing->offhook are pickups of incoming calls. Nothing done on them 
       if(lastState != TelephonyManager.CALL_STATE_RINGING){ 
        isIncoming = false; 
        callStartTime = new Date(); 
        onOutgoingCallStarted(context, savedNumber, callStartTime);      
       } 
       else 
       { 
        isIncoming = true; 
        callStartTime = new Date(); 
        onIncomingCallAnswered(context, savedNumber, callStartTime); 
       } 

       break; 
      case TelephonyManager.CALL_STATE_IDLE: 
       //Went to idle- this is the end of a call. What type depends on previous state(s) 
       if(lastState == TelephonyManager.CALL_STATE_RINGING){ 
        //Ring but no pickup- a miss 
        onMissedCall(context, savedNumber, callStartTime); 
       } 
       else if(isIncoming){ 
        onIncomingCallEnded(context, savedNumber, callStartTime, new Date());      
       } 
       else{ 
        onOutgoingCallEnded(context, savedNumber, callStartTime, new Date());            
       } 
       break; 
     } 
     lastState = state; 
    } 
} 

이 그것을 사용하는

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

<!--This part is inside the application--> 
    <receiver android:name=".CallReceiver" > 
     <intent-filter> 
      <action android:name="android.intent.action.PHONE_STATE" /> 
     </intent-filter> 
     <intent-filter> 
      <action android:name="android.intent.action.NEW_OUTGOING_CALL" /> 
     </intent-filter> 
    </receiver> 

내 기본 재사용 통화 검출기, 단순히 그것에서 클래스를 파생하고 몇 가지 간단한 기능을 구현 어떤 관심 전화 유형이든 상관 없습니다.

public class CallReceiver extends PhonecallReceiver { 

    @Override 
    protected abstract void onIncomingCallReceived(Context ctx, String number, Date start) 
    { 
     // 
    } 

    @Override 
    protected abstract void onIncomingCallAnswered(Context ctx, String number, Date start) 
    { 
     // 
    } 

    @Override 
    protected abstract void onIncomingCallEnded(Context ctx, String number, Date start, Date end) 
    { 
     // 
    } 

    @Override 
    protected abstract void onOutgoingCallStarted(Context ctx, String number, Date start) 
    { 
     // 
    } 

    @Override 
    protected abstract void onOutgoingCallEnded(Context ctx, String number, Date start, Date end) 
    { 
     // 
    } 

    @Override 
    protected abstract void onMissedCall(Context ctx, String number, Date start) 
    { 
     // 
    } 

} 

또는

private MyPhoneStateListener phoneStateListener = new MyPhoneStateListener(); 

TelephonyManager telephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); 
telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE); 

등록 및 등록 해제

TelephonyManager telephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); 
telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE); 
+0

을 전화를 잡기 위해 어떤 의도로 볼 : 이름 = " .CallReceiver "> .CallReceiver는 '기호 .CallReceiver'를 해결할 수 없습니다. –

+0