我有一个地理围栏应用程序,允许用户启用选项,以便在他离开设备时将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之前发送短信的永久性权限?
答案 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设备上进行了测试,我没有遇到任何问题。