J'utilise le code suivant pour passer un appel dans Android mais il me donne une exception de sécurité, merci de m'aider.
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$2$1$1$1.onClick(PostDetail.Java:604)
11-25 14:47:01.681: ERROR/AndroidRuntime(302): at com.Android.internal.app.AlertController$AlertParams$3.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)
Tout va bien.
je viens de placer la balise des autorisations d'appel avant la balise d'application dans le fichier manifeste
et maintenant tout fonctionne bien.
Vous pouvez utiliser Intent.ACTION_DIAL
au lieu de Intent.ACTION_CALL
. Ceci affiche le numéroteur avec le numéro déjà entré, mais permet à l'utilisateur de décider s'il souhaite réellement lancer l'appel ou non. ACTION_DIAL
ne nécessite pas l'autorisation CALL_PHONE
.
Cette démo vous sera utile ...
Sur appel, cliquez sur le bouton:
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + "Your Phone_number"));
startActivity(intent);
Permission 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);
Utilisez l'action ACTION_DIAL dans votre intention, de cette manière, vous n'aurez besoin d'aucune permission. Si vous avez besoin de l'autorisation avec ACTION_CALL, vous devez passer un appel téléphonique sans aucune action de l'utilisateur.
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:0987654321"));
startActivity(intent);
Si vous utilisez Intent.ACTION_CALL
, vous devez ajouter l'autorisation CALL_PHONE
.
Son okay seulement si vous ne voulez pas que votre application apparaisse dans Google Play pour les tablettes qui ne prennent pas de carte SIM ou n'ont pas de GSM.
Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setData(Uri.parse("tel:" + Constants.CALL_CENTER_NUMBER));
startActivity(callIntent);
<uses-permission Android:name="Android.permission.CALL_PHONE" />
Par conséquent, s'il ne s'agit pas d'une fonctionnalité essentielle de votre application, évitez d'ajouter la permission CALL_PHONE
.
Pour afficher l'application Téléphone avec le numéro inscrit à l'écran, l'utilisateur n'aura qu'à cliquer sur le bouton d'appel:
Intent dialIntent = new Intent(Intent.ACTION_DIAL);
dialIntent.setData(Uri.parse("tel:" + Constants.CALL_CENTER_NUMBER));
startActivity(dialIntent);
Aucune autorisation requise pour cela.
Juste le simple oneliner sans aucune autorisation supplémentaire nécessaire:
private void dialContactPhone(final String phoneNumber) {
startActivity(new Intent(Intent.ACTION_DIAL, Uri.fromParts("tel", phoneNumber, null)));
}
utiliser 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 appeler, 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();
}
Permissions:
<uses-permission Android:name="Android.permission.CALL_PHONE" />
Intention:
Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setData(Uri.parse("tel:0377778888"));
startActivity(callIntent);
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 effectuer une activité d’appel en utilisant les intentions, vous devez demander les autorisations appropriées.
Pour cela, vous incluez des autorisations dans le fichier AndroidManifest.xml.
<uses-permission Android:name="Android.permission.CALL_PHONE" />
Ensuite, incluez 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();
}
Vous pouvez aussi utiliser ceci:
String uri = "tel:" + posted_by.replaceAll("[^0-9|\\+]", "");
Pour éviter cela, vous pouvez utiliser l'interface graphique pour saisir des autorisations. Eclipse prend soin de l'endroit où insérer l'étiquette de permission et le plus souvent alors not est correct
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();
}
Dans Android pour certaines fonctionnalités, vous devez ajouter l'autorisation au fichier Manifest.
6. Enregistrez le fichier manifeste, puis exécutez 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 un appel du composeur (aucune autorisation requise):
fun callFromDailer(mContext: Context, number: String) {
try {
val callIntent = Intent(Intent.ACTION_DIAL)
callIntent.data = Uri.parse("tel:$number")
mContext.startActivity(callIntent)
} catch (e: Exception) {
e.printStackTrace()
Toast.makeText(mContext, "No SIM Found", Toast.LENGTH_LONG).show()
}
}
Pour un appel direct depuis l'application (autorisation requise):
fun callDirect(mContext: Context, number: String) {
try {
val callIntent = Intent(Intent.ACTION_CALL)
callIntent.data = Uri.parse("tel:$number")
mContext.startActivity(callIntent)
} catch (e: SecurityException) {
Toast.makeText(mContext, "Need call permission", Toast.LENGTH_LONG).show()
} catch (e: Exception) {
e.printStackTrace()
Toast.makeText(mContext, "No SIM Found", Toast.LENGTH_LONG).show()
}
}
Permission:
<uses-permission Android:name="Android.permission.CALL_PHONE"></uses-permission>