Das Abrufen der eingehenden Nummer mit BroadcastReceiver hat nicht sehr gut funktioniert, daher schreibe ich eine Lösung.
Ich möchte die Nummer erhalten, die ich erhalten habe, als ich einen Anruf erhalten habe.
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.
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 **.
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>
Selbst mit Android10 konnte ich die Telefonnummer richtig bekommen!
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