1

I am building an Android app using Kotlin. I am trying building my app as Default SMS handler because it is asking for SMS permissions so that I need to make sure that it imply with the Google PlayStore's policy. But it is not showing any popup or dialog to prompt the user to set the app as default SMS handler. This is my code.

val setSmsAppIntent = Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT)
        setSmsAppIntent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, packageName)
        startActivityForResult(setSmsAppIntent, DEFAULT_SMS_HANDLER_REQUEST)

When I run my code, it is not showing anything. What is wrong with my code and how can I fix it?

I tried this too.

 private fun askDefaultSmsHandlerPermission() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            val roleManager: RoleManager = getSystemService(RoleManager::class.java)
            // check if the app is having permission to be as default SMS app
            val isRoleAvailable = roleManager.isRoleAvailable(RoleManager.ROLE_SMS)
            if (isRoleAvailable) {
                // check whether your app is already holding the default SMS app role.
                val isRoleHeld = roleManager.isRoleHeld(RoleManager.ROLE_SMS)
                if (isRoleHeld) {
                    val roleRequestIntent = roleManager.createRequestRoleIntent(RoleManager.ROLE_SMS)
                    startActivityForResult(roleRequestIntent, DEFAULT_SMS_HANDLER_REQUEST)
                }
            }
        } else {
            val intent = Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT)
            intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, packageName)
            startActivityForResult(intent, DEFAULT_SMS_HANDLER_REQUEST)
        }
    }

It is not working either.

This is my andoridmanifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:dist="http://schemas.android.com/apk/distribution"
    package="com.forkthecoop.com22222">

    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.SEND_SMS" />
    <dist:module dist:instant="true" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" android:protectionLevel="signature" />
    <uses-permission android:name="android.permission.RECEIVE_MMS" />
    <uses-permission android:name="android.permission.RECEIVE_WAP_PUSH" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <application
        android:name=".AppController"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.22222Com">
        <activity android:theme="@style/Theme.22222Com.NoActionBar" android:name=".DisableVPNActivity" android:noHistory="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:theme="@style/Theme.22222Com.NoActionBar" android:name=".MainActivity" android:noHistory="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
                <category android:name="android.app.role.SMS"/>
            </intent-filter>
        </activity>

        <activity android:label="@string/register" android:name=".RegisterActivity" android:noHistory="true">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
            </intent-filter>
        </activity>

        <activity android:label="@string/messages_activity_title" android:name=".MessageListActivity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
            </intent-filter>
        </activity>

        <activity android:label="@string/send_message_activity_title" android:name=".SendMessageActivity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
            </intent-filter>
        </activity>

        <activity android:noHistory="true" android:label="@string/message_details_activity_title" android:name=".MessageDetailsActivity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
            </intent-filter>
        </activity>

        <activity android:noHistory="true" android:label="@string/reply_message_activity_title" android:name=".ReplyMessageActivity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
            </intent-filter>
        </activity>

        <activity android:label="@string/confirm_message_activity_title" android:name=".ConfirmMessageActivity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
            </intent-filter>
        </activity>

        <activity android:label="@string/client_list_activity_title" android:name=".ClientListActivity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
            </intent-filter>
        </activity>

        <activity android:label="@string/update_location_activity_title" android:name=".UpdateLocationActivity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
            </intent-filter>
        </activity>

        <activity android:label="@string/permission_usage_activity_title" android:name=".PermissionUsageActivity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
            </intent-filter>
        </activity>

        <activity android:label="@string/enable_location_activity_title" android:name=".EnableLocationActivity" android:noHistory="true">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
            </intent-filter>
        </activity>

        <activity android:label="@string/notice_activity_title" android:name=".FakeNewsWarningActivity" android:noHistory="true">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
            </intent-filter>
        </activity>

        <activity android:label="@string/data_sync_activity_title" android:name=".DataSyncSwitchActivity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
            </intent-filter>
        </activity>

        <activity android:label="@string/conversation_list_activity_title" android:name=".ConversationListActivity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
            </intent-filter>
        </activity>

        <activity android:noHistory="true" android:label="@string/add_new_client_activity_title" android:name=".AddNewClientActivity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
            </intent-filter>
        </activity>

        <activity android:label="@string/choose_message_type_activity_title" android:name=".ChooseOutgoingMessageTypeActivity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
            </intent-filter>
        </activity>

        <!-- Activity that allows the user to send new SMS/MMS messages -->
        <activity android:label="@string/send_ordinary_message_activity_title" android:name=".SendOrdinaryMessageActivity">
            <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" />
                <action android:name="android.intent.action.VIEW" />
            </intent-filter>
        </activity>

        <receiver android:name=".RegisterReceiversScheduler">
            <intent-filter>
                <action android:name="com.forkthecoup.com22222.RegisterReceiversScheduler" ></action>
            </intent-filter>
        </receiver>

        <receiver android:name=".ShareNewsRemainder">
            <intent-filter>
                <action android:name="com.forkthecoup.com22222.ShareNewsRemainder" ></action>
            </intent-filter>
        </receiver>

        <service android:name="com.android.mms.transaction.TransactionService" />

        <receiver android:name=".SmsListener" android:permission="android.permission.BROADCAST_SMS">
            <intent-filter>
                <action android:name="com.forkthecoup.com22222.SmsListener" ></action>
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
                <action android:name="android.provider.Telephony.SMS_DELIVER" />
            </intent-filter>
        </receiver>

<!--        <receiver-->
<!--            android:name=".messaging.SmsReceiver"-->
<!--            android:permission="android.permission.BROADCAST_SMS">-->
<!--            <intent-filter>-->
<!--                <action android:name="android.provider.Telephony.SMS_DELIVER" />-->
<!--            </intent-filter>-->
<!--        </receiver>-->

        <receiver
            android:name=".messaging.MmsReceiver"
            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>

        <receiver
            android:name="com.klinker.android.send_message.MmsSentReceiver"
            android:taskAffinity="com.klinker.android.messaging.MMS_SENT"/>

        <receiver
            android:name=".messaging.MmsReceivedReceiverImpl"
            android:taskAffinity="com.klinker.android.messaging.MMS_RECEIVED"/>

        <service
            android:name=".messaging.HeadlessSmsSendService"
            android:exported="true"
            android:permission="android.permission.SEND_RESPOND_VIA_MESSAGE" >
            <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>
</manifest>
Wai Yan Hein
  • 13,651
  • 35
  • 180
  • 372
  • Are you sure your app has all components required for default SMS handler declared in the manifest? – Pawel Mar 05 '21 at 00:48
  • Hi @Pawel, I have updated my question to include AndroidManifest.xml file. Please, have a look. – Wai Yan Hein Mar 05 '21 at 19:08
  • If you go through system settings -> applications -> default applications -> messaging and your app is not listed there you're missing components required to become default sms app. See https://stackoverflow.com/a/30133663/9241978 – Pawel Mar 05 '21 at 20:08
  • Hello, HeadlessSmsSendService is that what I am missing? – Wai Yan Hein Mar 05 '21 at 20:22
  • Another question is "Is it mandatory to have MmsReceiver"? Is that optional? Can you please answer? – Wai Yan Hein Mar 05 '21 at 20:23
  • Hi @Pawel, I have updated the question to include new AndroidManifest.xml. I can see my app now in settings -> applications -> default applications -> messaging. But it is not prompting the user to set the app as default SMS handler when the app is run. Any idea? – Wai Yan Hein Mar 06 '21 at 00:01
  • If it's in system settings but dialog doesn't show up I don't know what's wrong sorry. But you could edit your question and clarify if it 1) works on devices below Q and 2) if it works should you manually set it as messaging app thru system settings – Pawel Mar 06 '21 at 12:28
  • I am using Android version 11 which is I think is not obsolete. – Wai Yan Hein Mar 06 '21 at 16:05

1 Answers1

1

In your code

// check whether your app is already holding the default SMS app role.

val isRoleHeld = roleManager.isRoleHeld(RoleManager.ROLE_SMS)

if (isRoleHeld) {
    ...
}

Role must not be held, so change the if condition to

if (!isRoleHeld) {
    ...
}
Boken
  • 4,825
  • 10
  • 32
  • 42