Я относительно новичок в Android, поэтому буду благодарен за любую помощь. Я написал простое приложение-справочник, чтобы перечислить контакты нашей организации. После выбора контакта вы можете нажать одну из двух кнопок: «Позвонить» или «Текст». Когда кнопка «Вызов» нажата, он инициирует телефонный звонок этому человеку, а когда нажимается кнопка «Текст», он инициирует SMS-сообщение, адресованное этому человеку. Вот мой код:
private void makePhoneCall() {
if (ContextCompat.checkSelfPermission(EntryDetailActivity.this,
Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(EntryDetailActivity.this,
new String[] {Manifest.permission.CALL_PHONE}, REQUEST_CALL);
} else {
String dial = "tel:" + currentPhoneNumber;
startActivity(new Intent(Intent.ACTION_CALL, Uri.parse(dial)));
}
}
private void sendSMS() {
if (ContextCompat.checkSelfPermission(EntryDetailActivity.this,
Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(EntryDetailActivity.this,
new String[] {Manifest.permission.SEND_SMS}, REQUEST_SMS);
} else {
String dial = "sms:" + currentPhoneNumber;
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(dial)));
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == REQUEST_CALL) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
makePhoneCall();
} else {
Toast.makeText(this, "Please grant permission to make call!", Toast.LENGTH_SHORT).show();
}
}
if (requestCode == REQUEST_SMS) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
sendSMS();
} else {
Toast.makeText(this, "Please grant permission to send text messages!", Toast.LENGTH_SHORT).show();
}
}
}
А вот что у меня в файле AndroidManifest.xml:
<uses-permission android:name = "android.permission.CALL_PHONE" />
<uses-permission android:name = "android.permission.SEND_SMS" />
После отправки в магазин Google Play я получаю электронное письмо от Google, в котором говорится:
Необходимое действие
Ознакомьтесь с политикой разрешений и статьей Справочного центра Play Console, в которой описаны предполагаемое использование, исключения, недопустимое использование и альтернативные варианты использования разрешений журнала вызовов или SMS, чтобы определить, какие из следующих параметров применимы к затронутым приложениям. ):
Вариант 1) Вашему приложению не требуется доступ к разрешениям для журнала вызовов или SMS: удалите указанные разрешения из манифеста приложения или перейдите к альтернативной реализации до 9 января 2019 г. Если вам требуется дополнительное время для удаления разрешений или перехода на альтернативный вариант Чтобы запросить продление до 9 марта 2019 г., отправьте форму декларации разрешений.
Вариант 2) Ваше приложение является обработчиком по умолчанию, или вы считаете, что ваше приложение подходит для исключения: если вы еще этого не сделали, отправьте запрос с помощью формы декларации разрешений до 9 января 2019 г. В настоящее время мы рассматриваем заявки и будем ответьте на ваш запрос. Примечание. Вам не нужно вносить изменения в свое приложение, чтобы иметь право отправить запрос. Убедитесь, что ваше приложение в остальном соответствует всем другим политикам программы для разработчиков, чтобы предотвратить удаление вашего приложения.
Мы ценим вашу постоянную поддержку, чтобы сделать Google Play приятным как для разработчиков, так и для наших пользователей.
Что я делаю неправильно?
Обратите внимание, что здесь вам не нужно разрешение SEND_SMS для вашего кода, и если вы переключитесь на ACTION_DIAL вместо ACTION_CALL, вы также можете избавиться от разрешения CALL_PHONE.
@CommonsWare Спасибо! Итак, просто переключившись на ACTION_DIAL, я могу удалить оба разрешения из AndroidManifest.xml и по-прежнему правильно работать с приложением?
@DavidB: Да. CALL_PHONE нужен только для ACTION_CALL (прямой телефонный звонок). Для ACTION_DIAL это не требуется (вызов номеронабирателя с предварительно заполненным номером, поэтому пользователю просто нужно нажать кнопку «вызвать», чтобы совершить вызов). SEND_SMS необходим только в том случае, если вы используете SmsManager для прямой отправки SMS. Использование ACTION_SENDTO с smsto:Uri или надежда на лучшее с вашим ACTION_VIEW / sms:Uri не требует этого разрешения.




Google пометил CALL_PHONE, SEND_SMS и т. д. Как конфиденциальное разрешение. Поскольку они содержат личные данные, никто не может злоупотребить этими данными, если они не контролируются должным образом, или не могут вызвать / отправить сообщение на любой подозрительный номер.
Они пытаются сделать следующее: те приложения, которые в первую очередь не зависят от этого разрешения, например, обычное приложение, которому требуется проверка по смс или что-то подобное, лишают их этого разрешения. И только те приложения, основная функция которых зависит от этого разрешения, должны иметь эти разрешения, такие как приложение Carrier, которое используется исключительно в зависимости от этого разрешения.
Эй, а что, если мое приложение не использует смс и разрешение журнала вызовов, то что мне заполнять в форме объявления! ??
What am I doing wrong?
Прямо сейчас вы:
ACTION_CALL иACTION_VIEWsms:UriИспользование Intent для запуска SMS-клиента не требует разрешения SEND_SMS. Это разрешение необходимо, если вы использовали SmsManager для прямой отправки SMS. Итак, вы можете удалить разрешение SEND_SMS из своего манифеста и кода, чтобы прояснить это.
Вам необходимо разрешение CALL_PHONE, чтобы использовать ACTION_CALL для прямого телефонного звонка. Если бы вы были готовы использовать ACTION_DIAL, вы могли бы избавиться от разрешения CALL_PHONE. Цена заключается в том, что ACTION_DIAL просто вызывает дозвонщик на желаемый номер телефона, заставляя пользователя нажать кнопку, чтобы сделать звонок. Я предполагаю, что здесь есть разумный компромисс, поскольку ваш SMS-код на самом деле не отправляет SMS, а вызывает приложение, которое может отправлять SMS. Использование ACTION_DIAL привнесет параллелизм в ваши действия и позволит вам удалить оба разрешения.
Пользуюсь smsManager. Почему мое приложение для отправки смс отклонено?
Google больше не разрешает публиковать приложения с такими разрешениями в Play Store, если это не основная функция приложения. Это довольно хорошо объяснено прямо здесь, но они также должны были связать вас со страницей со всей информацией об изменении политики и о том, что вы можете сделать, чтобы подать запрос на освобождение.