Як здійснити телефонний дзвінок за допомогою наміру в Android?


329

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

Відповіді:


383

Ви можете використовувати Intent.ACTION_DIALзамість Intent.ACTION_CALL. Це показує набір номера з уже введеним номером, але дозволяє користувачеві вирішити, чи дійсно робити дзвінок чи ні. ACTION_DIALне вимагає CALL_PHONEдозволу.


ACTION_DIAL не вимагає дозволу, це важлива різниця порівняно з наміром ACTION_CALL :)
maxwellnewage

237

Ця демонстрація допоможе вам ...

При натисканні кнопки виклику натисніть:

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

Дозвіл в Manifest:

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

1
+1 для "тел:". Я натомість дзвонив і не мав винятків у намірах. Tnx
Тіна

Це просто не працює в моєму Nexus 4. Він відкриває дозвон, що показує номер телефону, але не починає дзвінок без взаємодії з користувачем. Будь-які затримки?
MatheusJardimB

5
Яка різниця між кодом у питанні та цією відповіддю? Як це вирішує проблему?
Гавриель

Це відкриває для мене скайп.
RJB

Будь ласка, додайте час роботи телефону для дзвінків Дозвіл також
Raghu Krishnan R

180

Більш елегантний варіант:

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

5
Це працює, не додаючи до Маніфесту нічого, як попередня відповідь
Павлос

4
Не потрібно дозволів на виконання. +1
кіке

82

Використовуйте дію ACTION_DIAL у своєму намірі, таким чином вам не знадобиться дозволу. Причина, що потребує дозволу на ACTION_CALL, - це робити телефонний дзвінок без будь-яких дій від користувача.

Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:0987654321"));
startActivity(intent);

2
Це краще в тому випадку, коли вам не потрібно просити дозволу.
zackygaurav

1
У другому рядку коду відсутня крапка з комою. ідеальна відповідь!
ahmed_khan_89

73

Все добре.

Я щойно розмістив тег дозволу на виклик перед тегом програми у файлі маніфесту

і тепер кожна річ працює чудово.


2
Дивіться мою відповідь нижче про те, як досягти майже того самого, не вимагаючи дозволу та з шансом, щоб користувач насправді не телефонував.
Ridcully

3
Крім того , бути в курсі пристроїв телефонії менш: stackoverflow.com/a/9300036/693752
Snicolas

більш детальну інформацію, як запропонував Snicolas londatiga.net/it/programming/android/…
Lorensius WL T

31

ВАЖЛИВА ПРИМІТКА:

Якщо ви використовуєте, 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дозволу.

ІНШІ РІШЕННЯ:

Показує додаток Phone із номером, записаним на екрані, тому користувачеві потрібно буде лише натиснути кнопку виклику:

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

Для цього не потрібен дозвіл.


24

Просто простий oneliner без додаткових дозволів:

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

18

використовувати цей повний код

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

1
Ця методика працювала для мене, хоча мені довелося змінити Intent.ACTION_DIAL на Intent.Anction_CALL.
Naeem A. Malik

12

Запит дозволу в маніфесті

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

3
Я думаю, що вам не потрібен дозвіл, оскільки ваш додаток не телефонує сам, а просить спеціалізовану програму (яка має дозвіл) для цього.
Мострапоцький

9

Дозвіл в 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();
    }
}

8

Дозволи:

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

Намір:

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


5

Для здійснення викликової активності за допомогою намірів слід запитати належні дозволи.

Для цього ви включаєте дозволи на використання у файлі 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();
}

4

Для дзвінка з дозвону (немає дозволу):

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

Для прямого дзвінка з програми (потрібне дозвіл):

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

Дозвіл:

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

3

Щоб цього уникнути - можна використовувати GUI для введення дозволів. Eclipse дбає про те, куди вставити тег дозволу, і частіше за все це не правильно


2
// Java
String mobileNumber = "99XXXXXXXX";
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 = "99XXXXXXXX"
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)

1

В Android для певних функцій вам потрібно додати дозвіл на файл Manifest.

  1. Перейдіть до Проектів AndroidManifest.xml
  2. Клацніть на вкладці Дозволи
  3. Клацніть на Додати
  4. Виберіть Дозвіл на використання
  5. Дивіться знімок нижчевведіть тут опис зображення

6.Збережіть файл маніфесту та запустіть проект. Зараз ваш проект повинен працювати як очікувалося.


1
Яку IDE ви використовуєте?
SHA2NK


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

1
 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")));
                }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.