Android 自动恢复到以前的默认短信应用程序

Android 自动恢复到以前的默认短信应用程序,android,android-intent,sms,android-4.4-kitkat,telephony,Android,Android Intent,Sms,Android 4.4 Kitkat,Telephony,我有一个需要临时访问设备短信的应用程序。在KitKat及以上版本中,此访问权限仅授予默认SMS应用程序,因此我使用: Intent intent = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT); intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, getPackageName()); startActivity(intent); 这会弹出一个对话框,询问用户是否允

我有一个需要临时访问设备短信的应用程序。在KitKat及以上版本中,此访问权限仅授予默认SMS应用程序,因此我使用:

Intent intent = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT);
intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, getPackageName());
startActivity(intent);
这会弹出一个对话框,询问用户是否允许我的应用程序成为默认短信应用程序。到现在为止,一直都还不错。问题是,一旦我的应用程序完成操作,我必须再次询问用户,他们是否希望将以前的应用程序恢复为默认短信应用程序


我想要一种避免出现第二个对话框的方法,也许是让我的应用程序告诉安卓操作系统,它不再希望成为默认的短信应用程序,这样以前的应用程序就可以自动再次接管。我知道Android支持这一点,因为如果我卸载我的应用程序,而它是默认的短信应用程序,Android将自动恢复到上一个,而无需用户输入。有没有办法在不卸载的情况下复制这种放弃控制的行为?

要成为默认的消息传递应用程序,您的应用程序必须在清单中注册某些活动组件。禁用其中任何一个都将使您的应用程序不合格,系统应自动恢复默认设置。我们可以使用
PackageManager#setComponentEnabledSetting()
方法禁用清单注册的组件

例如,如果您为
SMS\u DELIVER
操作注册的接收器名为
SmsReceiver

getPackageManager()
    .setComponentEnabledSetting(new ComponentName(this, SmsReceiver.class),
                                PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                                PackageManager.DONT_KILL_APP);

显然,在您的应用程序可以再次设置为默认值之前,您需要重新启用该组件,您可以通过调用上面的方法,将
PackageManager.component\u ENABLED\u STATE\u ENABLED
作为第二个参数来实现这一点。

这是可行的,但有时它会终止应用程序。发生在Android 10设备上。