How do I set my app as the default SMS app?
In order for your app to be eligible to be selected as the default messaging app (as far as the system is concerned), its manifest must list each of the four components as described in that blog post, whether those components' classes are actually present and functional, or not. The class names can be whatever valid names you like, but the rest of each component should be pretty much exactly as shown:
<manifest>
...
<application>
<!-- BroadcastReceiver that listens for incoming SMS messages -->
<receiver
android:name=".SmsReceiver"
android:permission="android.permission.BROADCAST_SMS">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_DELIVER" />
</intent-filter>
</receiver>
<!-- BroadcastReceiver that listens for incoming MMS messages -->
<receiver
android:name=".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>
<!-- 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: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>
Since the system only inspects an app's manifest to determine if it can act as the default messaging app, you don't actually need any of those classes, though you might have to suppress some warnings/errors, or provide stub classes, to make your IDE happy.
Obviously, if your app is to act as a user's default messaging client, it should fully implement all of the specified components. However, an incomplete implementation can certainly be useful; e.g., during learning and testing, or in apps that only need partial access temporarily, like message backup and restore apps.
If you do intend to perform any SMS/MMS-related tasks, you will also need the relevant permissions. Though the system apparently doesn't check for these when determining eligible default app candidates, the following permissions are necessary for their corresponding operations:
<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" />
A SecurityException
will be thrown if you're missing the relevant permission for a given operation when it happens, though some might be easy to miss; e.g., if the RECEIVE_SMS
permission is missing when the system tries to deliver an incoming SMS to a manifest-registered Receiver. Be sure to inspect your logs if you observe unexpected behavior, even if there is no apparent crash.
Android - how to make my app default sms app programatically
I followed it
Not according to the code in your question. Let's review the four requirements from the blog post:
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.
You have this, in the form of your PhoneStateReceiver
.
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.
You do not have this.
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:.
You have this, in the form of DashboardActivity
.
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.
You have this, in the form of HeadlessSmsSendService
.
So, add a <receiver>
for WAP_PUSH_DELIVER_ACTION
, following the instructions, and see if that helps.
How to set Flutter app as default SMS app?
Just create a method channel
class MainActivity : FlutterActivity() {
private val CHANNEL = "com.example.chat/chat"
override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
if (call.method == "setDefaultSms") {
try {
var intent = Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT);
intent.putExtra(
Telephony.Sms.Intents.EXTRA_PACKAGE_NAME,
<the app package name>
);
startActivity(intent);
result.success("Success")
} catch (ex: Exception) {
result.error("UNAVAILABLE", "Setting default sms.", null)
}
} else {
result.notImplemented()
}
}
}
}
after that in your dart code call the method channel
static const platform = const MethodChannel("com.example.chat/chat");
try {
final result = await platform.invokeMethod('setDefaultSms');
print("Result: $result");
} on PlatformException catch (e) {
print("Error: $e");
}
}
Note the above solution won't make your app qualify to a default SMS app
You may need to add something to your manifest file for more info check out this post Check this out
My app don't appear in Default SMS app
You need to remove the <data>
element from the SMS Receiver's <intent-filter>
.
<receiver
android:name="com.cyber_dove.MessaGen.sms.SMS_DELIVER_ACTION"
android:permission="android.permission.BROADCAST_SMS" >
<intent-filter>
<action android:name="android.provider.Telephony.SMS_DELIVER" />
</intent-filter>
</receiver>
And you're missing the <intent-filter>
tags in the composing Activity.
<activity android:name="com.cyber_dove.MessaGen.sms.ACTION_SENDTO" >
<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>
Related Topics
Checkbox in Recyclerview Keeps on Checking Different Items
How to Disable Copy/Paste From/To Edittext
Android: Retrieving Shared Preferences of Other Application
Android.Content.Activitynotfoundexception:
Difference Between Fragmentpageradapter and Fragmentstatepageradapter
Cursorloader Usage Without Contentprovider
How to Return a Result (Startactivityforresult) from a Tabhost Activity
How to Make a Phone Call in Android and Come Back to My Activity When the Call Is Done
Difference Between Getdefaultsharedpreferences and Getsharedpreferences
How to Disable Mobile Data on Android
Android.View.Inflateexception: Binary Xml File Line #12: Error Inflating Class ≪Unknown≫
Difference Between Adjustresize and Adjustpan in Android
Java.Lang.Runtimeexception: Unable to Instantiate Activity Componentinfo
Runtimeexception: Your Content Must Have a Listview Whose Id Attribute Is 'Android.R.Id.List'
Android Studio Keeps Refusing to Resolve Com.Android.Support:Appcompat-V7:29.0.1
How to Refresh App Upon Shaking the Device