Intereting Posts
Какова наилучшая практика повторного запроса заявок на участие в Volley для Android? Ошибка: Конфигурация с именем «по умолчанию» не найдена в Android Studio Почему divider не отображается в списке @android: id / list? InAppBrowser автоматически воспроизводит видео с vimeo в собственном видеоплеере? Android Display HTML в ListView Атрибут Android Deeplink pathPrefix игнорируется События подключения клиента Wi-Fi к Wi-Fi Как изменить размер AlertDialog на дисплее клавиатуры Отображение значка в строке состояния при выполнении моей задачи Может ли приложение Node.js подключиться к bluetooth на Android? Proguard нарушает аудиофайл в активах или raw Группировка робоэлектрических тестов с использованием junit Category в проекте Android gradle Как получить представление в RecyclerView.Adapter для Snackbar? Как распечатать журнал в файле android c ++? Как использовать ссылки на приложение для передачи параметра на игровой магазин android, который будет извлечен при установке приложения

Должно ли приложение проверять, имеет ли устройство функцию вызова при использовании намерений 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

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