Должно ли приложение проверять, имеет ли устройство функцию вызова при использовании намерений ACTION_DIAL?

У меня есть следующий код в моей программе:

public static void callPhoneNumber(Context context, String clientPhoneNum) { if (isCallingSupported(context)) { Intent i = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + clientPhoneNum)); context.startActivity(i); } else { final AlertDialog alertDialog = new AlertDialog.Builder(context).setMessage(context.getString(R.string.error)) .setMessage(context.getString(R.string.no_call_functionality)) .setPositiveButton(context.getString(R.string.ok), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }) .create(); alertDialog.show(); } } private static boolean isCallingSupported(Context context) { TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); return (telephonyManager.getPhoneType() != TelephonyManager.PHONE_TYPE_NONE); } 

Мне интересно, isCallingSupported() ли isCallingSupported() ? Я точно не помню, почему я написал это так, но теперь, когда я просматриваю, я думаю, что пользователь может просто позвонить по номеру, используя свой Skype или другие приложения VOIP. Должен ли я делать какие-либо другие проверки вместо этого или это намерение безопасно без isCallingSupported() (я имею в виду, что безопасно, даже если у пользователя есть планшет без функций вызова и никаких других приложений, которые могут обрабатывать вызов, намерение не Вызвать сбой)?

Из этого вопроса:

 PackageManager manager = context.getPackageManager(); List<ResolveInfo> infos = manager.queryIntentActivities(intent, 0); if (infos.size() > 0) { //Then there is application can handle your intent }else{ //No Application can handle your intent } 

Начните с проверки того, зарегистрировано ли какое-либо приложение для этого намерения. Если они есть, используйте его. Если нет, отобразите свой диалог.

В итоге вы просто замените функцию isCallingSupported на код выше:

 private static boolean isCallingSupported(Context context) { boolean result = true; PackageManager manager = context.getPackageManager(); List<ResolveInfo> infos = manager.queryIntentActivities(intent, 0); if (infos.size() <= 0) { result = false; } return result; 

}

Я бы использовал resolveActivity() и resolveActivity() чтобы узнать, что-нибудь ответит на ваш настроенный ACTION_DIAL Intent . Это будет работать:

  • Устройства, которые не имеют родной телефонии и не имеют dialer, поскольку resolveActivity() должен возвращать значение null

  • Устройства, которые не имеют родной телефонии, но имеют дозвонщик (например, VOIP), как мы надеемся, авторы этого дозвона имеют поддержку ACTION_DIAL

  • Устройства, которые имеют родную телефонию, но текущий пользователь не имеет доступа к дозвонщику (например, ограниченные профили)