[JAVA] Ein Memo beim Abrufen der eingehenden Nummer mit Broadcast Receiver unter Android 9/10 funktioniert nicht

Das Abrufen der eingehenden Nummer mit BroadcastReceiver hat nicht sehr gut funktioniert, daher schreibe ich eine Lösung.

: checkedered_flag: was du machen willst

Ich möchte die Nummer erhalten, die ich erhalten habe, als ich einen Anruf erhalten habe.

: bleistift2: Empfänger, um den Telefonstatus zu erhalten

Zuerst habe ich mit dem gut geschriebenen Code gesucht und versucht.

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);

        //Listener-Einstellungen
        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:      //Standby (am Ende)
                    Toast.makeText(MainActivity.this, "Anruf beenden\nCALL_STATE_IDLE", Toast.LENGTH_SHORT).show();
                    break;
                case TelephonyManager.CALL_STATE_RINGING:   //Eingehender Anruf*
                    if(callNumber==null){
                        callNumber="";
                    }
                    Toast.makeText(MainActivity.this, "Eingehender Anruf\nCALL_STATE_RINGING: " + callNumber, Toast.LENGTH_SHORT).show();
                    callinfo.setText("Eingehender Anruf:"+callNumber);
                    break;
                case TelephonyManager.CALL_STATE_OFFHOOK:   //Anruf
                    Toast.makeText(MainActivity.this, "reden\nCALL_STATE_OFFHOOK", Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    };

Wenn ich diesen Code auf dem Android 10-Emulator ausführe, sieht er wie das Bild aus und ich kann den Telefonstatus abrufen, aber aus irgendeinem Grund kann ich die Telefonnummer nicht abrufen. 000035.png

: bulb: Ursache dafür, dass die Telefonnummer nicht abgerufen werden kann

Ab Android 9/10 (API-Level 28 oder höher) scheinen sich die Berechtigungen zum Abrufen einer Telefonnummer mit BroadcastReceiver geändert zu haben. Referenzseite: https://developer.android.com/about/versions/pie/android-9.0-changes-all?hl=ja#restrict-access-phone-numbers Dieses Mal verwenden wir onCallStateChanged (), um es abzurufen. Daher benötigen wir zusätzlich zu READ_PHONE_STATE (Telefon) ** die Berechtigung ** READ_CALL_LOG (Anrufliste) **.

Auf der Android-Entwickler-Website heißt es jedoch, dass keine READ_PHONE_STATE-Berechtigung erforderlich ist. Ohne READ_PHONE_STATE war es jedoch nicht möglich, die Telefonnummer in Android 9 und früheren Versionen abzurufen. (Ich habe es tatsächlich mit dem Emulator überprüft) ** Sie benötigen also zwei Berechtigungen, READ_PHONE_STATE und READ_CALL_LOG, um alle Versionen zu unterstützen **.

Überarbeitet

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: Ergebnis der Änderung der Berechtigung "Anrufliste"

Selbst mit Android10 konnte ich die Telefonnummer richtig bekommen! 000033.png

: chain: Referenzseite

Programm: https://storyboard.jp/blog/android_telmanager/

Wenn Sie einen anderen Status als eingehend, eingehend oder anrufend erhalten möchten, ist dies leicht zu verstehen, wenn Sie hier darauf verweisen. https://qiita.com/syukai/items/d4911590a001d401a028

Recommended Posts

Ein Memo beim Abrufen der eingehenden Nummer mit Broadcast Receiver unter Android 9/10 funktioniert nicht
[Ruby on Rails] Wenn die ID-Erfassung des Parameters nicht gut lief
Wenn das Formular wie "Auswählen von Materialisieren" nicht ordnungsgemäß funktioniert
Versuchen Sie, den Dienst auf Android Oreo zu verwenden
Funktioniert die Escape-Sequenz (\) nicht? (für Mac)
Memo beim Tappen und Entwickeln mit JavaFX
Wenn @Transactional of Spring Boot nicht funktioniert
Erkennt die Bibliothek bei der Implementierung von jcaptcha nicht
[Railways] Railways funktioniert nicht, wenn sich das RubyMine-Projektstammverzeichnis nicht im Rails-Stammverzeichnis befindet.
[Kotlin] Die auf Java basierende Mapping-Bibliothek funktioniert grundsätzlich nicht mit Kotlin.
[Android Studio] Über die Tatsache, dass die Entwurfsansicht bei Verwendung von TextClock nicht angezeigt wird
Ein Hinweis zu "Stellen Sie mit einem selbstsignierten Zertifikat mit Javas Keytool keinen Zertifikatfehler aus"
Im Warndialog beim Starten des Applets funktioniert die Prüfung "Beim nächsten Mal nicht anzeigen" nicht