Сообщение SMS: Android java.lang.IllegalStateException [duplicate]

Следуя вашему примеру, строка за строкой:

a = {}

a теперь ссылается на новый объект.

b = a;

b теперь ссылается на тот же объект, что a Рекомендации. Обратите внимание, что это не ссылается на a.

a['one'] = {};

Новый объект теперь имеет индекс 'one', который ссылается на другой новый объект.

Когда вы делаете

a = a['one'];

Вы устанавливаете a для обозначения a['one'], который является тем новым созданным вами объектом, когда вы делали a['one'] = {}. b по-прежнему ссылается на объект, созданный с помощью a = {}.

Вы путаете проблему, когда говорите: «a потерял ссылку на b», потому что a не ссылается на b, и наоборот. a и b относятся к объектам , и их можно заставить ссылаться на другие объекты. Например:

С помощью a = {}; b = a вы получаете

a
 \
  \
   { }
  /
 /
b

Затем с a['one'] = {} вы получаете

a
 \
  \
   { one: { } }
  /
 /
b

Затем с помощью a = a['one'] вы get

a - - - - 
          \
   { one: { } }
  /
 /
b
122
задан Min Phone 22 March 2018 в 06:17
поделиться

10 ответов

(из извлечено следующее сообщение из моего блога об этом )

. Большая причина не получить ваше разрешение в настоящее время - это потому, что у вашего проекта есть targetSdkVersion 23 или выше, и разрешение, которое вы запрашиваете, является «опасным». В Android 6.0 это включает в себя:

  • ACCESS_COARSE_LOCATION
  • ACCESS_FINE_LOCATION
  • ADD_VOICEMAIL
  • BODY_SENSORS
  • CALL_PHONE
  • CAMERA
  • GET_ACCOUNTS
  • PROCESS_OUTGOING_CALLS
  • READ_CALENDAR
  • READ_CALL_LOG
  • READ_CELL_BROADCASTS
  • READ_CONTACTS
  • READ_EXTERNAL_STORAGE
  • READ_PHONE_STATE
  • READ_SMS
  • RECEIVE_MMS
  • RECEIVE_SMS
  • RECEIVE_WAP_PUSH
  • RECORD_AUDIO
  • SEND_SMS
  • USE_SIP
  • WRITE_CALENDAR
  • WRITE_CALL_LOG
  • WRITE_CONTACTS
  • WRITE_EXTERNAL_STORAGE

Для этих разрешений не только для вашего targetSdkVersion 23+ приложения необходимо иметь <uses-permission> элемент (ы), но вы также должны запрашивать эти разрешения во время выполнения от пользователя на устройствах Android 6.0+, используя такие методы, как checkSelfPermission() и requestPermissions().

Как временный обходной путь, оставьте targetSdkVersion ниже 23.

Однако, в конце концов, у вас будет некоторая причина, чтобы ваш targetSdkVersion был 23 или выше. В то время вам нужно будет настроить приложение, чтобы использовать новую систему разрешения во время выполнения. В документации для Android имеется страница, посвященная этому разделу .

194
ответ дан CommonsWare 16 August 2018 в 03:39
поделиться
  • 1
    Большое спасибо, я использовал методы requestPermissions (), и я работал хорошо – Nathan Loudjani 17 September 2015 в 17:15
  • 2
    Хорошо, я попытался это сделать раньше, но не смог получить методы ContextCompat.checkSelfPermission и ActivityCompat.requestPermissions, они дают мне ошибку «not found» в именах методов. Я предполагаю, что это связано с отсутствующей библиотекой, похоже, она находится в пакете v4, но моя единственная зависимость от gradle - compile 'com.android.support:appcompat-v7:22.2.1'. Должен ли я изменить это на v4? – Ozzy 6 January 2016 в 16:27
  • 3
    @Ozzy: вам нужно быть в v23 поколения библиотек поддержки (23.x.y, для текущих значений x и y), а не v22, которые вы сейчас используете. – CommonsWare 6 January 2016 в 16:48
  • 4
    Спасибо, на будущее, я думаю. На данный момент я сменил цель на v22, и даже несмотря на то, что для SD-карты было установлено значение 200 МБ на эмуляторе, это дало мне ошибку SD-карты, не установленную. Но потом я подключил свой телефон в режиме разработчика, и все работает. По какой-то причине хранение SD-карт работает на эмуляторе, работающем с v23, но не на v22. – Ozzy 6 January 2016 в 16:54
  • 5
    @NathanLoudjani Не могли бы вы поделиться своим кодом, который это реализует? Я нахожусь в одной и той же лодке и изо всех сил пытаюсь вложить это в свою деятельность. – dschuett 23 January 2016 в 04:52

Над уровнем API 23 вы получите прагматическое разрешение:

    private static final int PERMISSION_REQUEST_CODE = 1;

    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {

        if (checkSelfPermission(Manifest.permission.SEND_SMS)
                == PackageManager.PERMISSION_DENIED) {

            Log.d("permission", "permission denied to SEND_SMS - requesting it");
            String[] permissions = {Manifest.permission.SEND_SMS};

            requestPermissions(permissions, PERMISSION_REQUEST_CODE);

        }
    }
22
ответ дан Alexis Wilke 16 August 2018 в 03:39
поделиться

Так как sdk 23 или выше вводит новый способ запроса разрешений, поэтому, если вы запуститесь в Marshmallow, он покажет эту ошибку.

Решение: установите targetSdkVersion ниже 23 в файл манифеста, такой как thisroid: targetSdkVersion = "21"

-3
ответ дан Biswajit Karmakar 16 August 2018 в 03:39
поделиться

разрешение запроса прагматично (после API 23)

ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.SEND_SMS},1);
6
ответ дан Dan Alboteanu 16 August 2018 в 03:39
поделиться

Если вы используете sdk 23 или выше, вы должны проверить разрешения времени выполнения.

5
ответ дан Dharmendra Pratap 16 August 2018 в 03:39
поделиться

Наряду с ответом CommonsWare,

Установлена ​​настройка безопасности (я проверил CM13), чтобы установить предел сообщений SMS. Если вы установите значение «Нет», ОС выведет диалоговое окно для каждого SMS, даже после получения разрешения SMS_SEND во время выполнения. Лучше всего установить это максимально.

Если максимального значения недостаточно, существуют способы увеличить максимальную скорость на корневом устройстве.

1
ответ дан Duminda Jayasena 16 August 2018 в 03:39
поделиться

, когда вы объявляете permisson в Manifest, и это не означает, что вы выполняете Task в MarshMallow, а для MarshMallow вы установили Permisson в RunTime.

, как этот путь

ActivityCompat.requestPermissions();
4
ответ дан Ironman 16 August 2018 в 03:39
поделиться

Я добавил это в свою MainActivity, которая разрешает мою проблему

       int MY_PERMISSIONS_REQUEST_READ_CONTACTS=0;
// Here, thisActivity is the current activity
        if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {

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

                // Show an expanation to the user *asynchronously* -- don't block
                // this thread waiting for the user's response! After the user
                // sees the explanation, try again to request the permission.

            } else {

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

                ActivityCompat.requestPermissions(this,
                        new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                        MY_PERMISSIONS_REQUEST_READ_CONTACTS);

                // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
                // app-defined int constant. The callback method gets the
                // result of the request.
            }
        }
1
ответ дан Masquitos 16 August 2018 в 03:39
поделиться

Пожалуйста, перейдите по ссылке ниже, https://developer.android.com/guide/topics/permissions/overview.html

Некоторые образцы также доступны там, чтобы начните с разрешений.

Чтобы сделать Android более безопасным, разработчики теперь должны указать разрешение в манифесте, а также должны спросить пользователя также во время выполнения, чтобы выполнить эту работу. Это разрешено категоризировать в разделе опасных разрешений, которые упоминаются ниже

КАЛЕНДАРЬ

READ_CALENDAR

WRITE_CALENDAR

CAMERA

CAMERA

КОНТАКТЫ

READ_CONTACTS
WRITE_CONTACTS
GET_ACCOUNTS

РАСПОЛОЖЕНИЕ

ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION

МИКРОФОН

RECORD_AUDIO

PHONE

READ_PHONE_STATE
READ_PHONE_NUMBERS
CALL_PHONE
ANSWER_PHONE_CALLS (must request at runtime)
READ_CALL_LOG
WRITE_CALL_LOG
ADD_VOICEMAIL
USE_SIP
PROCESS_OUTGOING_CALLS
ANSWER_PHONE_CALLS

ДАТЧИКИ

BODY_SENSORS

SMS

SEND_SMS
RECEIVE_SMS
READ_SMS
RECEIVE_WAP_PUSH
RECEIVE_MMS

ХРАНЕНИЕ

READ_EXTERNAL_STORAGE
WRITE_EXTERNAL_STORAGE
4
ответ дан Paolo 16 August 2018 в 03:39
поделиться

Если вы используете версию Android «23» или «23+», приложение покажет вам ошибки, когда вы пытаетесь получить доступ к чему-либо, что требует разрешения пользователя. Вы должны просить разрешения во время выполнения, даже если вы объявили эти разрешения в манифесте Android.

Проверьте это: https://developer.android.com/training/permissions/requesting. html

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

Перейдите в раздел «Сборка. gradle "и изменить целевую версию Sdk на менее чем 23, например 22, 21.

1
ответ дан Zohaib Hassan 16 August 2018 в 03:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: