Obtenir le numéro entrant à l'aide de BroadcastReceiver ne fonctionnait pas très bien, je vais donc écrire une solution.
Je souhaite obtenir le numéro que j'ai reçu lorsque j'ai reçu un appel.
Tout d'abord, j'ai cherché et essayé avec le code bien écrit.
xml:Android.Manifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.callreceivetest">
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
MainActivity.java
TextView callinfo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
callinfo=findViewById(R.id.callinfo);
//Paramètres d'écoute
TelephonyManager telephonyManager = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
telephonyManager.listen(mListener, PhoneStateListener.LISTEN_CALL_STATE);
}
PhoneStateListener mListener = new PhoneStateListener(){
@Override
public void onCallStateChanged(int state, String callNumber) {
//Log.d(TAG, ":" + state+"-PhoneNumber:"+callNumber);
switch(state){
case TelephonyManager.CALL_STATE_IDLE: //Veille (à la fin)
Toast.makeText(MainActivity.this, "Fin d'appel\nCALL_STATE_IDLE", Toast.LENGTH_SHORT).show();
break;
case TelephonyManager.CALL_STATE_RINGING: //Appel entrant*
if(callNumber==null){
callNumber="";
}
Toast.makeText(MainActivity.this, "Appel entrant\nCALL_STATE_RINGING: " + callNumber, Toast.LENGTH_SHORT).show();
callinfo.setText("Appel entrant:"+callNumber);
break;
case TelephonyManager.CALL_STATE_OFFHOOK: //Appel
Toast.makeText(MainActivity.this, "parlant\nCALL_STATE_OFFHOOK", Toast.LENGTH_SHORT).show();
break;
}
}
};
Lorsque j'exécute ce code sur l'émulateur Android 10, il ressemble à l'image et je peux obtenir l'état du téléphone, mais pour une raison quelconque, je ne peux pas obtenir le numéro de téléphone.
Depuis Android 9/10 (niveau d'API 28 ou supérieur), il semble que les autorisations nécessaires pour obtenir un numéro de téléphone à l'aide de BroadcastReceiver aient changé. Site de référence: https://developer.android.com/about/versions/pie/android-9.0-changes-all?hl=ja#restrict-access-phone-numbers Cette fois, nous utiliserons onCallStateChanged () pour l'obtenir, nous avons donc besoin de l'autorisation ** READ_CALL_LOG (historique des appels) en plus de READ_PHONE_STATE (téléphone) **.
Cependant, le site des développeurs Android indique que "l'autorisation READ_PHONE_STATE n'est pas requise", mais sans READ_PHONE_STATE, il n'était pas possible d'obtenir le numéro de téléphone sous Android 9 et les versions antérieures. (Je l'ai vérifié avec l'émulateur) Ainsi, ** vous avez besoin de deux autorisations, READ_PHONE_STATE et READ_CALL_LOG, pour prendre en charge toutes les versions **.
xml:Android.Manifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.callreceivetest">
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_CALL_LOG"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Même avec Android10, j'ai pu obtenir le numéro de téléphone correctement!
Programme: https://storyboard.jp/blog/android_telmanager/
Si vous souhaitez obtenir un état autre que celui entrant, en cours d'appel ou en fin d'appel, il est facile à comprendre en vous référant ici. https://qiita.com/syukai/items/d4911590a001d401a028
Recommended Posts