web-dev-qa-db-fra.com

Comment mettre fin à un appel entrant par programme sur Android 8.0 Oreo

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_PHONEetAndroid.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_STATEest 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+

14
doerfli

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.

1
jyubin patel

Vous devez ajouter cette permission dans votre manifeste:

<uses-permission Android:name="Android.permission.MODIFY_PHONE_STATE"/>
0
Shivam Oberoi

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

0
canihazurcode

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