14

I made an android sms app in which I am sending and receiving sms as android messaging app does so. Now I have set my target to 4.4 (Android KitKat version) but Android KitKat has new "Default Messaging" app settings that user can select one app at a time for messaging. I followed the steps from this site to select option for my sms app as default app but in the settings my app never showed up in the popup of selecting default messaging app.

Below is my java code I have used from the guid

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();


}


}

Also I added below code in Manifest file.

<?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>

UPDATE:

Note: I am testing on Emulator... After following all steps I only see the default messaging app of Android not mine like in the image given below. Any type of help will be appreciated. Thanks in Advance.

enter image description here

Zubair Ahmed
  • 2,857
  • 2
  • 27
  • 47

3 Answers3

15

The instructions you posted were correct - the issue is that you must implement all of the required capabilities:

  • In a broadcast receiver, include an intent filter for SMS_DELIVER_ACTION ("android.provider.Telephony.SMS_DELIVER"). The broadcast receiver must also require the BROADCAST_SMS permission. This allows your app to directly receive incoming SMS messages.

  • In a broadcast receiver, include an intent filter for WAP_PUSH_DELIVER_ACTION ("android.provider.Telephony.WAP_PUSH_DELIVER") with the MIME type "application/vnd.wap.mms-message". The broadcast receiver must also require the BROADCAST_WAP_PUSH permission. This allows your app to directly receive incoming MMS messages.

  • In your activity that delivers new messages, include an intent filter for ACTION_SENDTO ("android.intent.action.SENDTO") with schemas, sms:, smsto:, mms:, and mmsto:. This allows your app to receive intents from other apps that want to deliver a message.

  • In a service, include an intent filter for ACTION_RESPONSE_VIA_MESSAGE ("android.intent.action.RESPOND_VIA_MESSAGE") with schemas, sms:, smsto:, mms:, and mmsto:. This service must also require the SEND_RESPOND_VIA_MESSAGE permission.

Without all four, your app will not be listed in the default SMS selection dialog.

ianhanniballake
  • 191,609
  • 30
  • 470
  • 443
  • Thanks for your answer I am not using `MMS` in my app, so `android.provider.Telephony.WAP_PUSH_DELIVER` I think its not needed in my case, also I am using `Broadcast Receiver` not using `service`. – Zubair Ahmed Feb 12 '14 at 07:31
  • 1
    Because there can be only one default SMS app, you completely disable some of the user's functionality if you don't support all of the capabilities, hence the requirement to do so. – ianhanniballake Feb 12 '14 at 07:36
  • Hello, is it possible to not show the dialog "get sms application default" each time I resume,create,restart my app ? so to change it automatically in background ? – Nemka Jul 28 '14 at 08:30
  • @Nemka - it wouldn't be much of a user preference if apps could change it in the background. Look at the link I referenced which explains how to detect if you are the default app and point users to where they can set the default SMS app to your app – ianhanniballake Jul 28 '14 at 13:39
  • for sample code: http://stackoverflow.com/questions/30127564/android-default-making-default-sms-app – M. Usman Khan Feb 06 '16 at 06:26
5

If you don't implement all the four requirements, your app won't be listed as a default SMS app. Even if your app doesn't support MMS you've to add those to your manifiest file. It doesn't mean you've to implement activities or services or receivers for them. Add these to your manifiest file and should get your SMS listed as a default SMS app. Feel free to ignore any lint errors.

<!-- 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>
eyedol
  • 101
  • 1
  • 4
  • Suppose you are right but I have never used the class named `MMSReceiver` then why should we need this ` – Zubair Ahmed Feb 12 '14 at 07:48
  • It shouldn't give you an error. Did you try and it didn't work? The class `MMSReceiver` doesn't exist. Suppose you want to create a receiver for MMS then you've to implement that but since your app doesn't support MMS you don't have to. And yes the manifest link checker might complain about the class `MMSReceiver` not in existence, you can ignore that. If you don't implement all the four requirements in your manifest file, your SMS app won't be listed as a default SMS app on Android 4.4+ just like @ianhanniballake has been saying. – eyedol Feb 12 '14 at 07:57
  • I have tried all 4 steps as you mentioned but still I am receiving the same output..... – Zubair Ahmed Feb 12 '14 at 08:16
0

On the android P they changed to Role manager.

Now it's

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

see: https://stackoverflow.com/a/64136408/14535195

honky-tonk
  • 73
  • 1
  • 6