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

Posted

技术标签:

【中文标题】如何在 Android Kitkat 中设置我的短信应用默认值?【英文标题】:How to set my sms app default in Android Kitkat? 【发布时间】:2014-03-10 08:22:39 【问题描述】:

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

下面是我从 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"?>

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="19" />


<uses-feature android:name="android.hardware.telephony.gsm"
    android:required="false"/>

<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.WRITE_SMS" />
<uses-permission android:name="android.permission.RECEIVE_MMS" />
<uses-permission android:name="android.permission.WRITE" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="com.android.alarm.permission.SET_ALARM"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.CALL_PHONE"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.INSTALL_PACKAGES"/>


<application              
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/Theme.NoTitle" >

    <activity
        android:name="coms3.shootmessenger.Mysplash"
        android:label="@string/app_name"
        android:screenOrientation="portrait" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>


         <intent-filter>
            <action android:name="android.intent.action.SENDTO" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="sms" />
            <data android:scheme="smsto" />

        </intent-filter>   


    </activity>

    <receiver android:name="coms3.shootmessenger.SmsReceiver" 
        android:permission="android.permission.BROADCAST_SMS" >


        <intent-filter>

            <action android:name="android.provider.Telephony.SMS_DELIVER" />

        </intent-filter>

          <!--  
         <intent-filter android:priority="2147483647" >

            <action android:name="android.provider.Telephony.SMS_RECEIVED" />

        </intent-filter>
       -->
    </receiver>   

    <receiver android:name="com.example.bootreceiver.MyBootReceiver">

        <intent-filter>

            <action android:name="android.intent.action.BOOT_COMPLETED"/>


        </intent-filter>

     </receiver>

     <receiver android:name="coms3.shootmessenger.MMSReceiver"
         android:permission="android.permission.BROADCAST_WAP_PUSH">

          <intent-filter>

            <action android:name="android.provider.Telephony.WAP_PUSH_RECEIVED" />

            <data android:mimeType="application/vnd.wap.mms-message" />

          </intent-filter>

        </receiver>


     <receiver  android:process=":remote" android:name="AlarmManagerBroadcastReceiver"></receiver>
      <receiver  android:process=":remote" android:name="AlarmForPartyMessage"></receiver>
      <receiver  android:process=":remote" android:name="AlarmManagerMail"></receiver>

    <activity
        android:name="coms3.shootmessenger.ActivityFirstList"

        android:windowSoftInputMode="stateHidden" >
    </activity>
     <activity 
         android:name="coms3.shootmessenger.ActivityBase" 

         android:windowSoftInputMode="stateHidden" > 
     </activity> 
    <activity
        android:name="coms3.shootmessenger.SearchTab"
        android:configChanges="keyboardHidden|orientation"
         >
    </activity>
    <activity
        android:name="coms3.shootmessenger.ActivityMail"
        android:windowSoftInputMode="adjustPan"
         >
    </activity>
    <activity
        android:name="coms3.shootmessenger.ActivityScheduldMail"
        android:windowSoftInputMode="adjustPan"
        android:screenOrientation="portrait"
         >
    </activity>
    <activity
        android:name="coms3.shootmessenger.MessageTab" >

    </activity>

    <activity
        android:name="coms3.shootmessenger.SettingsTab"

        android:windowSoftInputMode="stateHidden" >
    </activity>

    <activity
        android:name="coms3.shootmessenger.MyConversation"

        android:windowSoftInputMode="stateHidden" >
    </activity>

    <activity
        android:name="coms3.shootmessenger.ActivityDelayedSending"

        android:windowSoftInputMode="stateHidden" >
    </activity>

    <activity
        android:name="coms3.shootmessenger.ActivityScheduldMessage"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="stateHidden" >
    </activity>
    <activity
        android:name="coms3.shootmessenger.ActivityStealthMode"

        android:windowSoftInputMode="stateHidden" >
    </activity>

    <activity
        android:name="coms3.shootmessenger.ActivitySms"

        android:windowSoftInputMode="stateHidden" >


    </activity>

    <activity
        android:name="coms3.shootmessenger.ActivityBlackList"

        android:windowSoftInputMode="stateHidden" >
    </activity>

    <activity
        android:name="coms3.shootmessenger.ActivityDeleteMessage"

        android:windowSoftInputMode="stateHidden" >
    </activity>

    <activity
        android:name="coms3.shootmessenger.ActivityDeleteone"

        android:windowSoftInputMode="stateHidden" >
    </activity>

     <activity android:name="coms3.shootmessenger.ActivitySmsnew" >


      <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" />

        </intent-filter>


    </activity>

      <activity
        android:name="coms3.shootmessenger.ActivityEventlist"

        android:windowSoftInputMode="stateHidden" >
    </activity>

     <activity
        android:name="coms3.shootmessenger.ActivityScheduleList"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="stateHidden" >
    </activity>

      <activity
        android:name="coms3.shootmessenger.ActivityCancelSchedule"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="stateHidden" >
    </activity>

       <activity
        android:name="coms3.shootmessenger.ActivityCancelEvent"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="stateHidden" >
    </activity>

      <activity
        android:name="coms3.shootmessenger.ActivityCancelMail"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="stateHidden" >
    </activity>

   <activity
        android:name="coms3.shootmessenger.Activitytutorial"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="stateHidden" >
    </activity>

     <activity
        android:name="coms3.shootmessenger.ActivityConversationtutorial"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="stateHidden" >
    </activity>

    <activity
        android:name="coms3.shootmessenger.Aboutus"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="stateHidden" >
    </activity>



     <service android:name="coms3.shootmessenger.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>




</application>

更新:

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

【问题讨论】:

【参考方案1】:

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

在广播接收器中,包含SMS_DELIVER_ACTION(“android.provider.Telephony.SMS_DELIVER”)的意图过滤器。广播接收器还必须需要 BROADCAST_SMS 权限。 这允许您的应用直接接收传入的 SMS 消息。

在广播接收器中,为 WAP_PUSH_DELIVER_ACTION ("android.provider.Telephony.WAP_PUSH_DELIVER") 添加一个 MIME 类型为“application/vnd.wap.mms-message”的意图过滤器。广播接收器还必须需要 BROADCAST_WAP_PUSH 权限。 这允许您的应用直接接收传入的彩信。

在传递新消息的活动中,包括ACTION_SENDTO ("android.intent.action.SENDTO") 的意图过滤器和模式、sms:smsto:mms:mmsto:。 这允许您的应用接收来自其他想要传递消息的应用的意图。

在服务中,包含ACTION_RESPONSE_VIA_MESSAGE(“android.intent.action.RESPOND_VIA_MESSAGE”)的意图过滤器和架构、sms:smsto:mms:mmsto:。此服务还必须需要SEND_RESPOND_VIA_MESSAGE 权限。

如果没有这四个,您的应用将不会列在默认的 SMS 选择对话框中。

【讨论】:

感谢您的回答我没有在我的应用程序中使用MMS,所以android.provider.Telephony.WAP_PUSH_DELIVER 我认为在我的情况下不需要它,我也在使用Broadcast Receiver,而不是使用service 因为只能有一个默认的短信应用,如果您不支持所有功能,您将完全禁用用户的某些功能,因此需要这样做。 您好,是否可以在每次恢复、创建、重新启动应用程序时不显示“获取短信应用程序默认设置”对话框?所以要在后台自动更改它? @Nemka - 如果应用程序可以在后台更改它,那么用户偏好不会太大。查看我引用的链接,该链接解释了如何检测您是否是默认应用并将用户指向他们可以将默认 SMS 应用设置为您的应用的位置 示例代码:***.com/questions/30127564/…【参考方案2】:

如果您没有实现所有四个要求,您的应用将不会被列为默认短信应用。即使您的应用程序不支持彩信,您也必须将它们添加到您的清单文件中。这并不意味着您必须为它们实现活动或服务或接收器。将这些添加到您的清单文件中,并且应该将您的 SMS 列为默认 SMS 应用程序。随意忽略任何 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>

【讨论】:

假设你是对的,但我从未使用过名为 MMSReceiver 的类,那么我们为什么需要这个 &lt;receiver android:name=".MmsReceiver" 它肯定会在 Manifest 中给我们错误,因为类不存在。 它不应该给你一个错误。你试过但没有用吗? MMSReceiver 类不存在。假设您想为 MMS 创建一个接收器,那么您必须实现它,但由于您的应用程序不支持 MMS,您不必这样做。是的,清单链接检查器可能会抱怨 MMSReceiver 类不存在,您可以忽略它。如果您没有在清单文件中实现所有四个要求,您的 SMS 应用程序将不会像 @ianhanniballake 所说的那样被列为 Android 4.4+ 上的默认 SMS 应用程序。 我已经尝试了你提到的所有 4 个步骤,但我仍然收到相同的输出.....【参考方案3】:

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

见:https://***.com/a/64136408/14535195

【讨论】:

以上是关于如何在 Android Kitkat 中设置我的短信应用默认值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的 winforms 应用程序中设置我的 datagrid 滚动条的位置?

如何在 Visual Studio Code 中设置我的工作区文件夹?

如何在 VS2010 RC 中设置我的开发 Web 浏览器?

我应该如何在Mercurial存储库中设置我的Visual Studio项目/解决方案?

我应该如何确定 UIKit 将打开哪个场景,以便我可以在正确的窗口中设置我的 UI? (iOS 13+)

在 Gnome 顶部栏中设置我的 Java Swing 应用程序标题的正确方法是啥?