Ответ 1
Используйте PhoneStateListener
. Он имеет обработчик onCallStateChanged
; один из приведенных аргументов, который вы получите, - это String
, содержащий входящий номер телефона.
Я хотел бы получить входящий звонок phonenumber и сделать с ним что-то вроде do в http://blog.whitepages.com/2009/02/27/caller-id-by-whitepages-a-new-android-app-that-puts-telemarketers-on-alert/
Не могли бы вы помочь мне, потому что я не могу найти никакой информации об этом. Где я начинаю и как я могу получить номер телефона?
Итак, теперь мой код выглядит ниже. Когда я помещаю вызов, CustomBroadcastReceiver ловит его, и сообщение журнала распечатывается. Я могу получить номер телефона из комплекта. Но! Я не могу заставить hte CustomPhoneStateListener работать. Как вы можете видеть, я зарегистрировал свой прослушиватель customPhoneState для получателя, но сообщение журнала никогда не распечатывается из класса CustomPhoneStateListener. Что я здесь пропажу? Правильно ли я считаю?
<receiver android:name=".CustomBroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
</receiver>
</application>
<uses-sdk android:minSdkVersion="5" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
public class CustomPhoneStateListener extends PhoneStateListener {
private static final String TAG = "CustomPhoneStateListener";
public void onCallStateChange(int state, String incomingNumber){
Log.v(TAG, "WE ARE INSIDE!!!!!!!!!!!");
Log.v(TAG, incomingNumber);
switch(state){
case TelephonyManager.CALL_STATE_RINGING:
Log.d(TAG, "RINGING");
break;
}
}
public class CustomBroadcastReceiver extends BroadcastReceiver {
private static final String TAG = "CustomBroadcastReceiver";
@Override
public void onReceive(Context context, Intent intent) {
Log.v(TAG, "WE ARE INSIDE!!!!!!!!!!!");
TelephonyManager telephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
CustomPhoneStateListener customPhoneListener = new CustomPhoneStateListener();
telephony.listen(customPhoneListener, PhoneStateListener.LISTEN_CALL_STATE);
Bundle bundle = intent.getExtras();
String phoneNr= bundle.getString("incoming_number");
Log.v(TAG, "phoneNr: "+phoneNr);
}
Используйте PhoneStateListener
. Он имеет обработчик onCallStateChanged
; один из приведенных аргументов, который вы получите, - это String
, содержащий входящий номер телефона.
Вот реализация, которая позволит вам получить номер телефона, если он является входящим телефонным звонком как входящий номер, а также при завершении вызова - обратите внимание на код обработчика().
private class PhoneCallListener extends PhoneStateListener {
private boolean isPhoneCalling = false;
@Override
public void onCallStateChanged(int state, String incomingNumber) {
if (TelephonyManager.CALL_STATE_RINGING == state) {
// phone ringing
Log.i(LOG_TAG, "RINGING, number: " + incomingNumber);
}
if (TelephonyManager.CALL_STATE_OFFHOOK == state) {
// active
Log.i(LOG_TAG, "OFFHOOK");
isPhoneCalling = true;
}
if (TelephonyManager.CALL_STATE_IDLE == state) {
// run when class initial and phone call ended, need detect flag
// from CALL_STATE_OFFHOOK
Log.i(LOG_TAG, "IDLE number");
if (isPhoneCalling) {
Handler handler = new Handler();
//Put in delay because call log is not updated immediately when state changed
// The dialler takes a little bit of time to write to it 500ms seems to be enough
handler.postDelayed(new Runnable() {
@Override
public void run() {
// get start of cursor
Log.i("CallLogDetailsActivity", "Getting Log activity...");
String[] projection = new String[]{Calls.NUMBER};
Cursor cur = getContentResolver().query(Calls.CONTENT_URI, projection, null, null, Calls.DATE +" desc");
cur.moveToFirst();
String lastCallnumber = cur.getString(0);
}
},500);
isPhoneCalling = false;
}
}
}
}
Затем добавьте и инициализируйте слушателя в коде onCreate или onStartCommand:
PhoneCallListener phoneListener = new PhoneCallListener();
TelephonyManager telephonyManager = (TelephonyManager) this
.getSystemService(Context.TELEPHONY_SERVICE);
telephonyManager.listen(phoneListener,
PhoneStateListener.LISTEN_CALL_STATE);
Ваш переопределенный метод в CustomPhoneStateListener
должен называться onCallStateChanged()
(а не onCallStateChange()
).
Это было бы замечено компилятором Java, если бы у вас была аннотация @Override
, как у вас есть для onReceive()
.