web-dev-qa-db-fra.com

Android App pour appeler un numéro en cliquant sur un bouton

Je veux appeler un numéro indiqué dans une zone de texte mais je reçois le message d'erreur:

L'application 'xyz' (processus com.Android) s'est arrêtée de manière inattendue

Voici mon code. Où ça va mal?

EditText txtPhn;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    Button callButton = (Button)findViewById(R.id.btnCall);
    txtPhn = (EditText)findViewById(R.id.txtPhnNumber);
    callButton.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            try {
                    Intent callIntent = new Intent(Intent.ACTION_CALL);
                    callIntent.setData(Uri.parse("tel:"+txtPhn.getText().toString()));
                    startActivity(callIntent);
                } catch (ActivityNotFoundException activityException) {
                    Log.e("Calling a Phone Number", "Call failed", activityException);
                }
        }
    });
}

ÉDITÉLogCat

03-09 11:23:25.874: ERROR/AndroidRuntime(370): FATAL EXCEPTION: main
03-09 11:23:25.874: ERROR/AndroidRuntime(370): Java.lang.SecurityException: Permission Denial: starting Intent { act=Android.intent.action.CALL dat=tel:xxx-xxx-xxxx flg=0x10000000 cmp=com.Android.phone/.OutgoingCallBroadcaster } from ProcessRecord{40738d70 370:org.krish.Android/10034} (pid=370, uid=10034) requires Android.permission.CALL_PHONE
03-09 11:23:25.874: ERROR/AndroidRuntime(370):     at Android.os.Parcel.readException(Parcel.Java:1322)
03-09 11:23:25.874: ERROR/AndroidRuntime(370):     at Android.os.Parcel.readException(Parcel.Java:1276)
03-09 11:23:25.874: ERROR/AndroidRuntime(370):     at Android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.Java:1351)
03-09 11:23:25.874: ERROR/AndroidRuntime(370):     at Android.app.Instrumentation.execStartActivity(Instrumentation.Java:1374)
03-09 11:23:25.874: ERROR/AndroidRuntime(370):     at Android.app.Activity.startActivityForResult(Activity.Java:2827)
03-09 11:23:25.874: ERROR/AndroidRuntime(370):     at Android.app.Activity.startActivity(Activity.Java:2933)
03-09 11:23:25.874: ERROR/AndroidRuntime(370):     at org.krish.Android.caller$1.onClick(caller.Java:29)
03-09 11:23:25.874: ERROR/AndroidRuntime(370):     at Android.view.View.performClick(View.Java:2485)
03-09 11:23:25.874: ERROR/AndroidRuntime(370):     at Android.view.View$PerformClick.run(View.Java:9080)
03-09 11:23:25.874: ERROR/AndroidRuntime(370):     at Android.os.Handler.handleCallback(Handler.Java:587)
03-09 11:23:25.874: ERROR/AndroidRuntime(370):     at Android.os.Handler.dispatchMessage(Handler.Java:92)
03-09 11:23:25.874: ERROR/AndroidRuntime(370):     at Android.os.Looper.loop(Looper.Java:123)
03-09 11:23:25.874: ERROR/AndroidRuntime(370):     at Android.app.ActivityThread.main(ActivityThread.Java:3683)
03-09 11:23:25.874: ERROR/AndroidRuntime(370):     at Java.lang.reflect.Method.invokeNative(Native Method)
03-09 11:23:25.874: ERROR/AndroidRuntime(370):     at    Java.lang.reflect.Method.invoke(Method.Java:507)
03-09 11:23:25.874: ERROR/AndroidRuntime(370):     at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:839)
03-09 11:23:25.874: ERROR/AndroidRuntime(370):     at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:597)
03-09 11:23:25.874: ERROR/AndroidRuntime(370):     at dalvik.system.NativeStart.main(Native Method)`enter code here`
21
FosterZ

Assurez-vous que vous avez ajouté la balise <uses-permission ... /> à un niveau correct dans le fichier AndroidManifest.xml ( outside la balise <application ... /> mais dans la balise <manifest ... />):

<manifest
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="com.dbm.pkg"
    Android:versionCode="1"
    Android:versionName="1.0">

    <!-- NOTE! Your uses-permission must be outside the "application" tag
               but within the "manifest" tag. -->

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

    <application
        Android:icon="@drawable/icon"
        Android:label="@string/app_name">

        <!-- Insert your other stuff here -->

    </application>

    <uses-sdk Android:minSdkVersion="9" />
</manifest> 
20
dbm

Il existe deux intentions d'appeler/de commencer à appeler: ACTION_CALL et ACTION_DIAL.

ACTION_DIAL ouvre uniquement le numéroteur avec le numéro renseigné, mais permet à l'utilisateur d'appeler ou de rejeter l'appel. ACTION_CALL appelle immédiatement le numéro et nécessite une autorisation supplémentaire.

Alors assurez-vous d'avoir la permission

uses-permission Android:name="Android.permission.CALL_PHONE"

dans votre AndroidManifest.xml

10
Ivo van der Wijk

Le problème est que vous n'avez pas demandé la permission de l'utilisateur. Si l'appareil exécute Android 6.0 (API de niveau 23) et que la cible targetSdkVersion de l'application est égale ou supérieure à 23, l'autorisation d'appel sera considérée comme une autorisation dangereuse. Par conséquent, vous devez d'abord obtenir la bonne permission . Tout d'abord, ajoutez

<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
      package="com.Android.app.myapp" >
      <uses-permission Android:name="Android.permission.CALL_PHONE" />
      ... 
  </manifest>

dans votre fichier AndroidManifest.xml.

Ensuite, j'ai une méthode s'appelle en cliquant sur un bouton.

public void onCall(View view) {
          Intent callIntent = new Intent(Intent.ACTION_CALL); //use ACTION_CALL class
          callIntent.setData(Uri.parse("tel:0800000000"));    //this is the phone number calling
          //check permission
          //If the device is running Android 6.0 (API level 23) and the app's targetSdkVersion is 23 or higher,
          //the system asks the user to grant approval.
          if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
              //request permission from user if the app hasn't got the required permission
              ActivityCompat.requestPermissions(this,
                      new String[]{Manifest.permission.CALL_PHONE},   //request specific permission from user
                      10);
              return;
          }else {     //have got permission
              try{
                  startActivity(callIntent);  //call activity and make phone call
              }
              catch (Android.content.ActivityNotFoundException ex){
                  Toast.makeText(getApplicationContext(),"yourActivity is not founded",Toast.LENGTH_SHORT).show();
              }
          }
      }
4
Fred

Vous voudrez peut-être essayer l'approche suivante:

Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setData(Uri.parse("tel:"+txtPhn.getText().toString()));
callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(callIntent);

C'est à dire. ajout de l'appel de fonction callIntent.setFlags(...).

2
dbm

API 24 

Intent intent = new Intent(Intent.ACTION_CALL);
    intent.setData(Uri.parse("tel:+94720999666"));
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
        // TODO: Consider calling
        //    ActivityCompat#requestPermissions
        // here to request the missing permissions, and then overriding
        //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
        //                                          int[] grantResults)
        // to handle the case where the user grants the permission. See the documentation
        // for ActivityCompat#requestPermissions for more details.
        return;
    }
    startActivity(intent);

et aussi ajouter

<uses-permission Android:name="Android.permission.CALL_PHONE" />
2
A.G.THAMAYS

Essayez d’ajouter trim ():

callIntent.setData(Uri.parse("tel:"+txtPhn.getText().toString().trim()));
0
Peter Knego

Vous devrez probablement le tester sur un appareil réel. J'ai rencontré le même problème et cela a fonctionné sur le vrai appareil. L'appel et le GPS ne fonctionnent parfois pas comme prévu dans AVD.

0
samir