Как сделать телефонный звонок, используя интент в Android? - PullRequest
288 голосов
/ 25 ноября 2010

Я использую следующий код для звонка в 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)

Ответы [ 18 ]

357 голосов
/ 29 октября 2012

Вы можете использовать Intent.ACTION_DIAL вместо Intent.ACTION_CALL. Это показывает номеронабиратель с уже введенным номером, но позволяет пользователю решать, действительно ли он совершает вызов или нет. ACTION_DIAL не требует разрешения CALL_PHONE.

212 голосов
/ 24 сентября 2013

Это демо поможет вам ...

При нажатии кнопки вызова:

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

Разрешение в манифесте:

 <uses-permission android:name="android.permission.CALL_PHONE" />
149 голосов
/ 23 июня 2014

Более элегантный вариант:

String phone = "+34666777888";
Intent intent = new Intent(Intent.ACTION_DIAL, Uri.fromParts("tel", phone, null));
startActivity(intent);
69 голосов
/ 25 ноября 2010

Все хорошо.

Я только что поместил тег разрешения вызова перед тегом приложения в файле манифеста

и теперь все работает нормально.

56 голосов
/ 14 января 2015

Используйте действие ACTION_DIAL в своем намерении, таким образом, вам не нужно никакого разрешения.Причина, по которой вам нужно разрешение с помощью ACTION_CALL, заключается в том, чтобы позвонить пользователю без каких-либо действий со стороны пользователя.

23 голосов
/ 21 августа 2017

ВАЖНОЕ ПРИМЕЧАНИЕ:

Если вы используете Intent.ACTION_CALL, вы должны добавить разрешение CALL_PHONE.

Это хорошо, только если вы не хотите, чтобы ваше приложение отображалось в Google Play для планшетов, которые не используют 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);

Для этого не требуется разрешения.

22 голосов
/ 14 августа 2015

Просто простой oneliner без каких-либо дополнительных разрешений:

private void dialContactPhone(final String phoneNumber) {
    startActivity(new Intent(Intent.ACTION_DIAL, Uri.fromParts("tel", phoneNumber, null)));
}
15 голосов
/ 27 января 2014

используйте этот полный код

          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);     
11 голосов
/ 20 ноября 2015

Запрос разрешения в манифесте

<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();
}
8 голосов
/ 26 мая 2015

Разрешения:

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

Назначение:

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