TelephonyManager(pengurus telefon)
Pengenalan kepada bahagian ini:
Bab ini ialah bab terakhir tutorial pengenalan Android asas terutamanya menerangkan beberapa mata pengetahuan yang tersebar dan beberapa peninggalan. Untuk menambah mata pengetahuan, mata pengetahuan bertaburan ini termasuk penggunaan pelbagai perkhidmatan sistem, seperti pengurus telefon dan pengurus SMS dalam bahagian ini. Penggetar, jam penggera, kertas dinding, dsb., penderia dan seumpamanya! Ia huru-hara dan segala-galanya! Okay, apa yang akan kita pelajari dalam bahagian ini Ia adalah TelephonyManager, seperti namanya: digunakan untuk mengurus status panggilan telefon mudah alih, mendapatkan maklumat telefon (maklumat peranti, maklumat kad sim dan Maklumat rangkaian), dengar status telefon (status perkhidmatan status panggilan, status kekuatan isyarat, dll.) dan boleh menghubungi pendail telefon untuk membuat panggilan! Tanpa berlengah lagi, mari mulakan bahagian ini~
API Rasmi:TelephonyManager
1. Dapatkan objek perkhidmatan TelephonyManager
TelephonyManager tManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
2. Contoh penggunaan
1) Panggil pendail untuk menghubungi dialer. nombor telefon
Uri uri=Uri.parse("tel:"+电话号码); Intent intent=new Intent(Intent.ACTION_DIAL,uri); startActivity(intent);
2) Dapatkan maklumat kad Sim dan maklumat rangkaian
Menjalankan rendering:
Kod pelaksanaan :
Fail reka letak: activity_main.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="5dp" tools:context=".MainActivity"> <TextView android:id="@+id/tv_phone1" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="20sp" /> <TextView android:id="@+id/tv_phone2" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="20sp" /> <TextView android:id="@+id/tv_phone3" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="20sp" /> <TextView android:id="@+id/tv_phone4" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="20sp" /> <TextView android:id="@+id/tv_phone5" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="20sp" /> <TextView android:id="@+id/tv_phone6" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="20sp" /> <TextView android:id="@+id/tv_phone7" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="20sp" /> <TextView android:id="@+id/tv_phone8" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="16sp" /> <TextView android:id="@+id/tv_phone9" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="20sp" /></LinearLayout>
MainActivity.java:
rreeBy the way, jangan lupa untuk menambah kebenaran dalam AndroidManifest.xml!
public class MainActivity extends AppCompatActivity { private TextView tv_phone1; private TextView tv_phone2; private TextView tv_phone3; private TextView tv_phone4; private TextView tv_phone5; private TextView tv_phone6; private TextView tv_phone7; private TextView tv_phone8; private TextView tv_phone9; private TelephonyManager tManager; private String[] phoneType = {"未知","2G","3G","4G"}; private String[] simState = {"状态未知","无SIM卡","被PIN加锁","被PUK加锁", "被NetWork PIN加锁","已准备好"}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //①获得系统提供的TelphonyManager对象的实例 tManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); bindViews(); } private void bindViews() { tv_phone1 = (TextView) findViewById(R.id.tv_phone1); tv_phone2 = (TextView) findViewById(R.id.tv_phone2); tv_phone3 = (TextView) findViewById(R.id.tv_phone3); tv_phone4 = (TextView) findViewById(R.id.tv_phone4); tv_phone5 = (TextView) findViewById(R.id.tv_phone5); tv_phone6 = (TextView) findViewById(R.id.tv_phone6); tv_phone7 = (TextView) findViewById(R.id.tv_phone7); tv_phone8 = (TextView) findViewById(R.id.tv_phone8); tv_phone9 = (TextView) findViewById(R.id.tv_phone9); tv_phone1.setText("设备编号:" + tManager.getDeviceId()); tv_phone2.setText("软件版本:" + (tManager.getDeviceSoftwareVersion()!= null? tManager.getDeviceSoftwareVersion():"未知")); tv_phone3.setText("运营商代号:" + tManager.getNetworkOperator()); tv_phone4.setText("运营商名称:" + tManager.getNetworkOperatorName()); tv_phone5.setText("网络类型:" + phoneType[tManager.getPhoneType()]); tv_phone6.setText("设备当前位置:" + (tManager.getCellLocation() != null ? tManager .getCellLocation().toString() : "未知位置")); tv_phone7.setText("SIM卡的国别:" + tManager.getSimCountryIso()); tv_phone8.setText("SIM卡序列号:" + tManager.getSimSerialNumber()); tv_phone9.setText("SIM卡状态:" + simState[tManager.getSimState()]); } }
Dengan cara ini, mungkin anda ingin mendapatkan standard rangkaian dan bukannya 2G, 3G, 4G biasa, sebenarnya, kita boleh pergi ke kod sumber kelas TelephonyManager:
Kita boleh menilai standard rangkaian yang berbeza berdasarkan nilai networkType ini, contohnya, jika networkType == 1 Yang itu ialah GPRS~ dan nilai networkType ini boleh diperolehi melalui
, iaitu kaedah getNetworkType()! Okay, semudah itu Anda boleh menyenaraikan tatasusunan seperti di atas dan kemudian gunakan Subskrip yang berbeza menunjukkan nilai yang berbeza! By the way, terdapat juga status kad Sim dan nilai dalam tatasusunan rentetan, yang boleh dilihat dalam kod sumber:
Lain-lain boleh diterokai sendiri~
3) Dapatkan kekuatan isyarat telefon bimbit
Unit kekuatan isyarat rangkaian ialah dBm (milliwatt desibel), yang biasanya dinyatakan sebagai nombor negatif. Julat isyarat telefon mudah alih biasa ialah dari -110dBm Antara (lemah) dan -50dBm (baik), jika ia lebih kecil daripada -50dBm, ini bermakna anda berdiri berhampiran stesen pangkalan, seperti paparan n5 saya Kekuatan isyarat ialah -51dBm, kadangkala -59dBm, kerana Bangunan Nansoft bersebelahan, dan terdapat stesen pangkalan di atas...
Selain itu, cara untuk mendapatkan kekuatan isyarat dalam 2G, 3G dan 4G adalah dengan mengatasi PhoneStateListener's onSignalStrengthsChanged() Kaedah, peristiwa ini akan dicetuskan apabila kekuatan isyarat berubah Kita boleh mendapatkan kekuatan isyarat dalam acara ini!
Contoh kod untuk mendapatkan kekuatan isyarat pada telefon bimbit:
dBm =-113+2*asuIni ialah formula tetap , asu( Unit isyarat bebas)
Penyampaian operasi:
Kod pelaksanaan:
MainActivity.java:
<!-- 添加访问手机位置的权限 --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <!-- 添加访问手机状态的权限 --> <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
Selain itu, kerana kad pengarang semuanya adalah kad mudah alih, saya tidak tahu tentang China Unicom dan Telecom, tetapi saya melihat beberapa API seperti ini dari kod sumber:
- getEvdoDbm(): China Telecom 3G
- getCdmaDbm(): China Unicom 3G
- getLteDbm(): 4G
Ini seharusnya dapat memperoleh kekuatan isyarat dBm secara langsung Jika anda mempunyai syarat, anda boleh mencubanya~
Juga , jangan lupa tambah kebenaran!
public class MainActivity extends AppCompatActivity { private TextView tv_rssi; private MyPhoneStateListener mpsListener; private TelephonyManager tManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tManager = ((TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE)); tv_rssi = (TextView) findViewById(R.id.tv_rssi); mpsListener = new MyPhoneStateListener(); tManager.listen(mpsListener,290); } private class MyPhoneStateListener extends PhoneStateListener { private int asu = 0,lastSignal = 0; @Override public void onSignalStrengthsChanged(SignalStrength signalStrength) { asu = signalStrength.getGsmSignalStrength(); lastSignal = -113 + 2 * asu; tv_rssi.setText("当前手机的信号强度:" + lastSignal + " dBm" ); super.onSignalStrengthsChanged(signalStrength); } } }
4) Pantau semua panggilan masuk pada telefon mudah alih anda
Untuk hasil rekod panggilan yang dipantau, anda boleh mendapatkannya dengan cara yang berbeza Apa yang digunakan di sini adalah untuk Rekod ditulis ke dalam fail, Dan anda juga boleh menghantarnya kepada anda dalam bentuk mesej teks, atau memuat naiknya ke platform tertentu Sudah tentu, jika tidak banyak rekod komunikasi, anda juga boleh menggunakan mesej teks. Jika ada lebih banyak lagi, mudah untuk orang lain temui! Di samping itu, Aktiviti digunakan di sini dan bukannya Perkhidmatan, yang bermaksud untuk membuka Aktiviti ini, Hanya selepas itu kita boleh memantau Biasanya keperluan kita mesti dijalankan secara rahsia di latar belakang Kerana kekangan masa, kita tidak akan menulis Perkhidmatan tersebut Anda boleh mengubah suainya sendiri dan biarkan Perkhidmatan bermula dengan but!
Analisis kod:
Ia sangat mudah, ia sebenarnya hanya penulisan semula of TelephonyManager Pendengar status panggilanPhoneStateListener kemudian memanggil kaedah TelephonyManager.listen() untuk mendengar apabila panggilan datang, Program ini akan merekodkan nombor pemanggil ke fail!
Kod pelaksanaan:
MainActivity.java:
<!-- 添加访问手机状态的权限 --> <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
Hasil berjalan:
Perhatian! Pastikan program ini berada di latar depan! Kami boleh melihat fail phoneList dalam direktori fail yang sepadan dengan nama pakej Kami boleh mengeksportnya ke komputer dan membukanya Anggaran kandungan fail adalah seperti berikut:
THR 30 Okt 12:05: 48 GMT 2014 Panggilan: 137xxxxxxx
By the way, jangan lupa kebenaran!
public class MainActivity extends Activity { TelephonyManager tManager; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 取得TelephonyManager对象 tManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); // 创建一个通话状态监听器 PhoneStateListener listener = new PhoneStateListener() { @Override public void onCallStateChanged(int state, String number) { switch (state) { // 无任何状态 case TelephonyManager.CALL_STATE_IDLE: break; case TelephonyManager.CALL_STATE_OFFHOOK: break; // 来电铃响时 case TelephonyManager.CALL_STATE_RINGING: OutputStream os = null; try { os = openFileOutput("phoneList", MODE_APPEND); } catch (FileNotFoundException e) { e.printStackTrace(); } PrintStream ps = new PrintStream(os); // 将来电号码记录到文件中 ps.println(new Date() + " 来电:" + number); ps.close(); break; default: break; } super.onCallStateChanged(state, number); } }; // 监听电话通话状态的改变 tManager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE); } }
5) Panggilan senarai hitam ditamatkan secara automatik
Juga , versi Cina bagi atribut dan kaedah yang berkaitan boleh dilihat:Senarai hitam yang dipanggil ialah menambah beberapa nombor telefon pada koleksi Apabila telefon bimbit menerima panggilan ini Just tutup telefon! Tetapi Android tidak memberikan kami API untuk menutup telefon, jadi kami perlu memanggil API dalam perkhidmatan melalui AIDL. Tutup telefon!
Jadi langkah pertama ialah menyalin dua fail berikut dalam kod sumber android ke lokasi yang sepadan di bawah src. Untuk membuat pakej yang sepadan! Hanya letakkan fail aidl di bawah pakej di atas!!! Kemudian anda hanya perlu menghubungi endCall ITelephony untuk menutup panggilan! masuk pada masa ini perkataan; Ia akan menutup terus Kod ini agak mudah Tampalkannya di bawah Kerana simulator yang digunakan ialah Genymotion, saya tidak akan menunjukkannya. Tangkapan skrin selepas program berjalan!
MainActivity.java:
Kebenaran, kebenaran, kebenaran<!-- 授予该应用读取通话状态的权限 --> <uses-permission android:name="android.permission.READ_PHONE_STATE"/>:
public class MainActivity extends Activity { private TelephonyManager tManager; private PhoneStateListener pListener; private String number; private EditText locknum; private Button btnlock; public class PhonecallListener extends PhoneStateListener { @Override public void onCallStateChanged(int state, String incomingNumber) { switch(state) { case TelephonyManager.CALL_STATE_IDLE:break; case TelephonyManager.CALL_STATE_OFFHOOK:break; //当有电话拨入时 case TelephonyManager.CALL_STATE_RINGING: if(isBlock(incomingNumber)) { try { Method method = Class.forName("android.os.ServiceManager") .getMethod("getService", String.class); // 获取远程TELEPHONY_SERVICE的IBinder对象的代理 IBinder binder = (IBinder) method.invoke(null, new Object[] { TELEPHONY_SERVICE }); // 将IBinder对象的代理转换为ITelephony对象 ITelephony telephony = ITelephony.Stub.asInterface(binder); // 挂断电话 telephony.endCall(); }catch(Exception e){e.printStackTrace();} } break; } super.onCallStateChanged(state, incomingNumber); } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); locknum = (EditText) findViewById(R.id.locknum); btnlock = (Button) findViewById(R.id.btnlock); //获取系统的TelephonyManager管理器 tManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); pListener = new PhoneStateListener(); tManager.listen(pListener, PhoneStateListener.LISTEN_CALL_STATE); btnlock.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { number = locknum.getText().toString(); } }); } public boolean isBlock(String phone) { if(phone.equals(number))return true; return false; } }
API berkaitan maklumat telefon Android
3 Muat turun kod sampel dalam bahagian ini
TelephonyManagerDemo.zip