如何使用Android中的意图拨打电话?

我使用下面的代码在Android中打电话,但它是给我安全例外,请帮助。

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

权限

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

例外

 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) 

您可以使用Intent.ACTION_DIAL而不是Intent.ACTION_CALL 。 这显示已经input号码的拨号器,但允许用户决定是否实际拨打电话。 ACTION_DIAL不需要CALL_PHONE权限。

这个演示将有助于你…

通话button点击:

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

清单许可:

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

更优雅的select:

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

一切安好。

我只是在清单文件中的应用程序标签之前放置调用权限标签

现在每件事情都很好。

只需简单的oneliner,不需要任何额外的权限:

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

使用这个完整的代码

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

清单中的请求权限

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

对于调用使用此代码

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

权限:

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

意图:

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

你也可以使用这个:

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

在你的意图中使用动作ACTION_DIAL,这样你就不需要任何权限。 您需要使用ACTION_CALL权限的原因是无需用户操作即可拨打电话。

 Intent intent = new Intent(Intent.ACTION_DIAL); intent.setData(Uri.parse("1234567890")) startActivity(intent); 

为了避免这种情况 – 可以使用GUI来input权限。 Eclipse需要关心在哪里插入权限标签,而且往往不是正确的

在Android中,对于某些function,您需要将权限添加到Manifest文件。

  1. 转到项目AndroidManifest.xml
  2. 点击权限标签
  3. 点击添加
  4. select使用权限
  5. 见下面的快照 在这里输入图像描述

保存清单文件,然后运行你的项目。 现在您的项目应该按预期运行。

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

^答案在于exception输出“ requires android.permission.CALL_PHONE ”:)

重要的提示:

如果您使用Intent.ACTION_CALL ,则必须添加CALL_PHONE权限。

只有当您不希望您的应用出现不使用SIM卡或没有GSM的平板电脑时,才能使用它。

在你的活动中:

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

performance:

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

所以,如果它不是你的应用程序的关键function,尽量远离添加CALL_PHONE权限。

其他解决scheme

就是在屏幕上显示电话号码,所以用户只需要点击通话键即可:

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

没有这方面的许可。

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

AndroidManifest.xml中的权限

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

完整的代码:

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

我想你只需要在清单中添加一个权限即可:

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

这将摆脱您的安全exception。