0

当我将手机与 android Lollipop 一起使用时,我的所有功能都运行良好,但是,当我使用 Android Marshmallow 或 Jelly Bean 应用程序崩溃时。

以下是 app 模块的构建 gradle 文件:

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'
}

这是我在模拟器中使用 android Marshmallow 测试我的应用程序时的 logcat

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)
4

2 回答 2

3

targetSdkVersion 23

java.lang.SecurityException:发送短信:uid 10057 没有 android.permission.SEND_SMS。

看来你只是撞到了targetSdk不知道后果。Marshmallow 引入了运行时权限模型,当您以 API23 或更高版本为目标时启动,您的应用程序只需要支持新的运行时权限模型,因为清单声明的权限在这种情况下不再足够。

快速解决方案是设置targetSdk22(或更低),因为只有这样运行时权限才会启动。引用文档

在所有版本的 Android 上,您的应用都需要在其应用清单中声明其所需的正常权限和危险权限,如声明权限中所述。但是,根据系统版本和应用的目标 SDK 级别,该声明的效果会有所不同:

  • 如果设备运行 Android 5.1 或更低版本,或者您的应用的目标 SDK 为 22 或更低版本: 如果您在清单中列出危险权限,则用户必须在安装应用时授予该权限;如果他们不授予权限,则系统根本不会安装该应用程序。
  • 如果设备运行 Android 6.0 或更高版本,并且您的应用的目标 SDK 为 23 或更高版本:应用必须在清单中列出权限,并且必须在应用运行时请求它需要的每个危险权限。用户可以授予或拒绝每个权限,即使用户拒绝权限请求,应用程序也可以继续以有限的功能运行。

如果您需要旧 API 中不可用的任何东西并且必须保持targetSdk23 或更高,那么您必须支持运行时权限(有一些外部库帮助解决此问题)。

于 2016-12-26T19:17:39.180 回答
0

在清单中为棒棒糖和其他较低版本提供 sms 权限,并为高于棒棒糖的版本添加棉花糖权限检查,如 android 中的运行时权限中所述

于 2016-12-28T06:01:28.920 回答