J'essaie de passer un appel téléphonique depuis Android, et j'ai également défini des autorisations d'exécution. Et il demande s'il faut autoriser les appels téléphoniques. Mais lorsque j'appuie sur Autoriser, l'application se bloque:
Voici comment je l'ai implémenté:
private static final int REQUEST_PHONE_CALL = 1;
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + "+918511812660"));
if (Android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE},REQUEST_PHONE_CALL);
}
else
{
startActivity(intent);
}
}
else
{
startActivity(intent);
}
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case REQUEST_PHONE_CALL: {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
startActivity(intent);
}
else
{
}
return;
}
}
}
Voici ce que j'obtiens dans logcat:
Java.lang.RuntimeException: Failure delivering result ResultInfo{who=@Android:requestPermissions:,
request=1, result=-1, data=Intent { act=Android.content.pm.action.REQUEST_PERMISSIONS (has extras) }}
to activity {com.devpost.airway/com.devpost.airway.activities.MainActivity}:
Java.lang.NullPointerException: Attempt to invoke virtual method
'Java.lang.String Android.content.Intent.toString()' on a null object reference
at Android.app.ActivityThread.deliverResults(ActivityThread.Java:3733)
at Android.app.ActivityThread.handleSendResult(ActivityThread.Java:3776)
at Android.app.ActivityThread.-wrap16(ActivityThread.Java)
at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1412)
at Android.os.Handler.dispatchMessage(Handler.Java:102)
at Android.os.Looper.loop(Looper.Java:148)
at Android.app.ActivityThread.main(ActivityThread.Java:5461)
at Java.lang.reflect.Method.invoke(Native Method)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:726)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:616)
Caused by: Java.lang.NullPointerException: Attempt to invoke virtual method
'Java.lang.String Android.content.Intent.toString()' on a null object reference
at Android.app.Instrumentation.execStartActivity(Instrumentation.Java:1485)
at Android.app.Activity.startActivityForResult(Activity.Java:3930)
at Android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.Java:48)
at Android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.Java:75)
at Android.app.Activity.startActivityForResult(Activity.Java:3890)
at Android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.Java:856)
at Android.app.Activity.startActivity(Activity.Java:4213)
at Android.app.Activity.startActivity(Activity.Java:4181)
at com.devpost.airway.activities.MainActivity.onRequestPermissionsResult(MainActivity.Java:140)
at Android.app.Activity.dispatchRequestPermissionsResult(Activity.Java:6582)
at Android.app.Activity.dispatchActivityResult(Activity.Java:6460)
at Android.app.ActivityThread.deliverResults(ActivityThread.Java:3729)
at Android.app.ActivityThread.handleSendResult(ActivityThread.Java:3776)
at Android.app.ActivityThread.-wrap16(ActivityThread.Java)
at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1412)
at Android.os.Handler.dispatchMessage(Handler.Java:102)
at Android.os.Looper.loop(Looper.Java:148)
at Android.app.ActivityThread.main(ActivityThread.Java:5461)
at Java.lang.reflect.Method.invoke(Native Method)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:726)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:616)
Quelle est la cause possible de cela?
La trace de la pile semble indiquer que votre flux d'autorisations fonctionne correctement, mais l'appel à startActivity
depuis onRequestPermissionsResult()
plante. Le Intent
que vous passez à startActivity
est-il correctement défini? Je ne vois pas qu'il soit défini dans cette partie du code.
Notez également que ContextCompat.checkSelfPermission
gère la vérification de la version du SDK en votre nom, vous devriez donc pouvoir utiliser
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE},REQUEST_PHONE_CALL);
}
else
{
startActivity(intent);
}
par lui-même, sans le code de vérification de version du SDK enveloppant.
Je ferais mieux de suggérer d'utiliser ACTION_DIAL plutôt que ACTION_CALL lors de la construction de l'intention d'appeler un numéro particulier. En utilisant ACTION_DIAL, vous n'aurez besoin d'aucune autorisation d'appel dans votre application, car ACTION_DIAL ouvre le composeur avec le numéro déjà entré et permet en outre à l'utilisateur de décider s'il doit réellement passer l'appel ou modifier le numéro de téléphone avant d'appeler ou de ne pas appeler du tout.
Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + "Your Phone_number"));// Initiates the Intent
startActivity(intent);
Vous devez créer votre Intent
dans onRequestPermissionsResult
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case REQUEST_PHONE_CALL: {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + "+918511812660"));
startActivity(intent);
}
else
{
}
return;
}
}
}
ajouter une nouvelle méthode
public static boolean hasPermissions(Context context, String... permissions) {
if (Android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context != null && permissions != null) {
for (String permission : permissions) {
if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
}
return true;
}
ajouter ceci dans Global
int PERMISSION_ALL = 1;
String[] PERMISSIONS = {Manifest.permission.READ_CONTACTS, Manifest.permission.CALL_PHONE};
et écrivez le code ci-dessous dans onCreate
if(!hasPermissions(this, PERMISSIONS)){
ActivityCompat.requestPermissions(this, PERMISSIONS, PERMISSION_ALL);
}
Remplacez votre onRequestPermissionsResult
par ci-dessous, vous devez d'abord créer le intent
puis l'appeler avec l'autorisation accordée. C'est là que vous vous trompez.
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case REQUEST_PHONE_CALL : {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + "+918511812660"));
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {
startActivity(intent);
}
}
}
}
}