gpt4 book ai didi

java - 奥利奥,默认短信应用程序和 ACTION_RESPOND_VIA_MESSAGE

转载 作者:太空狗 更新时间:2023-10-29 13:50:35 25 4
gpt4 key购买 nike

针对 Android O 的应用程序在使用服务时有一些新规则,其中之一是我们不能在应用程序处于后台时启动服务。

成为默认 SMS 应用程序的要求之一是:(来自 Telephony.java javadoc)

* <li>In a service, include an intent filter for {@link
* android.telephony.TelephonyManager#ACTION_RESPOND_VIA_MESSAGE}
* (<code>"android.intent.action.RESPOND_VIA_MESSAGE"</code>) with schemas,
* <code>sms:</code>, <code>smsto:</code>, <code>mms:</code>, and <code>mmsto:</code>.
* This service must also require the {@link
* android.Manifest.permission#SEND_RESPOND_VIA_MESSAGE} permission.
* <p>This allows users to respond to incoming phone calls with an immediate text message
* using your app.</p></li>
* </ul>

您可以看到我的问题...因为 ACTION_RESPOND_VIA_MESSAGE 需要具有 SEND_RESPOND_VIA_MESSAGE 权限的服务,如果我们在应用程序处于后台时接到电话,并且用户使用短信拒绝来电,则服务将无法启动。

1237-6018 W/Binder: Binder call failed.
java.lang.IllegalStateException: Not allowed to start service Intent { act=android.intent.action.RESPOND_VIA_MESSAGE dat=smsto:xxxxxxxxx cmp=APP_PACKAGE_NAME (has extras) }: app is in background uid null

知道如何解决这个问题吗?

最佳答案

这不应该是普通 android 的情况,因为默认实现不会调用 SMS 应用程序来拒绝使用消息和使用 SmsManager 的调用。

引用自RespondViaSmsManager.java在 AOSP 奥利奥

/**
* Reject the call with the specified message. If message is null this call is ignored.
*/
private void rejectCallWithMessage(Context context, String phoneNumber, String textMessage,
int subId, String contactName) {
if (TextUtils.isEmpty(textMessage)) {
Log.w(RespondViaSmsManager.this, "Couldn't send SMS message: empty text message. ");
return;
}
if (!SubscriptionManager.isValidSubscriptionId(subId)) {
Log.w(RespondViaSmsManager.this, "Couldn't send SMS message: Invalid SubId: " +
subId);
return;
}

SmsManager smsManager = SmsManager.getSmsManagerForSubscriptionId(subId);
try {
smsManager.sendTextMessage(phoneNumber, null, textMessage, null /*sentIntent*/,
null /*deliveryIntent*/);

SomeArgs args = SomeArgs.obtain();
args.arg1 = !TextUtils.isEmpty(contactName) ? contactName : phoneNumber;
args.arg2 = context;
mHandler.obtainMessage(MSG_SHOW_SENT_TOAST, args).sendToTarget();
} catch (IllegalArgumentException e) {
Log.w(RespondViaSmsManager.this, "Couldn't send SMS message: " +
e.getMessage());
}
}

似乎有些 oem(我在 oneplus 上体验过)对此进行了自定义并保留了需要启动 SMS 应用程序服务的旧行为。不要记住 oreo 中有关于后台服务的限制。

以下是一些投诉:

  1. https://www.reddit.com/r/oneplus/comments/8n9w37/cant_send_text_message_when_rejecting_phone_call/
  2. https://forums.oneplus.com/threads/reject-call-with-sms-is-not-working-after-oreo-update-oxygen-5-0-1-3t.817578/

我在大多数 SMS 应用程序上都遇到过这种行为,包括 Messages来自谷歌的 oneplus 5 和 android 版本 8.1

这仍然没有解释 OEM 如何提供短信应用程序或 SMS Organizer来自 Microsoft 在同一设备上处理此用例。

关于java - 奥利奥,默认短信应用程序和 ACTION_RESPOND_VIA_MESSAGE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48205193/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com