[JAVA] Un mémo lors de l'obtention du numéro entrant à l'aide de Broadcast Receiver sur Android 9/10 ne fonctionne pas

Obtenir le numéro entrant à l'aide de BroadcastReceiver ne fonctionnait pas très bien, je vais donc écrire une solution.

: checkedered_flag: ce que vous voulez faire

Je souhaite obtenir le numéro que j'ai reçu lorsque j'ai reçu un appel.

: crayon2: récepteur pour obtenir l'état du téléphone

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. 000035.png

: bulb: Cause de l'impossibilité d'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 **.

modifié

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>

: iphone: résultat du passage à l'autorisation "Historique des appels"

Même avec Android10, j'ai pu obtenir le numéro de téléphone correctement! 000033.png

: chaînes: site de référence

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

Un mémo lors de l'obtention du numéro entrant à l'aide de Broadcast Receiver sur Android 9/10 ne fonctionne pas
[Ruby on Rails] Lorsque l'acquisition de l'identifiant du paramètre ne s'est pas bien déroulée
Lorsque le formulaire tel que Select of Materialize ne fonctionne pas correctement
Essayez d'utiliser le service sur Android Oreo
La séquence d'échappement (\) ne fonctionne-t-elle pas? (pour Mac)
Mémo lors du tâtonnement et du développement à l'aide de JavaFX
Lorsque @Transactional of Spring Boot ne fonctionne pas
Ne reconnaît pas la bibliothèque lors de l'implémentation de jcaptcha
[Railways] Railways ne fonctionne pas lorsque la racine du projet RubyMine est différente du répertoire racine Rails.
[Kotlin] La bibliothèque de mappage basée sur la réflexion basée sur Java ne fonctionne fondamentalement pas avec Kotlin.
[Android Studio] À propos du fait que la vue de conception n'est pas affichée lors de l'utilisation de TextClock
Une note sur "Ne pas émettre une erreur de certificat avec un certificat auto-signé à l'aide de Keytool Java"
Dans la boîte de dialogue d'avertissement lors du démarrage de l'applet, la vérification de "Ne pas afficher de la prochaine fois" ne fonctionne pas