如何在Android Kitkat中设置我的短信应用程序默认值?

如何在Android Kitkat中设置我的短信应用程序默认值?,android,sms,android-4.4-kitkat,Android,Sms,Android 4.4 Kitkat,我制作了一个安卓手机短信应用程序,在这个应用程序中,我可以像安卓手机短信应用程序那样发送和接收短信。现在我已经将目标设置为4.4(Android KitKat版本),但Android KitKat有新的“默认消息传递”应用程序设置,用户可以一次选择一个应用程序进行消息传递。我按照中的步骤为我的短信应用程序选择选项作为默认应用程序,但在设置中,我的应用程序从未出现在选择默认短信应用程序的弹出窗口中 下面是我在guid中使用的java代码 if( androidOS.contains("4.4")

我制作了一个安卓手机短信应用程序,在这个应用程序中,我可以像安卓手机短信应用程序那样发送和接收短信。现在我已经将目标设置为4.4(Android KitKat版本),但Android KitKat有新的“默认消息传递”应用程序设置,用户可以一次选择一个应用程序进行消息传递。我按照中的步骤为我的短信应用程序选择选项作为默认应用程序,但在设置中,我的应用程序从未出现在选择默认短信应用程序的弹出窗口中

下面是我在guid中使用的java代码

if( androidOS.contains("4.4") ){


if (! Telephony.Sms.getDefaultSmsPackage(this).equals(myPackageName) ) {

// App is not default.
// Show the "not currently set as the default SMS app" interface

builder = new AlertDialog.Builder(MyConversation.this);
builder.setMessage("Shoot The Messenger is not set as your default messaging app. Do you want to set it default?")
.setCancelable(false)
.setTitle("Alert!")
.setNegativeButton("No", new DialogInterface.OnClickListener() {

@Override
public void onClick(DialogInterface dialog, int which) {


}
})
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@TargetApi(19)
public void onClick(DialogInterface dialog, int id) {

Intent intent =
new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT);

intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME,
getPackageName());

startActivity(intent);

}
});
builder.show();


}


}
我还在
Manifest
文件中添加了下面的代码

<?xml version="1.0" encoding="utf-8"?>


更新:

注意:我正在Emulator上测试。。。 在完成所有步骤后,我只看到Android的默认消息应用程序,而不是我的,如下图所示。任何形式的帮助都将不胜感激。提前谢谢

您发布的内容是正确的-问题是您必须实现所有所需功能:

  • 在广播接收器中,包括一个用于
    SMS\u DELIVER\u ACTION
    (“
    android.provider.Telephony.SMS\u DELIVER
    ”)的意图过滤器。广播接收器还必须获得广播\u SMS许可。 这允许您的应用程序直接接收传入的SMS消息

  • 在广播接收器中,包括用于
    WAP\u PUSH\u DELIVER\u动作
    (“
    android.provider.Telephony.WAP\u PUSH\u DELIVER
    ”)的意图过滤器,MIME类型为“
    application/vnd.WAP.mms message
    ”。广播接收器还必须需要广播WAP PUSH权限。 这允许您的应用程序直接接收传入的彩信

  • 在传递新消息的活动中,包括一个意向过滤器,用于带有模式的
    ACTION\u SENDTO
    (“
    android.intent.ACTION.SENDTO
    ”)、
    smsto:
    mms:
    、和
    mmsto:
    。 这允许您的应用程序接收来自其他希望传递消息的应用程序的意图

  • 在一项服务中,包括一个意向过滤器,用于通过消息(“
    android.intent.ACTION.RESPONSE\u VIA\u MESSAGE
    ”)对
    sms:
    smsto:
    mms:
    ,和
    mmsto:
    )模式进行过滤。此服务还必须具有
    SEND\u RESPOND\u VIA\u MESSAGE
    权限


如果没有全部四项要求,您的应用程序将不会列在默认短信选择对话框中。

如果您没有实现所有四项要求,您的应用程序将不会列为默认短信应用程序。即使你的应用程序不支持彩信,你也必须将其添加到你的manifiest文件中。这并不意味着你必须为他们实施活动、服务或接收者。将这些添加到您的manifiest文件中,您的短信将作为默认短信应用程序列出。请随意忽略任何lint错误

<!-- BroadcastReceiver that listens for incoming MMS messages -->
    <receiver android:name=".MmsReceiver"
              android:enabled="@bool/is_kitkat"
              android:permission="android.permission.BROADCAST_WAP_PUSH">
        <intent-filter>
            <action android:name="android.provider.Telephony.WAP_PUSH_DELIVER" />
            <data android:mimeType="application/vnd.wap.mms-message" />
        </intent-filter>
    </receiver>

    <!-- Activity that allows the user to send new SMS/MMS messages -->
    <activity android:name=".ComposeSmsActivity" >
        <intent-filter>
            <action android:name="android.intent.action.SEND" />
            <action android:name="android.intent.action.SENDTO" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="sms" />
            <data android:scheme="smsto" />
            <data android:scheme="mms" />
            <data android:scheme="mmsto" />
        </intent-filter>
    </activity>

    <!-- Service that delivers messages from the phone "quick response" -->
    <service android:name=".HeadlessSmsSendService"
             android:permission="android.permission.SEND_RESPOND_VIA_MESSAGE"
             android:exported="true" >
        <intent-filter>
            <action android:name="android.intent.action.RESPOND_VIA_MESSAGE" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="sms" />
            <data android:scheme="smsto" />
            <data android:scheme="mms" />
            <data android:scheme="mmsto" />
        </intent-filter>
    </service>

在android p上,他们改为角色管理器

现在是

if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) {
                            val roleManager = getSystemService(RoleManager::class.java)
                            val roleRequestIntent = roleManager.createRequestRoleIntent(RoleManager.ROLE_SMS)
                            startActivityForResult(roleRequestIntent, 12)
                        } else {
                            val intent = Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT)
                            intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, packageName)
                            startActivity(intent)
                        }

请参阅:

谢谢您的回答我在我的应用程序中没有使用
MMS
,因此
android.provider.Telephony.WAP\u PUSH\u DELIVER
我认为在我的情况下不需要它,而且我使用的是
广播接收器
而不是
服务
。因为只有一个默认的SMS应用程序,如果您不支持所有功能,则完全禁用部分用户功能,因此需要这样做。您好,每次我恢复、创建或重新启动应用程序时,是否可能不显示“获取sms应用程序默认值”对话框?因此,在后台自动更改它?@Nemka-如果应用程序可以在后台更改它,用户不会有太多偏好。查看我引用的链接,该链接解释了如何检测您是否为默认应用程序,并向用户指出可以将默认SMS应用程序设置为您的应用程序的位置。示例代码:假设您是对的,但我从未使用过名为
MMSReceiver
的类,那么我们为什么需要此
它不应该给您错误。你有没有试过,但没有成功?类别
MMSReceiver
不存在。假设你想为彩信创建一个接收器,那么你必须实现它,但因为你的应用程序不支持彩信,所以你不必这样做。是的,清单链接检查器可能会抱怨类
MMSReceiver
不存在,您可以忽略它。如果您没有在清单文件中实现所有四个要求,您的短信应用程序将不会像@ianhanniballake所说的那样在Android 4.4+上被列为默认短信应用程序。我已经尝试了您提到的所有四个步骤,但仍然收到了相同的输出。。。。。
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) {
                            val roleManager = getSystemService(RoleManager::class.java)
                            val roleRequestIntent = roleManager.createRequestRoleIntent(RoleManager.ROLE_SMS)
                            startActivityForResult(roleRequestIntent, 12)
                        } else {
                            val intent = Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT)
                            intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, packageName)
                            startActivity(intent)
                        }