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`
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>
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
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();
}
}
}
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(...)
.
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" />
Essayez d’ajouter trim ():
callIntent.setData(Uri.parse("tel:"+txtPhn.getText().toString().trim()));
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.