【问题标题】:Sending a SMS from a foreground service从前台服务发送 SMS
【发布时间】:2018-05-14 14:50:02
【问题描述】:

我有一个地理围栏应用程序,它允许用户启用一个选项,以便在他离开设备时向预编程号码发送短信。这发生在前台服务中。

当用户在设置中激活此选项时,我开始请求所需权限的过程:

   if (key.equals(getString(R.string.pref_sms_alert)))
    {
        if (Prefs.getBoolean(R.string.pref_sms_alert, false))
        {
            if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED)
            {
                ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.SEND_SMS}, 1);
            }
        }
    }

public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults)
{
    switch (requestCode)
    {
        case 1:
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED)
            {
                Prefs.put(R.string.pref_sms_alert, true);
            }
            else
            {
                Prefs.put(R.string.pref_sms_alert, false);
            }
            break;


    }
}

SMS 在前台服务中通过以下方式发送:

    if (Prefs.getBoolean(R.string.pref_sms_alert, false))
    {
        SmsManager smsManager = SmsManager.getDefault();
        smsManager.sendTextMessage(Prefs.getString(R.string.pref_sms_receiver, ""),
                                    null,
                                    getString(R.string.txt_sms_alert),
                                   null, null);
    }

这适用于 Android 6+。

当我使用旧版本 (Kitkat) 尝试此操作时,发送 SMS 时会要求用户授予权限。他不能做什么,因为他不在设备旁。

如何在 Android 6 之前授予发送 SMS 的永久权限?

【问题讨论】:

    标签: android permissions sms


    【解决方案1】:

    Api 23 之前的应用在安装时接受所有权限,而不是在运行时。所以问题是onRequestPermissionsResult 仅在授予权限时才被调用。如果应用程序已经拥有权限,则不会调用该方法,因此添加以下内容:

    if (key.equals(getString(R.string.pref_sms_alert)))
    {
        if (Prefs.getBoolean(R.string.pref_sms_alert, false))
        {
            if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED)
            {
                ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.SEND_SMS}, 1);
            } else
            {
                Prefs.put(R.string.pref_sms_alert, true);
            }
        }
    }
    

    这样,如果权限已经由应用拥有,它仍然可以工作。

    【讨论】:

    • 您添加的 else-branch 不会更改任何内容,因为此时首选项已经为真。但无论如何,这是一个有争议的问题,因为问题完全不同 - 请参阅下面的答案。
    【解决方案2】:

    原来是用于测试的特定设备的问题。 安装了第 3 方权限管理软件,在实际发送 SMS 时再次请求权限。

    我在没有此软件的 Lollypop 设备上对其进行了测试,没有任何问题。

    【讨论】:

      猜你喜欢
      • 2018-08-09
      • 2023-03-12
      • 1970-01-01
      • 2021-06-26
      • 2016-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-09
      相关资源
      最近更新 更多