Как сделать телефонный звонок с помощью intent в 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.onClick(PostDetail.java:604)
11-25 14:47:01.681: ERROR/AndroidRuntime(302): at com.android.internal.app.AlertController$AlertParams.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)
19 ответов:
можно использовать
Intent.ACTION_DIAL
вместоIntent.ACTION_CALL
. Это показывает номеронабиратель с уже введенным номером, но позволяет пользователю решить, действительно ли сделать вызов или нет.ACTION_DIAL
не требуетсяCALL_PHONE
разрешения.
Это демо будет полезно для вас...
при нажатии кнопки вызова:
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + "Your Phone_number")); startActivity(intent);
разрешение в Манифесте:
<uses-permission android:name="android.permission.CALL_PHONE" />
более элегантный вариант:
String phone = "+34666777888"; Intent intent = new Intent(Intent.ACTION_DIAL, Uri.fromParts("tel", phone, null)); startActivity(intent);
все в порядке.
Я только что разместил тег разрешений вызова перед тегом приложения в файле манифеста
и теперь все работает нормально.
используйте действие ACTION_DIAL в своем намерении, таким образом, вам не понадобится никаких разрешений. Причина, по которой вам нужно разрешение с ACTION_CALL, чтобы сделать телефонный звонок без каких-либо действий от пользователя.
Intent intent = new Intent(Intent.ACTION_DIAL); intent.setData(Uri.parse("tel:0987654321")) 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(); }
ВАЖНОЕ ПРИМЕЧАНИЕ:
если вы используете
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);
манифест:
<uses-permission android:name="android.permission.CALL_PHONE" />
так что если это не критическая функция для вашего приложения, постарайтесь держаться подальше от добавления
CALL_PHONE
разрешения.ДРУГОЕ РЕШЕНИЕ:
- показать телефон приложение с номером, написанным на экране, поэтому пользователю нужно будет только нажать кнопку вызова:
Intent dialIntent = new Intent(Intent.ACTION_DIAL); dialIntent.setData(Uri.parse("tel:" + Constants.CALL_CENTER_NUMBER)); startActivity(dialIntent);
для этого не требуется разрешение.
Permissions:
<uses-permission android:name="android.permission.CALL_PHONE" />
цель:
Intent callIntent = new Intent(Intent.ACTION_CALL); callIntent.setData(Uri.parse("tel:0377778888")); startActivity(callIntent);
разрешение в 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(); } }
чтобы избежать этого - можно использовать графический интерфейс для ввода разрешений. Eclipse позаботится о том, где вставить тег разрешения и чаще всего тогда не правильно
В Android для некоторых функций вам нужно добавить разрешение на файл манифеста.
- перейти к проектам AndroidManifest.xml
- перейдите на вкладку разрешения
- Нажмите кнопку Добавить
- Select Использует Разрешение
- смотрите снимок ниже
6.Сохраните файл манифеста и запустите проект. Ваш проект теперь должен работать, как ожидалось.
11-25 14:47:01.681: ERROR/AndroidRuntime(302): blah blah...requires android.permission.CALL_PHONE
^ ответ заключается в исключении вывода"
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"))); }
для выполнения действия вызова с использованием намерений, вы должны запросить соответствующие разрешения.
для этого вы включаете разрешения на использование в AndroidManifest.XML-файл.
<uses-permission android:name="android.permission.CALL_PHONE" />
затем включите следующий код в свою активность
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(); }
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(); }