从前台服务发送SMS

时间:2018-05-14 14:50:02

标签: android permissions sms

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

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

   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)时,请求用户在发送短信时给予许可。他不能做的是因为他不在设备上。

如何在Android 6之前发送短信的永久性权限?

2 个答案:

答案 0 :(得分:0)

在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);
        }
    }
}

这样,如果该应用已拥有该权限,则该权限仍然有效。

答案 1 :(得分:0)

结果证明是用于测试的特定设备的问题。 安装了第三方权限管理软件,当实际发送SMS时再次询问权限。

我在没有这个软件的情况下在Lollypop设备上进行了测试,我没有遇到任何问题。