问题
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)
回答1:
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.
回答2:
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" />
回答3:
More elegant option:
String phone = "+34666777888";
Intent intent = new Intent(Intent.ACTION_DIAL, Uri.fromParts("tel", phone, null));
startActivity(intent);
回答4:
Every thing is fine.
i just placed call permissions tag before application tag in manifest file
and now every thing is working fine.
回答5:
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);
回答6:
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.
回答7:
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)));
}
回答8:
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);
回答9:
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();
}
回答10:
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);
回答11:
You can use this as well:
String uri = "tel:" + posted_by.replaceAll("[^0-9|\\+]", "");
回答12:
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();
}
}
回答13:
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();
}
回答14:
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
回答15:
In Android for certain functionalities you need to add the permission to the Manifest file.
- Go to the Projects AndroidManifest.xml
- Click on the Permissions Tab
- Click on Add
- Select Uses Permission
- See the snapshot below
6.Save the manifest file and then run your project. Your project now should run as expected.
回答16:
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
" :)
回答17:
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();
}
回答18:
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")));
}
回答19:
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>
回答20:
// Java
String mobileNumber = "9999999999";
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 = "9999999999"
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)
来源:https://stackoverflow.com/questions/4275678/how-to-make-a-phone-call-using-intent-in-android