2017-01-12 16 views
1

私は、テスト目的でのみ家で使用されるアプリを開発しています。私はたくさんの検索をして、別の投稿に示唆されているように異なる提案を試みましたが、誰も私のために働いているようです。Android発信コールに応答した場合の検出方法

私は反射、アクセシビリティサービス、ルートまたは他のハッキングのような提案には公開されています。助けてください。あなたがマニフェスト

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

TelephonyManagerにこの権限が必要

よろしく

答えて

1

TRYのmanifest.xmlファイル内のすべての必要なパーミッションを設定します。これ

コール

public class PhoneListener extends PhoneStateListener { 

private static PhoneListener instance = null; 

/** 
* Must be called once on app startup 
* 
* @param context - application context 
* @return 
*/ 
public static PhoneListener getInstance(Context context) { 
    if (instance == null) { 
     instance = new PhoneListener(context); 
    } 
    return instance; 
} 

public static boolean hasInstance() { 
    return null != instance; 
} 

private final Context context; 
private CallLog phoneCall; 

private PhoneListener(Context context) { 
    this.context = context; 
} 

AtomicBoolean isRecording = new AtomicBoolean(); 
AtomicBoolean isWhitelisted = new AtomicBoolean(); 


/** 
* Set the outgoing phone number 
* <p/> 
* Called by {@link MyCallReceiver} since that is where the phone number is available in a outgoing call 
* 
* @param phoneNumber 
*/ 
public void setOutgoing(String phoneNumber) { 
    if (null == phoneCall) 
     phoneCall = new CallLog(); 
    phoneCall.setPhoneNumber(phoneNumber); 
    phoneCall.setOutgoing(); 
    // called here so as not to miss recording part of the conversation in TelephonyManager.CALL_STATE_OFFHOOK 
    isWhitelisted.set(Database.isWhitelisted(context, phoneCall.getPhoneNumber())); 
} 

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

    switch (state) { 
     case TelephonyManager.CALL_STATE_IDLE: // Idle... no call 
      if (isRecording.get()) { 
       RecordCallService.stopRecording(context); 
       phoneCall = null; 
       isRecording.set(false); 
      } 
      break; 
     case TelephonyManager.CALL_STATE_OFFHOOK: // Call answered 
      if (isWhitelisted.get()) { 
       isWhitelisted.set(false); 
       return; 
      } 
      if (!isRecording.get()) { 
       isRecording.set(true); 
       // start: Probably not ever usefull 
       if (null == phoneCall) 
        phoneCall = new CallLog(); 
       if (!incomingNumber.isEmpty()) { 
        phoneCall.setPhoneNumber(incomingNumber); 
       } 
       // end: Probably not ever usefull 
       RecordCallService.sartRecording(context, phoneCall); 
      } 
      break; 
     case TelephonyManager.CALL_STATE_RINGING: // Phone ringing 
      // DO NOT try RECORDING here! Leads to VERY poor quality recordings 
      // I think something is not fully settled with the Incoming phone call when we get CALL_STATE_RINGING 
      // a "SystemClock.sleep(1000);" in the code will allow the incoming call to stabilize and produce a good recording...(as proof of above) 
      if (null == phoneCall) 
       phoneCall = new CallLog(); 
      if (!incomingNumber.isEmpty()) { 
       phoneCall.setPhoneNumber(incomingNumber); 
       // called here so as not to miss recording part of the conversation in TelephonyManager.CALL_STATE_OFFHOOK 
       isWhitelisted.set(Database.isWhitelisted(context, phoneCall.getPhoneNumber())); 
      } 
      break; 
    } 

} 

サービス

でこのクラス}

そして、私はあなたがこのコードからいくつかの助けを得ることを願ってブロードキャストレシーバー

public class MyCallReceiver extends BroadcastReceiver { 

public MyCallReceiver() { 
} 

static TelephonyManager manager; 

@Override 
public void onReceive(Context context, Intent intent) { 
    Log.i("JLCreativeCallRecorder", "MyCallReceiver.onReceive "); 

    if (!AppPreferences.getInstance(context).isRecordingEnabled()) { 
     removeListener(); 
     return; 
    } 

    if (Intent.ACTION_NEW_OUTGOING_CALL.equals(intent.getAction())) { 
     if (!AppPreferences.getInstance(context).isRecordingOutgoingEnabled()) { 
      removeListener(); 
      return; 
     } 
     PhoneListener.getInstance(context).setOutgoing(intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER)); 
    } else { 
     if (!AppPreferences.getInstance(context).isRecordingIncomingEnabled()) { 
      removeListener(); 
      return; 
     } 
    } 

    // Start Listening to the call.... 
    if (null == manager) { 
     manager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 
    } 
    if (null != manager) 
     manager.listen(PhoneListener.getInstance(context), PhoneStateListener.LISTEN_CALL_STATE); 
} 

private void removeListener() { 
    if (null != manager) { 
     if (PhoneListener.hasInstance()) 
      manager.listen(PhoneListener.getInstance(null), PhoneStateListener.LISTEN_NONE); 
    } 
} 

}

を使用しています。あなたは、通話時間を検出するために、アクセシビリティイベントを使用することができますと発信コールが応答されているかどうかとはあなたが検出することができ

おかげ

+0

お手伝いをしていただきありがとうございますが、上記のコードでは**正確に**通話に応答したときはわかりません! –

+0

この問題は、デュアルsimまたはデバイスのphoneListenerが不足していることが原因である可能性があります。サムスンのデバイスでは、正常に動作します。 –

0

は、携帯電話の状態を取得するリスナーを持っています。電話が鳴っているか、通話中であるかを確認してください。

TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 
     PhoneStateListener callStateListener = new PhoneStateListener() { 

      public void onCallStateChanged(int state, String incomingNumber) { 
       // TODO React to a incoming call. 

       try { 
        if (state == TelephonyManager.CALL_STATE_RINGING) { 
         Toast.makeText(getApplicationContext(), "Phone Is Ringing" + incomingNumber, Toast.LENGTH_LONG).show(); 
         number = incomingNumber; 
         //g.setPhoneNo(incomingNumber); 
         AndroidNetCommunicationClientActivity.mMsgSendRequest("CommandMsgCallIncoming" + number); 
        } else if (state == TelephonyManager.CALL_STATE_OFFHOOK) { 
         Toast.makeText(getApplicationContext(), "Phone is Currently in A call" + incomingNumber, Toast.LENGTH_LONG).show(); 
         //number = mIntent.getStringExtra(Intent.EXTRA_PHONE_NUMBER); 
         number = incomingNumber; 


        } else if (state == TelephonyManager.DATA_DISCONNECTED) { 
         number = ""; 
         CallID = ""; 
        } 
       } catch (Exception e) { 
        // TODO Auto-generated catch block 
        //conn.MessageBox(MainActivity.this, e.getMessage()); 
        e.printStackTrace(); 
       } 
       super.onCallStateChanged(state, incomingNumber); 

      } 
     }; 
     telephonyManager.listen(callStateListener, PhoneStateListener.LISTEN_CALL_STATE); 
+0

番号をダイヤルするとすぐにCALL_STATE_OFFHOOKが呼び出されます。 –

1

..

私はあなたができる `Hereで詳細にそれに答えていますそれを確認します。

関連する問題