Comment faire un appel téléphonique en utilisant intent dans Android?
j'utilise le code suivant pour passer un appel sur Android mais il me donne une exception de sécurité s'il vous plaît aidez-moi.
posted_by = "111-333-222-4";
String uri = "tel:" + posted_by.trim() ;
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse(uri));
startActivity(intent);
autorisations
<uses-permission android:name="android.permission.CALL_PHONE" />
Exception
11-25 14:47:01.661: ERROR/AndroidRuntime(302): Uncaught handler: thread main exiting due to uncaught exception
11-25 14:47:01.681: ERROR/AndroidRuntime(302): java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.CALL dat=tel:111-333-222-4 cmp=com.android.phone/.OutgoingCallBroadcaster } from ProcessRecord{43d32508 302:com.Finditnear/10026} (pid=302, uid=10026) requires android.permission.CALL_PHONE
11-25 14:47:01.681: ERROR/AndroidRuntime(302): at android.os.Parcel.readException(Parcel.java:1218)
11-25 14:47:01.681: ERROR/AndroidRuntime(302): at android.os.Parcel.readException(Parcel.java:1206)
11-25 14:47:01.681: ERROR/AndroidRuntime(302): at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:1214)
11-25 14:47:01.681: ERROR/AndroidRuntime(302): at android.app.Instrumentation.execStartActivity(Instrumentation.java:1373)
11-25 14:47:01.681: ERROR/AndroidRuntime(302): at android.app.Activity.startActivityForResult(Activity.java:2749)
11-25 14:47:01.681: ERROR/AndroidRuntime(302): at android.app.Activity.startActivity(Activity.java:2855)
11-25 14:47:01.681: ERROR/AndroidRuntime(302): at com.Finditnear.PostDetail.onClick(PostDetail.java:604)
11-25 14:47:01.681: ERROR/AndroidRuntime(302): at com.android.internal.app.AlertController$AlertParams.onItemClick(AlertController.java:884)
11-25 14:47:01.681: ERROR/AndroidRuntime(302): at android.widget.AdapterView.performItemClick(AdapterView.java:284)
11-25 14:47:01.681: ERROR/AndroidRuntime(302): at android.widget.ListView.performItemClick(ListView.java:3285)
11-25 14:47:01.681: ERROR/AndroidRuntime(302): at android.widget.AbsListView$PerformClick.run(AbsListView.java:1640)
19 réponses
vous pouvez utiliser Intent.ACTION_DIAL
au lieu de Intent.ACTION_CALL
. Cette option affiche le numéro déjà entré, mais permet à l'utilisateur de décider s'il doit faire l'appel ou non. ACTION_DIAL
ne nécessite pas la permission CALL_PHONE
.
cette démo vous sera utile...
cliquez sur le bouton d'appel:
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + "Your Phone_number"));
startActivity(intent);
Autorisation dans le Manifeste:
<uses-permission android:name="android.permission.CALL_PHONE" />
option plus élégante:
String phone = "+34666777888";
Intent intent = new Intent(Intent.ACTION_DIAL, Uri.fromParts("tel", phone, null));
startActivity(intent);
tout va bien.
je viens de placer l'étiquette d'autorisation d'appel avant l'étiquette d'application dans le fichier manifeste
et maintenant tout fonctionne bien.
utilisez L'action ACTION_DIAL dans votre intention, de cette façon vous n'aurez pas besoin de permission. La raison pour laquelle vous avez besoin de la permission avec ACTION_CALL est de passer un appel téléphonique sans aucune action de la part de l'utilisateur.
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:0987654321"))
startActivity(intent);
juste le simple oneliner sans aucune permissions supplémentaires nécessaires:
private void dialContactPhone(final String phoneNumber) {
startActivity(new Intent(Intent.ACTION_DIAL, Uri.fromParts("tel", phoneNumber, null)));
}
utilisez ce code complet
Intent callIntent = new Intent(Intent.ACTION_DIAL);
callIntent.setData(Uri.parse("tel:"+Uri.encode(PhoneNum.trim())));
callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(callIntent);
demande de Permission dans le manifeste
<uses-permission android:name="android.permission.CALL_PHONE" />
pour les appels utilisez ce code
Intent in = new Intent(Intent.ACTION_CALL, Uri.parse("tel:99xxxxxxxx"));
try {
startActivity(in);
} catch (android.content.ActivityNotFoundException ex) {
Toast.makeText(mcontext, "Could not find an activity to place the call.", Toast.LENGTH_SHORT).show();
}
NOTE IMPORTANTE:
Si vous utilisez Intent.ACTION_CALL
, vous devez ajouter CALL_PHONE
autorisation.
C'est d'accord seulement si vous ne voulez pas que votre application se présente pour les comprimés qui ne prennent pas la carte SIM ou n'ont pas de GSM.
DANS VOTRE ACTIVITÉ:
Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setData(Uri.parse("tel:" + Constants.CALL_CENTER_NUMBER));
startActivity(callIntent);
manifeste:
<uses-permission android:name="android.permission.CALL_PHONE" />
donc si ce n'est pas une caractéristique critique de votre application, essayez de rester à l'écart de l'ajout de CALL_PHONE
autorisation.
AUTRE SOLUTION:
Est de montrer l'application Téléphone avec le numéro écrit sur l'écran, de sorte que l'utilisateur aura seulement besoin de cliquer sur le bouton d'appel:
Intent dialIntent = new Intent(Intent.ACTION_DIAL);
dialIntent.setData(Uri.parse("tel:" + Constants.CALL_CENTER_NUMBER));
startActivity(dialIntent);
pas besoin de permission pour cela.
vous pouvez utiliser cela aussi bien:
String uri = "tel:" + posted_by.replaceAll("[^0-9|\+]", "");
Permission dans AndroidManifest.xml
<uses-permission android:name="android.permission.CALL_PHONE" />
code complet:
private void onCallBtnClick(){
if (Build.VERSION.SDK_INT < 23) {
phoneCall();
}else {
if (ActivityCompat.checkSelfPermission(mActivity,
Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {
phoneCall();
}else {
final String[] PERMISSIONS_STORAGE = {Manifest.permission.CALL_PHONE};
//Asking request Permissions
ActivityCompat.requestPermissions(mActivity, PERMISSIONS_STORAGE, 9);
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
boolean permissionGranted = false;
switch(requestCode){
case 9:
permissionGranted = grantResults[0]== PackageManager.PERMISSION_GRANTED;
break;
}
if(permissionGranted){
phoneCall();
}else {
Toast.makeText(mActivity, "You don't assign permission.", Toast.LENGTH_SHORT).show();
}
}
private void phoneCall(){
if (ActivityCompat.checkSelfPermission(mActivity,
Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {
Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setData(Uri.parse("tel:12345678900"));
mActivity.startActivity(callIntent);
}else{
Toast.makeText(mActivity, "You don't assign permission.", Toast.LENGTH_SHORT).show();
}
}
pour éviter cela - on peut utiliser L'interface graphique pour entrer les permissions. Eclipse prendre soin de l'endroit où insérer l'étiquette de permission et le plus souvent n'est pas correcte
dans Android pour certaines fonctionnalités, vous devez ajouter la permission au fichier Manifest.
- Aller à la Projets de AndroidManifest.xml
- cliquez sur L'onglet Autorisations
- cliquez sur Ajouter
- Select Utilise La Permission
- voir l'instantané ci-dessous
6.Enregistrez le fichier de manifeste et lancez votre projet. Votre projet devrait maintenant fonctionner comme prévu.
11-25 14:47:01.681: ERROR/AndroidRuntime(302): blah blah...requires android.permission.CALL_PHONE
^ la réponse se trouve dans la sortie d'exception" requires android.permission.CALL_PHONE
" :)
if(ContextCompat.checkSelfPermission(
mContext,android.Manifest.permission.CALL_PHONE) !=
PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions((Activity) mContext, new
String[]{android.Manifest.permission.CALL_PHONE}, 0);
} else {
startActivity(new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + "Your Number")));
}
pour effectuer une activité d'appel en utilisant intents, vous devez demander les permissions appropriées.
pour que vous incluez les autorisations d'utilisation dans AndroidManifest.fichier xml.
<uses-permission android:name="android.permission.CALL_PHONE" />
puis inclure le code suivant dans votre activité
if (ActivityCompat.checkSelfPermission(mActivity,
Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {
//Creating intents for making a call
Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setData(Uri.parse("tel:123456789"));
mActivity.startActivity(callIntent);
}else{
Toast.makeText(mActivity, "You don't assign permission.", Toast.LENGTH_SHORT).show();
}
final public void Call(View view){
try {
EditText editt=(EditText)findViewById(R.id.ed1);
String str=editt.getText().toString();
Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:"+str));
startActivity(intent);
}
catch (android.content.ActivityNotFoundException e){
Toast.makeText(getApplicationContext(),"App failed",Toast.LENGTH_LONG).show();
}
je pense que vous avez juste besoin d'ajouter une permission dans votre manifeste:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
cela vous débarrassera de votre exception de sécurité.