Intereting Posts
Выполнение javascript в фоновом режиме с использованием телефонной заставки Сообщение Android GCM успешно отправлено, но не получено Android Rxjava подписаться на изменение переменной Получение JSON из URL-адреса на Android Как работает «deliveryIntent» в платформе Android SMS? Предоставляет ли веб-браузер Android возможность загружать фотографии, только что снятые с камеры? Удалить программно Синхронизация репо Обнаружение службы BLE для Android (BluetoothGatt # DiscoverServices ()) и Low Energy vs BR / EDR Как переключить диалог прогресса между детерминированными и неопределенными? Android – создайте TextView (или EditText) программно и установите его в определенном месте на экране, давая координаты Разница между Handler.dispatchMessage (msg) и Handler.sendMessage (msg) Может ли метод OnPostExcecute в значениях RETURN в AsyncTask? Как использовать auto-value с firebase 9.2 в Android Как скрыть строку заголовка для Activity в XML с существующей пользовательской темой

Вызывающий номер из dialpad возвращает предупреждение: «Для вызова требуется разрешение, которое может быть отклонено пользователем»

Я пытаюсь в основном набрать номер, когда пользователь нажимает на TextView с номером:

number_title.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent callIntent = new Intent(Intent.ACTION_CALL); callIntent.setData(Uri.parse("tel:+"+user.getTelephone())); activity.startActivity(callIntent); //the above line returns the warning given below } }); 

Предупреждение, которое я получаю:

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

Я понимаю, что приложение должно запрашивать разрешение, если разрешение ранее не было предоставлено. Мой вопрос: как я могу запросить разрешение явно до совершения вызова?

Ну, это о разрешении времени исполнения, поэтому только объявление их в манифесте не будет работать. Вместо этого вы должны проверить право до начала вызова.

Что-то вроде этого должно работать – пользователю будет предложено только разрешение, если он не предоставил его раньше (или если он его отозвал):

 private static final int MY_PERMISSIONS_REQUEST_CALL_PHONE = 1234; public void yourfunction() { number_title.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.CALL_PHONE}, MY_PERMISSIONS_REQUEST_CALL_PHONE); } else { executeCall(); } } }); } private void executeCall() { // start your call here activity.runOnUiThread(new Runnable() { @Override public void run() { Intent callIntent = new Intent(Intent.ACTION_CALL); callIntent.setData(Uri.parse("tel:+"+user.getTelephone())); activity.startActivity(callIntent); } }); } @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case MY_PERMISSIONS_REQUEST_CALL_PHONE: { // If request is cancelled, the result arrays are empty. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // permission was granted, yay! executeCall(); } else { // permission denied, boo! Disable the // functionality that depends on this permission. } return; } } } 

Я взял вышеуказанный код в основном из google: http://developer.android.com/training/permissions/requesting.html Перейдите по ссылке, если вы хотите получить дополнительную информацию.

Изменить: onRequestPermissionsResult будет функцией обратного вызова в вашей деятельности. Возможно, вам придется обращаться с этим вызовом.

Это всего лишь образец справочного вызова для проверки разрешения:

 if(!checkSelfPermission(Manifest.permission. CALL_PHONE)==PackageManager.PERMISSION_GRANTED){ requestPermissions(this,new String {}(Manifest.permission. CALL_PHONE),INT_TO_CHECK RESULT); } 

Дайте мне знать, если это сработает.

Отредактировано: внесены изменения в код для объяснения.

Используйте это, возможно, это сработает:

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