如何使用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文件。
- 转到项目AndroidManifest.xml
- 点击权限标签
- 点击添加
- select使用权限
- 见下面的快照
保存清单文件,然后运行你的项目。 现在您的项目应该按预期运行。
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。