2015-01-26 4 views
5

Я получаю ActivityNotFoundException при выполнении операции Intent.ACTION_CALL. Я нашел много ссылок, но все это не могло решить мою проблему.ActivityNotFoundException при вызове Intent.ACTION_CALL

Это иногда дает мне исключение как

android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.CALL dat=tel:xxx-xxx-xxxx pkg=com.android.phone (has extras) } 

Я использовал следующий код в моем проекте

String contact_number="123456789"; 
Intent callIntent = new Intent(Intent.ACTION_CALL); 
callIntent.setData(Uri.parse("tel:" + contact_number)); 
startActivity(callIntent); 
+0

Не является ли 'ACTION_DIAL' правильным? я не думаю, что вы можете начать звонок без ввода пользователем. – TheRedFox

+0

Вы вызываете номер - так какой ввод вам нужен, если он у вас уже есть? –

+0

Я получаю контактный номер от пользователя, это был просто пример, который я использовал в моем вопросе. Я не могу использовать ACTION_DIAL, потому что мне нужно позвонить, не показывая dial-up –

ответ

8

Вы должны проверить, есть ли какие-либо действия, которые обрабатывают это намерение, прежде чем начать его. Это может случиться, если ваше приложение работает на планшете с Wi-Fi только и не имеет возможности телефона. Также, если вы только собираетесь запускать дозвонщик, лучше используйте ACTION_DIAL, чем ACTION_CALL, который делает звонок непосредственно из вашего приложения.

final Intent dialIntent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:")); 
if (dialIntent.resolveActivity(context.getPackageManager()) != null) { 
    // put your logic to launch call app here 
    } 
+0

Какая часть моего ответа неверна? Я ничего не говорил о разрешении. И официальная документация также рекомендует ACTION_DIAL над ACTION_CALL http://developer.android.com/reference/android/content/Intent.html#ACTION_CALL – hidro

+0

Я уже получил разрешение Я не могу использовать ACTION_DIAL, потому что мне нужно напрямую позвонить, не показывая dial-up. –

+0

Эта проблема возникла в версии LG Nexus-4 (5.0.1), а не в Tablet –

12

Нет гарантии, что данное намерение может быть обработано (например, планшеты могут вообще не иметь приложения для телефонии). Если нет приложения с intent-filter в соответствии с вашими намерениями, вы столкнетесь с исключением ActivityNotFoundException. Правильный подход должен быть осведомлен об этом и использовать try/catch, чтобы победить аварии и должным образом восстановить:

try { 
    String contact_number="123456789"; 
    Intent callIntent = new Intent(Intent.ACTION_CALL); 
    callIntent.setData(Uri.parse("tel:" + contact_number)); 
    startActivity(callIntent); 
} catch (Exception e) { 
    // no activity to handle intent. show error dialog/toast whatever 
} 

Кроме того, вы должны быть достаточно, используя ACTION_DIAL вместо этого, поскольку ACTION_CALL требует дополнительного разрешения.

+1

Я не думаю, что использование try-catch я бы решил свою проблему –

+0

Это сработало для меня, –

5

Я решил эту проблему. Я использовал следующий код

String contact_number="123456789"; 
Intent callIntent = new Intent(Intent.ACTION_CALL); 
intent.setPackage("com.android.phone"); 
callIntent.setData(Uri.parse("tel:" + contact_number)); 
startActivity(callIntent); 

я заменил эту линию для Lollipop

intent.setPackage("com.android.phone"); 

с

intent.setPackage("com.android.server.telecom"); 
0

это мой код.

if (BuildUtil.isAndroidM()) { 
     if (ActivityCompat.checkSelfPermission(mActivity, 
       Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) { 
      ActivityCompat.requestPermissions(mActivity, PermissionUtil.requestPermissionFineAndCoarse(), 
        PHONE_REQUEST_CODE); 
     } 
    } else { 
     Intent callIntent = new Intent(Intent.ACTION_CALL); 
     if (BuildUtil.isAndroidL()) { 
      callIntent.setPackage("com.android.server.telecom"); 
     } else { 
      callIntent.setPackage("com.android.phone"); 
     } 
     callIntent.setData(Uri.parse("tel:" + phone)); 
     startActivity(callIntent); 
    } 
Смежные вопросы