Apk在Lollipop上运行良好,但在Jelly Bean和Marshmallow上运行不佳

时间:2016-12-26 18:55:23

标签: java android android-6.0-marshmallow android-4.1-jelly-bean

当我在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)

2 个答案:

答案 0 :(得分:3)

  

targetSdkVersion 23

  

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

看来你刚刚碰到targetSdk没有意识到后果。 Marshmallow引入了运行时权限模型,该模型在您定位API23或更高版本时启动,并且您的应用程序必须支持新的运行时权限模型,因为在这种情况下清单声明的权限不再足够。

快速解决方案是将targetSdk设置为22(或更低),因为只有运行时权限才会启动。引用docs

  

在所有Android版本上,您的应用都需要声明正常   以及它在应用程序清单中需要的危险权限   在声明权限中描述。但是,效果呢   声明因系统版本和您的而异   应用程序的目标SDK级别:

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

如果您需要旧API中没有的任何东西,并且必须保持targetSdk 23或更高,那么您必须支持运行时权限(有一些外部库帮助这个)。

答案 1 :(得分:0)

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