通过 SmsManager 发送短信时应用程序崩溃

App crashes while sending SMS via SmsManager

我正在尝试使用 SmsManager 为某些设备发送 SMS,它正在为某些设备发送 SMS,它正在崩溃应用程序。我的设备没有崩溃,但在客户端设备上崩溃了。

我的代码:

 private void sendMessage() {
    if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.SEND_SMS) == PackageManager.PERMISSION_GRANTED) {

        SmsManager smsManager = SmsManager.getDefault();
        smsManager.sendMultipartTextMessage(mobileNumber, null, smsManager.divideMessage(msg), null, null);
        Snackbar.make(findViewById(android.R.id.content), "Message Sent",
                Snackbar.LENGTH_SHORT).show();

    } else {
        String requestPermissionArray[] = {Manifest.permission.SEND_SMS};
        ActivityCompat.requestPermissions(this, requestPermissionArray, PERMISSION_REQUEST_CODE_SEND_SMS);
    }
}

@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                           @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            switch (requestCode) {
                case PERMISSION_REQUEST_CODE_SEND_SMS:
                    sendMessage();
                    break;
            }
        }
    }

AndroidManifest.xml

<uses-permission android:name="android.permission.SEND_SMS" />

我在 Crashlytics 中收到的崩溃日志

1

Caused by java.lang.SecurityException
   at android.os.Parcel.createException(Parcel.java:1950)
   at android.os.Parcel.readException(Parcel.java:1918)
   at android.os.Parcel.readException(Parcel.java:1868)
   at com.android.internal.telephony.ISms$Stub$Proxy.isImsSmsSupportedForSubscriber(ISms.java:1422)
   at android.telephony.SmsManager.isImsSmsSupported(SmsManager.java:1410)
   at android.telephony.SmsMessage.useCdmaFormatForMoSms(SmsMessage.java:841)
   at android.telephony.SmsMessage.useCdmaFormatForMoSms(SmsMessage.java:827)
   at android.telephony.SmsMessage.fragmentText(SmsMessage.java:373)
   at android.telephony.SmsManager.divideMessage(SmsManager.java:603)
   at in.onlineneta.app.ui.activity.VoterDetailsActivity.sendMessage(VoterDetailsActivity.java:640)
   at in.onlineneta.app.ui.activity.VoterDetailsActivity.onRequestPermissionsResult(VoterDetailsActivity.java:806)
   at android.app.Activity.dispatchRequestPermissionsResult(Activity.java:7630)
   at android.app.Activity.dispatchActivityResult(Activity.java:7480)
   at android.app.ActivityThread.deliverResults(ActivityThread.java:4489)
   at android.app.ActivityThread.handleSendResult(ActivityThread.java:4538)
   at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:49)
   at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
   at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1906)
   at android.os.Handler.dispatchMessage(Handler.java:106)
   at android.os.Looper.loop(Looper.java:193)
   at android.app.ActivityThread.main(ActivityThread.java:6863)
   at java.lang.reflect.Method.invoke(Method.java)
   at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:537)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

2

Fatal Exception: java.lang.RuntimeException: Failure delivering result ResultInfo{who=@android:requestPermissions:, request=2246, result=-1, data=Intent { act=android.content.pm.action.REQUEST_PERMISSIONS (has extras) }} to activity {in.onlineneta.app/in.onlineneta.app.ui.activity.VoterDetailsActivity}: java.lang.SecurityException
   at android.app.ActivityThread.deliverResults(ActivityThread.java:4496)
   at android.app.ActivityThread.handleSendResult(ActivityThread.java:4538)
   at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:49)
   at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
   at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1906)
   at android.os.Handler.dispatchMessage(Handler.java:106)
   at android.os.Looper.loop(Looper.java:193)
   at android.app.ActivityThread.main(ActivityThread.java:6863)
   at java.lang.reflect.Method.invoke(Method.java)
   at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:537)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

请在清单中确保此权限

   <uses-permission android:name="android.permission.READ_PHONE_STATE"/>

这里是 Android 版本的代码,它比 lollipop

   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
                SubscriptionManager subscriptionManager = SubscriptionManager.from(getApplicationContext());
                int subID = 0;

                if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
                    // TODO: Consider calling
                    //    ActivityCompat#requestPermissions
                    // here to request the missing permissions, and then overriding
                    //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
                    //                                          int[] grantResults)
                    // to handle the case where the user grants the permission. See the documentation
                    // for ActivityCompat#requestPermissions for more details.
                    return;
                }
                List<SubscriptionInfo> subscriptionInfoList = subscriptionManager.getActiveSubscriptionInfoList();
                for (SubscriptionInfo subscriptionInfo : subscriptionInfoList) {
                    if (subscriptionInfo.getSimSlotIndex() == simID) {
                        subID = subscriptionInfo.getSubscriptionId();
                        break;
                    }
                }
                smsManager = SmsManager.getSmsManagerForSubscriptionId(subID);

                if (textSMS.length() > 160) {
                    smsIntent = getMultipartSMSIntent(smsManager, textSMS, sentIntent, deliveryIntent);
                    smsManager.sendMultipartTextMessage(mobile, null, messageList, smsIntent.getSentIntents(), smsIntent.getDeliveryIntents());
                } else {
                    smsIntent = getSMSIntent(sentIntent, deliveryIntent);
                    smsManager.sendTextMessage(mobile, null, textSMS, smsIntent.getmPendingIntent(), smsIntent.getmDeliveryIntent());
                }
            }