电话和PhoneStateListener

时间:2018-07-26 20:38:35

标签: android

我参加Telephony的活动很少,并且在装有Android Nougat 7.0的智能手机上进行了测试。

当我在logcat中执行时什么都没改变,“应用程序无法运行”,并且我在清单中拥有必要的权限。

您能帮助我了解问题所在以及如何解决吗?

<uses-feature android:name="android.hardware.telephony"
    android:required="true" />
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

下面是我使用的代码:

public  class MainActivity extends AppCompatActivity{

    protected String TAG="Telephony";
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        PhoneStateListener stateListener= new PhoneStateListener(){
            @Override
            public void onCallStateChanged(int state, String incomingNumber) {
                switch (state){
                    case TelephonyManager.CALL_STATE_IDLE :
                        Log.d(TAG, "Pas d'appel: ");
                        break;
                    case  TelephonyManager.CALL_STATE_OFFHOOK:
                        Log.d(TAG, "Il y a une communication téléphonique en cours");
                        break;
                        case  TelephonyManager.CALL_STATE_RINGING:
                            Log.d(TAG, "Le téléphone sonne, l'appelant est " + incomingNumber);
                            break;
                            default:
                                Log.d(TAG, "Etat inconnu");
                }
                super.onCallStateChanged(state, incomingNumber);
            }
        };

        TelephonyManager manager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

        assert manager != null;
        manager.listen(new PhoneStateListener(),PhoneStateListener.LISTEN_CALL_STATE);

    }
}

2 个答案:

答案 0 :(得分:0)

您需要创建一个扩展BroadcastReceiver的类,并在您的Activity或清单文件中将该类注册为BroadcastReceiver。

public class ServiceReceiver extends BroadcastReceiver{

protected String TAG="Telephony";

public ServiceReceiver() {
}

PhoneStateListener stateListener= new PhoneStateListener(){

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

    Log.d("STATE", "" + state);
    Log.d("INCOMING_NUMBER", incomingNumber);

        switch (state){
            case TelephonyManager.CALL_STATE_IDLE :
                Log.d(TAG, "Pas d'appel: ");
                break;
            case  TelephonyManager.CALL_STATE_OFFHOOK:
                Log.d(TAG, "Il y a une communication téléphonique en cours");
                break;
                case  TelephonyManager.CALL_STATE_RINGING:
                    Log.d(TAG, "Le téléphone sonne, l'appelant est " + incomingNumber);
                    break;
                    default:
                        Log.d(TAG, "Etat inconnu");
        }
    }
};

public PhoneStateListener getPhoneStateListener() {
    return phoneStateListener;
}

}

将此代码放在您的MainActivity中。

public  class MainActivity extends AppCompatActivity{

private IntentFilter intentFilter;
private ServiceReceiver myCallReceiver;
private TelephonyManager manager;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

myCallReceiver = new ServiceReceiver();
manager = (TelephonyManager)mContext.getSystemService(Context.TELEPHONY_SERVICE);
intentFilter = new IntentFilter();
intentFilter.addAction("android.intent.action.PHONE_STATE");

getApplicationContext.registerReceiver(myCallReceiver, intentFilter);

manager.listen(myCallReceiver.getPhoneStateListener(), PhoneStateListener.LISTEN_CALL_STATE);

}

答案 1 :(得分:0)

您的电话管理器不会监听您创建的PhoneStateListener。如下更改代码:

从此:

manager.listen(new PhoneStateListener(),PhoneStateListener.LISTEN_CALL_STATE);

对此:

manager.listen(stateListener,PhoneStateListener.LISTEN_CALL_STATE);