2 votes

Android : manière correcte de mettre fin à un appel dans la version 6.0

J'utilise le code suivant :

public void PhoneCallEnd(Context context) {

        try {
            // Get the boring old TelephonyManager
            TelephonyManager telephonyManager =
                    (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);

            // Get the getITelephony() method
            Class classTelephony = Class.forName(telephonyManager.getClass().getName());
            Method methodGetITelephony = classTelephony.getDeclaredMethod("getITelephony");

            // Ignore that the method is supposed to be private
            methodGetITelephony.setAccessible(true);

            // Invoke getITelephony() to get the ITelephony interface
            Object telephonyInterface = methodGetITelephony.invoke(telephonyManager);

            // Get the endCall method from ITelephony
            Class telephonyInterfaceClass = Class.forName(telephonyInterface.getClass().getName());

            Method methodEndCall = telephonyInterfaceClass.getDeclaredMethod("endCall");

            // Invoke endCall()
            methodEndCall.invoke(telephonyInterface);

        } catch (Exception ex) { // Many things can go wrong with reflection calls

            String error=ex.toString();
            Toast.makeText(context, "error: "+ error , Toast.LENGTH_LONG).show();

            txtHome.setText("error: "+ error);//cambio el contenido del TextView

        }

    }

Le problème est que j'obtiens l'erreur suivante : "java.lang.reflect.invocationTargetException".

l'application se plante à la ligne "methodEndCall.invoke(telephonyInterface) ;".

Pouvez-vous m'indiquer la manière correcte de refuser l'appel en cours ?

0voto

Shriyansh Gautam Points 1006

Vous devez définir les permissions dans votre manifeste

<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

Pour une version de sdk supérieure ou égale à 23, vous avez besoin de permissions d'exécution. Dans votre activité, vous pouvez obtenir des autorisations d'exécution comme suit

public static final int MY_PERMISSIONS_REQUEST_READ_PHONE_STATE = 101;
@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  if (ContextCompat.checkSelfPermission(this,
        Manifest.permission.READ_PHONE_STATE)
        != PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(this,
        Manifest.permission.CALL_PHONE)
        != PackageManager.PERMISSION_GRANTED) {

    if (ActivityCompat.shouldShowRequestPermissionRationale(this,
            Manifest.permission.READ_PHONE_STATE)) {
        // Show an explanation for read phone state
    } else 
     if(ActivityCompat.shouldShowRequestPermissionRationale(this,
            Manifest.permission.CALL_PHONE)){
        // Show an explanation for call phone
    }else {

        // No explanation needed

        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.READ_PHONE_STATE,Manifest.permission.CALL_PHONE},
                MY_PERMISSIONS_REQUEST_READ_PHONE_STATE);
        // result of the request.
    }
  }else{
       //permission already available
       //do the required task here
  }
}

@Override
public void onRequestPermissionsResult(int requestCode,
                                   String permissions[], int[] 
grantResults) {
  switch (requestCode) {
    case MY_PERMISSIONS_REQUEST_READ_PHONE_STATE: {
        // If request is cancelled, the result arrays are empty.
        if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

            // permission granted
            // do the required task here

        } else {
            // permission denied
        }
        return;
    }

  }
}

0voto

@shiriyas

J'ai corrigé l'erreur.

Merci de m'avoir aidé.

Le problème était que je vérifiais les perms dans la méthode onCreate.

Lorsque j'ai vérifié les perms dans la méthode PhoneCallEnd, le problème a été résolu.

Désolé mais c'est ma première application et comme vous pouvez le voir, je n'ai pas très bien utilisé les outils =(

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X