Apk хорошо работает на Lollipop, но не на Jelly Bean и Marshmallow
Когда я использую свой телефон с Android Lollipop, все мои функции работают хорошо, но, когда я использую Android Marshmallow или приложение Jelly Bean, происходит сбой.
Ниже приведен файл сборки для модуля приложения:
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion '23.0.1'
defaultConfig {
applicationId "com.example.k.sms"
minSdkVersion 14
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
productFlavors {
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.1'
}
И это мой logcat, когда я тестирую свое приложение в эмуляторе с Android Marshmallow.
12-26 19:10:41.860 18000-18000/com.example.k.sms D/AndroidRuntime: Shutting down VM
12-26 19:10:41.860 18000-18000/com.example.k.sms E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.k.sms, PID: 18000
java.lang.SecurityException: Sending SMS message: uid 10057 does not have android.permission.SEND_SMS.
at android.os.Parcel.readException(Parcel.java:1599)
at android.os.Parcel.readException(Parcel.java:1552)
at com.android.internal.telephony.ISms$Stub$Proxy.sendTextForSubscriber(ISms.java:768)
at android.telephony.SmsManager.sendTextMessageInternal(SmsManager.java:310)
at android.telephony.SmsManager.sendTextMessage(SmsManager.java:293)
at com.example.k.sms.MainActivity$3.onClick(MainActivity.java:149)
at android.view.View.performClick(View.java:5198)
at android.view.View$PerformClick.run(View.java:21147)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
2 ответа
targetSdkVersion 23
а также
java.lang.SecurityException: Sending SMS message: uid 10057 does not have android.permission.SEND_SMS.
It seems you just bumped targetSdk
being unaware of consequences. Marshmallow introduces runtime permissions model that kicks off when you target API23 or higher and your app simply must support new runtime permission model as manifest declared permissions are no longer sufficient in such case.
Quick solution is to set targetSdk
в 22
(or lower) as only then runtime permissions won't kick off. Quoting docs:
Во всех версиях Android ваше приложение должно декларировать как обычные, так и опасные разрешения, которые ему необходимы, в манифесте приложения, как описано в разделе "Объявление разрешений". Однако эффект этого объявления различается в зависимости от версии системы и целевого уровня SDK вашего приложения:
- Если устройство работает под управлением Android 5.1 или ниже, или целевой SDK вашего приложения равен 22 или ниже: если вы указываете опасное разрешение в манифесте, пользователь должен предоставить разрешение при установке приложения; если они не дают разрешения, система вообще не устанавливает приложение.
- If the device is running Android 6.0 or higher, and your app's target SDK is 23 or higher: The app has to list the permissions in the manifest, and it must request each dangerous permission it needs while the app is running. Пользователь может предоставлять или отклонять каждое разрешение, и приложение может продолжать работать с ограниченными возможностями, даже если пользователь отклоняет запрос на разрешение.
If you require anything not available in older APIs and must keep targetSdk
23 or higher, then you must have runtime permission supported though (there are some external libs helping with this).
Предоставить смс-разрешение в манифесте для леденца на палочке и других более низких версий и добавить проверки разрешений Marshmallow для более высокого, чем леденец, как объяснено в Разрешении времени выполнения в Android