Запрос доступа к SEND_SMS и GPS в Android SDK 23

Я относительно новичок в программировании для Android. Пока что я работаю над приложением для обмена сообщениями, которое будет отправлять сообщения через SMS и иметь возможность добавлять к сообщению GPS-координаты. У меня проблема с SDK версии 23, разрешения необходимо запрашивать во время выполнения, и я не нашел хорошего примера, где я могу запросить необходимые разрешения перед запуском приложения. Пример кода, который у меня есть, приведен ниже.

Если я закомментирую этот раздел кода, Android Studio скомпилирует код, но у меня произойдет сбой приложения, когда я нажму кнопку, которая отправляет сообщение. У меня есть соответствующий код в моем AndroidManifest.xml для использования разрешений SMS и GPS.

if (ContextCompat.checkSelfPermission(MainActivity,
Manifest.permission.SEND_SMS)
    != PackageManager.PERMISSION_GRANTED)
{

// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity,
        Manifest.permission.SEND_SMS))
    {

        Toast.makeText(getBaseContext(),
                "Foo Messenger requires permission to send SMS",
                Toast.LENGTH_SHORT).show();

    }

    else
    {

    // No explanation needed, we can request the permission.

    ActivityCompat.requestPermissions(MainActivity,
            new String[]{Manifest.permission.SEND_SMS},
            MY_PERMISSIONS_REQUEST_SEND_SMS);

    }
}

if (ContextCompat.checkSelfPermission(MainActivity,
Manifest.permission.ACCESS_FINE_LOCATION)
    != PackageManager.PERMISSION_GRANTED)
{

    // Should we show an explanation?
    if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity,
            Manifest.permission.ACCESS_FINE_LOCATION))
    {

        Toast.makeText(getBaseContext(),
                "Foo Messenger requires permission to access GPS to be able to send your coordinates",
                Toast.LENGTH_SHORT).show();

    }

    else
    {

        // No explanation needed, we can request the permission.

        ActivityCompat.requestPermissions(MainActivity,
                new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                MY_PERMISSIONS_REQUEST_SEND_SMS);

      }
}

person kgryczan    schedule 01.10.2015    source источник
comment
У меня происходит сбой приложения, когда я нажимаю кнопку, которая отправляет сообщение - используйте LogCat для изучения трассировки стека Java, связанной с вашим сбоем. Вы также можете опубликовать код, который запускается при нажатии кнопки, поскольку я не вижу OnClickListener в том, что вы опубликовали в данный момент.   -  person CommonsWare    schedule 01.10.2015
comment
Мой OnClickListener() только проверяет, содержат ли что-то идентификатор получателя и поля сообщения, а затем вызывает другую функцию для фактического выполнения отправки. Я читал, что любые запросы разрешений, не предоставленные пользователем приложениям, которым требуется доступ к функциям, считающимся «опасными», могут привести к сбою приложений, поэтому я опубликовал только фрагмент для предоставления разрешений.   -  person kgryczan    schedule 02.10.2015
comment
Это проблема, указанная в LogCat '10-02 10:53:52.783 3726-3726/? E/AndroidRuntime﹕ НЕИСПРАВНОЕ ИСКЛЮЧЕНИЕ: основной процесс: MyProcess, PID: 3726 java.lang.SecurityException: Отправка SMS-сообщения: uid 10060 не имеет android.permission.SEND_SMS.'   -  person kgryczan    schedule 02.10.2015
comment
ХОРОШО. Вы выполнили код, указанный в вашем вопросе? Приняли ли вы разрешение в диалоговом окне, появившемся при совершении requestPermissions() звонка? Если вы зайдете в Настройки › Приложения › (ваше приложение) › Разрешения, у вас есть разрешение на SMS? Находится ли ваш элемент <uses-permission> в нужном месте?   -  person CommonsWare    schedule 02.10.2015
comment
Я знаю, что проблема связана с этим фрагментом, так как я зашел в настройки приложения и вручную предоставил разрешения на SMS и местоположение, и кнопка работает должным образом.   -  person kgryczan    schedule 02.10.2015
comment
ХОРОШО. Вы выполнили код, указанный в вашем вопросе? Приняли ли вы разрешение в диалоговом окне, появившемся при совершении requestPermissions() звонка?   -  person CommonsWare    schedule 02.10.2015
comment
Я не могу выполнить код, так как он не компилируется в Android Studio. Вот ошибки, которые я вижу: не удается разрешить символ checkSelfPermission, Manifest.permission.SEND_SMS и PackageManager.PermissionGranted распознаются как неизвестные классы, а MainActivity, передаваемый в Activity.Compat.requestPermissions(), не рассматривается как выражение. Если я смогу получить отлаженные здесь разрешения для SMS, он также отладит другой раздел с разрешениями GPS.   -  person kgryczan    schedule 02.10.2015


Ответы (1)


не могу разрешить символ checkSelfPermission

Вам необходимо обновить артефакт support-v4 до версии 23 в вашем dependencies в app/build.gradle (при условии, что ваше приложение находится в app/):

dependencies {
    compile 'com.android.support:support-v4:23.0.1'
}

Manifest.permission.SEND_SMS и PackageManager.PermissionGranted распознаются как неизвестные классы

Вам нужно добавить операторы import для android.Manifest.permission и android.content.pm.PackageManager.

MainActivity, передаваемая в Activity.Compat.requestPermissions(), не рассматривается как выражение

MainActivity это класс. Предположительно, вы хотите, чтобы этот параметр был this или, может быть, MainActivity.this.

person CommonsWare    schedule 02.10.2015