Saya mencoba membuat aplikasi seperti, ketika ada panggilan ke telepon saya ingin mendeteksi nomornya. Di bawah ini adalah yang saya coba, tetapi tidak mendeteksi panggilan masuk.
Saya ingin menjalankan MainActivity
latar belakang saya , bagaimana saya bisa melakukan itu?
Saya telah memberikan izin dalam manifest
file.
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
Apakah ada hal lain yang harus saya berikan dalam manifes?
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test_layout);
}
public class myPhoneStateChangeListener extends PhoneStateListener {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
if (state == TelephonyManager.CALL_STATE_RINGING) {
String phoneNumber = incomingNumber;
}
}
}
}
Jawaban:
Inilah yang saya gunakan untuk melakukan ini:
Nyata:
Detektor panggilan reusable base saya
Kemudian untuk menggunakannya, cukup ambil kelas darinya dan terapkan beberapa fungsi mudah, yang jenis panggilan apa pun yang Anda pedulikan:
Selain itu Anda dapat melihat Langgan yang saya lakukan pada mengapa kode itu seperti itu di blog saya . Tautan intisari: https://gist.github.com/ftvs/e61ccb039f511eb288ee
EDIT: Diperbarui ke kode yang lebih sederhana, karena saya telah mengerjakan ulang kelas untuk saya gunakan sendiri
sumber
lastState
seharusnya tidak diinisialisasi keCALL_STATE_IDLE
. Saya kehilangan beberapa panggilan saat aplikasi saya terbunuh saat keadaan saat iniRINGING
. Karena ketika menjadiIDLE
lagi pada panggilan berakhir, variabel statis diinisialisasi ulang keCALL_STATE_IDLE
dan itu melakukan debounces tidak melakukan apa pun. Jadi kami kehilangan referensilastState
.mendaftar
dan untuk membatalkan registrasi
sumber
Dengan Android P - Api Level 28: Anda harus mendapatkan izin READ_CALL_LOG
Akses terbatas ke log panggilan
Android P bergerak
CALL_LOG
,READ_CALL_LOG
,WRITE_CALL_LOG
, danPROCESS_OUTGOING_CALLS
izin dariPHONE
kelompok izin ke yang baruCALL_LOG
kelompok izin. Grup ini memberi pengguna kontrol dan visibilitas yang lebih baik ke aplikasi yang membutuhkan akses ke informasi sensitif tentang panggilan telepon, seperti membaca catatan panggilan telepon dan mengidentifikasi nomor telepon.Untuk membaca angka dari tindakan niat PHONE_STATE, Anda memerlukan
READ_CALL_LOG
izin danREAD_PHONE_STATE
izin . Untuk membaca angkaonCallStateChanged()
, Anda sekarang hanya perluREAD_CALL_LOG
izin. Anda tidak lagi memerlukanREAD_PHONE_STATE
izin.sumber
READ_CALL_LOG
dalamAndroidManifest.xml
fokus pada menambahkan permintaan izin diMainActivity
.PEMBARUAN: Kode yang sangat luar biasa yang diposting oleh Gabe Sechan tidak lagi berfungsi kecuali jika Anda secara eksplisit meminta pengguna untuk memberikan izin yang diperlukan. Berikut adalah beberapa kode yang dapat Anda tempatkan dalam aktivitas utama Anda untuk meminta izin ini:
JUGA: Seperti seseorang yang disebutkan dalam komentar di bawah posting Gabe , Anda harus menambahkan sedikit cuplikan kode
android:enabled="true
,, ke penerima untuk mendeteksi panggilan masuk saat aplikasi saat ini tidak berjalan di latar depan:sumber
ini dapat membantu Anda dan juga menambahkan memerlukan izin
sumber
Hanya untuk memperbarui jawaban Gabe Sechan. Jika manifes Anda meminta izin untuk READ_CALL_LOG dan READ_PHONE_STATE, onReceive akan disebut TWICE . Salah satunya memiliki EXTRA_INCOMING_NUMBER di dalamnya dan yang lainnya tidak. Anda harus menguji yang memilikinya dan dapat terjadi dalam urutan apa pun.
https://developer.android.com/reference/android/telephony/TelephonyManager.html#ACTION_PHONE_STATE_CHANGED
sumber
Berikut adalah metode sederhana yang dapat menghindari penggunaan
PhonestateListener
dan komplikasi lainnya.Jadi di sini kita menerima 3 acara dari android seperti
RINGING
,OFFHOOK
danIDLE
. Dan untuk mendapatkan semua negara yang mungkin panggilan, kita perlu mendefinisikan negara kita sendiri sepertiRINGING
,OFFHOOK
,IDLE
,FIRST_CALL_RINGING
,SECOND_CALL_RINGING
. Itu dapat menangani setiap negara bagian dalam panggilan telepon.Harap pikirkan cara kami menerima acara dari android dan kami akan menentukan status panggilan kami. Lihat kodenya.
sumber
@ Gabe Sechan, terima kasih untuk kode Anda. Ini berfungsi dengan baik kecuali
onOutgoingCallEnded()
. Itu tidak pernah dieksekusi. Ponsel penguji adalah Samsung S5 & Trendy. Ada 2 bug saya pikir.1: sepasang tanda kurung tidak ada.
2:
lastState
tidak diperbarui olehstate
jika berada di akhir fungsi. Itu harus diganti ke baris pertama dari fungsi ini denganTambahan saya telah memasukkan
lastState
dansavedNumber
ke preferensi bersama seperti yang Anda sarankan.Baru saja mengujinya dengan perubahan di atas. Bug diperbaiki setidaknya di ponsel saya.
sumber
Silakan gunakan kode di bawah ini. Ini akan membantu Anda mendapatkan nomor yang masuk dengan detail panggilan lainnya.
activity_main.xml
MainActivity.java
dan dalam permintaan nyata Anda untuk izin berikut:
sumber
Anda memerlukan BroadcastReceiver untuk
ACTION_PHONE_STATE_CHANGED
Ini akan memanggil Anda diterima setiap kali keadaan telepon berubah dari idle, dering, lepas kendali jadi dari nilai sebelumnya dan nilai baru Anda dapat mendeteksi jika ini adalah panggilan masuk / keluar.Izin yang diperlukan adalah:
Tetapi jika Anda juga ingin menerima EXTRA_INCOMING_NUMBER dalam siaran itu, Anda akan memerlukan izin lain: "android.permission.READ_CALL_LOG"
Dan kodenya kira-kira seperti ini:
dan di kelas penerima, kita bisa mendapatkan status saat ini dengan membaca maksud seperti ini:
hasil ekstra dapat berupa:
Dengan siaran PHONE_STATE, kami tidak perlu menggunakan izin PROCESS_OUTGOING_CALLS atau menghentikan tindakan NEW_OUTGOING_CALL.
sumber