Следуя вашему примеру, строка за строкой:
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
(из извлечено следующее сообщение из моего блога об этом )
. Большая причина не получить ваше разрешение в настоящее время - это потому, что у вашего проекта есть 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 имеется страница, посвященная этому разделу .
Над уровнем 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);
}
}
Так как sdk 23 или выше вводит новый способ запроса разрешений, поэтому, если вы запуститесь в Marshmallow, он покажет эту ошибку.
Решение: установите targetSdkVersion ниже 23 в файл манифеста, такой как thisroid: targetSdkVersion = "21"
разрешение запроса прагматично (после API 23)
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.SEND_SMS},1);
Если вы используете sdk 23 или выше, вы должны проверить разрешения времени выполнения.
Наряду с ответом CommonsWare,
Установлена настройка безопасности (я проверил CM13), чтобы установить предел сообщений SMS. Если вы установите значение «Нет», ОС выведет диалоговое окно для каждого SMS, даже после получения разрешения SMS_SEND во время выполнения. Лучше всего установить это максимально.
Если максимального значения недостаточно, существуют способы увеличить максимальную скорость на корневом устройстве.
, когда вы объявляете permisson
в Manifest
, и это не означает, что вы выполняете Task в MarshMallow
, а для MarshMallow
вы установили Permisson в RunTime
.
, как этот путь
ActivityCompat.requestPermissions();
Я добавил это в свою 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.
}
}
Пожалуйста, перейдите по ссылке ниже, 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
Если вы используете версию Android «23» или «23+», приложение покажет вам ошибки, когда вы пытаетесь получить доступ к чему-либо, что требует разрешения пользователя. Вы должны просить разрешения во время выполнения, даже если вы объявили эти разрешения в манифесте Android.
Проверьте это: https://developer.android.com/training/permissions/requesting. html
Но если вы создали все свое приложение и не хотите меняться в каждом месте, достаточно немного обмануть.
Перейдите в раздел «Сборка. gradle "и изменить целевую версию Sdk на менее чем 23, например 22, 21.
compile 'com.android.support:appcompat-v7:22.2.1'
. Должен ли я изменить это на v4? – Ozzy 6 January 2016 в 16:2723.x.y
, для текущих значений x и y), а не v22, которые вы сейчас используете. – CommonsWare 6 January 2016 в 16:48