How to make a phone call using intent in Android?

AndroidAndroid IntentPhone CallAndroid Implicit-IntentAndroid Phone-Call

Android Problem Overview


I'm using the following code to make a call in Android but it is giving me security exception please help.

 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);

permissions

 <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)

Android Solutions


Solution 1 - Android

You can use Intent.ACTION_DIAL instead of Intent.ACTION_CALL. This shows the dialer with the number already entered, but allows the user to decide whether to actually make the call or not. ACTION_DIAL does not require the CALL_PHONE permission.

Solution 2 - Android

This demo will helpful for you...

On call button click:

Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + "Your Phone_number"));
startActivity(intent);

Permission in Manifest:

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

EDIT IN 2021

You should write it in your manifest file but at the same time you should ask in runtime.Like this code:

if (ContextCompat.checkSelfPermission(this,android.Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, arrayOf(android.Manifest.permission.CALL_PHONE),
                REQUEST_CODE)

        } else {

// else block means user has already accepted.And make your phone call here.

}

And if you want you can override onRequestPermissionsResult to give user better experience if you write same code with else block here your user will not need to click on your button again after you give permission it will directly call.

Solution 3 - Android

More elegant option:

String phone = "+34666777888";
Intent intent = new Intent(Intent.ACTION_DIAL, Uri.fromParts("tel", phone, null));
startActivity(intent);

Solution 4 - Android

Use the action ACTION_DIAL in your intent, this way you won't need any permission. The reason you need the permission with ACTION_CALL is to make a phone call without any action from the user.

Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:0987654321"));
startActivity(intent);

Solution 5 - Android

Every thing is fine.

i just placed call permissions tag before application tag in manifest file

and now every thing is working fine.

Solution 6 - Android

IMPORTANT NOTE:

If you use Intent.ACTION_CALL you must add CALL_PHONE permission.

Its okey only if you don't want your app to show up in google play for tablets that doesn't take SIM card or doesn't have GSM.

IN YOUR ACTIVITY:
            Intent callIntent = new Intent(Intent.ACTION_CALL);
            callIntent.setData(Uri.parse("tel:" + Constants.CALL_CENTER_NUMBER));
            startActivity(callIntent);
MANIFEST:
<uses-permission android:name="android.permission.CALL_PHONE" />

So if it is not critical feature to your app, try to stay away from adding CALL_PHONE permission.

OTHER SOLUTION:

Is to show the Phone app with the number written in on the screen, so user will only need to click call button:

            Intent dialIntent = new Intent(Intent.ACTION_DIAL);
            dialIntent.setData(Uri.parse("tel:" + Constants.CALL_CENTER_NUMBER));
            startActivity(dialIntent);

No permission needed for this.

Solution 7 - Android

Just the simple oneliner without any additional permissions needed:

private void dialContactPhone(final String phoneNumber) {
    startActivity(new Intent(Intent.ACTION_DIAL, Uri.fromParts("tel", phoneNumber, null)));
}

Solution 8 - Android

use this full code

          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);     

Solution 9 - Android

Request Permission in manifest

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

For calling use this 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();
}

Solution 10 - Android

Permission in AndroidManifest.xml

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

Complete code:

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();
	}
}

Solution 11 - Android

// Java
String mobileNumber = "99XXXXXXXX";
Intent intent = new Intent();
intent.setAction(Intent.ACTION_DIAL); // Action for what intent called for
intent.setData(Uri.parse("tel: " + mobileNumber)); // Data with intent respective action on intent
startActivity(intent);

// Kotlin
val mobileNumber = "99XXXXXXXX"
val intent = Intent()
intent.action = Intent.ACTION_DIAL // Action for what intent called for
intent.data = Uri.parse("tel: $mobileNumber") // Data with intent respective action on intent
startActivity(intent)

Solution 12 - Android

Permissions:

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

Intent:

Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setData(Uri.parse("tel:0377778888"));
startActivity(callIntent);

Solution 13 - Android

For call from dialer (No permission needed):

   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()
        }
    }

For direct call from app(Permission needed):

  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>

Solution 14 - Android

You can use this as well:

String uri = "tel:" + posted_by.replaceAll("[^0-9|\\+]", "");

Solution 15 - Android

For making a call activity using intents, you should request the proper permissions.

For that you include uses permissions in AndroidManifest.xml file.

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

Then include the following code in your activity

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();
}

Solution 16 - Android

To avoid this - one can use the GUI for entering permissions. Eclipse take care of where to insert the permission tag and more often then not is correct

Solution 17 - Android

 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")));
                }

Solution 18 - Android

In Android for certain functionalities you need to add the permission to the Manifest file.

  1. Go to the Projects AndroidManifest.xml
  2. Click on the Permissions Tab
  3. Click on Add
  4. Select Uses Permission
  5. See the snapshot belowenter image description here

6.Save the manifest file and then run your project. Your project now should run as expected.

Solution 19 - Android

11-25 14:47:01.681: ERROR/AndroidRuntime(302): blah blah...requires android.permission.CALL_PHONE

^ The answer lies in the exception output "requires android.permission.CALL_PHONE" :)

Solution 20 - Android

    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();
    }

Solution 21 - Android

use this code in Kotlin

fun makeCall(context: Context, mob: String) {
        try {
            val intent = Intent(Intent.ACTION_DIAL)

            intent.data = Uri.parse("tel:$mob")
            context.startActivity(intent)
        } catch (e: java.lang.Exception) {
            Toast.makeText(context,
                "Unable to call at this time", Toast.LENGTH_SHORT).show()
        }
    }

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionUMAR-MOBITSOLUTIONSView Question on Stackoverflow
Solution 1 - AndroidRidcullyView Answer on Stackoverflow
Solution 2 - AndroidDenny SharmaView Answer on Stackoverflow
Solution 3 - AndroidcprcrackView Answer on Stackoverflow
Solution 4 - AndroidwheeliezView Answer on Stackoverflow
Solution 5 - AndroidUMAR-MOBITSOLUTIONSView Answer on Stackoverflow
Solution 6 - AndroidMBHView Answer on Stackoverflow
Solution 7 - AndroidArtemiyView Answer on Stackoverflow
Solution 8 - AndroidOsama IbrahimView Answer on Stackoverflow
Solution 9 - AndroidAbhay AnandView Answer on Stackoverflow
Solution 10 - AndroidAtif MahmoodView Answer on Stackoverflow
Solution 11 - AndroidSumit JainView Answer on Stackoverflow
Solution 12 - Androiduser3150090View Answer on Stackoverflow
Solution 13 - AndroidShohan Ahmed SijanView Answer on Stackoverflow
Solution 14 - AndroidÁron PávelView Answer on Stackoverflow
Solution 15 - AndroidCodemakerView Answer on Stackoverflow
Solution 16 - AndroidSaKetView Answer on Stackoverflow
Solution 17 - AndroidMohsinaliView Answer on Stackoverflow
Solution 18 - AndroidMindBrainView Answer on Stackoverflow
Solution 19 - AndroidCharlie Scott-SkinnerView Answer on Stackoverflow
Solution 20 - AndroidDeepak SinghView Answer on Stackoverflow
Solution 21 - Androiduser15173649View Answer on Stackoverflow