Jusqu'à Android 7.1, il était possible de mettre fin à un appel entrant en utilisant la méthodeITelephony.endCall()
et en donnant les autorisations à votre applicationAndroid.permission.CALL_PHONE
etAndroid.permission.READ_PHONE_STATE
.
En faisant de même sur Android 8.0 Oreo (API 26)
, j'obtiens cette erreur
12-09 18: 11: 25.195 16833-16833/li.doerf.leavemealone E/TelephonyServiceCallHangup: permission manquante MODIFY_PHONE_STATE, ne peut pas raccrocher
PuisqueMODIFY_PHONE_STATE
est une autorisation protégée, mon application ne peut pas l'obtenir. Existe-t-il un moyen de terminer par programmation un appel entrant sur Android 8.0+
?
Veuillez vérifier ci-dessous le lien 2 qui vous est utile:
L'autorisation n'est accordée qu'à l'application système, dans Manifest
https://source.Android.com/devices/tech/config/perms-whitelist
le lien ci-dessus est utilisé pour mettre en liste blanche votre permission MODIFY_PHONE_STATE . C'est pour des raisons de sécurité, donc si vous souhaitez accéder à ce type de permission.
Je pense que selon la dernière mise à jour Android oreo, vous pouvez recevoir un appel téléphonique dans votre activité en utilisant une méthode intégrée, mais ceux-ci ne permettent pas au développeur de gérer la fin de l'appel .. permission de celui-ci . Je pense que ma description ci-dessus est suffisante pour comprendre
J'espère que vous comprenez et a fermé cette question.
Vous devez ajouter cette permission dans votre manifeste:
<uses-permission Android:name="Android.permission.MODIFY_PHONE_STATE"/>
Essayez d’utiliser la réflexion comme dans la réponse fournie ici .
Il fonctionne avec les autorisations READ_PHONE_STATE et CALL_PHONE. Ces autorisations sont disponibles pour les applications non-système, selon Documents Android
Il y a une solution que j'ai trouvée. Cela nécessite de s'inscrire en tant que NotificationListenerService, puis d'analyser les actions et d'envoyer les PendingIntents appropriés:
public class NotificationListener extends NotificationListenerService {
private static final String TAG = "NotificationListener";
private PendingIntent answerIntent;
private PendingIntent hangupIntent;
@Override
public void onNotificationPosted(StatusBarNotification sbn) {
String packageName = sbn.getPackageName();
if ("com.google.Android.dialer".equals(packageName)) {
Notification notification = sbn.getNotification();
for (Notification.Action action : notification.actions) {
String title = String.valueOf(action.title);
if ("hang up".equalsIgnoreCase(title) || "decline".equalsIgnoreCase(title)) {
hangupIntent = action.actionIntent;
} else if ("answer".equalsIgnoreCase(title)) {
answerIntent = action.actionIntent;
}
}
}
}
@Override
public void onListenerConnected() {
Log.i(TAG, "Listener connected");
for (StatusBarNotification sbn : getActiveNotifications()) {
onNotificationPosted(sbn);
}
}
public void answerCall() {
try {
answerIntent.send();
} catch (PendingIntent.CanceledException e) {
e.printStackTrace();
}
}
public void endCall() {
try {
hangupIntent.send();
} catch (PendingIntent.CanceledException e) {
e.printStackTrace();
}
}
}
Puis déclarez ce qui suit dans AndroidManifest.xml:
<service
Android:name=".NotificationListener"
Android:label="@string/app_name"
Android:permission="Android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
<intent-filter>
<action Android:name="Android.service.notification.NotificationListenerService" />
</intent-filter>
</service>
Il ne reste plus qu’une étape: l’utilisateur doit activer manuellement votre application en tant qu’écouteur de notifications. Vous pouvez présenter une boîte de dialogue avec des instructions, puis envoyer l'utilisateur à la page des paramètres à l'aide du code suivant:
Intent intent = new Intent(Android.provider.Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS);
startActivity(intent);