I am working on an Sms app, I want my app to display the below chooser, so that the user can select my app as default
here is my manifest code:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<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.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.SEND_SMS" />
<application
android:name=".App"
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/AppTheme"
android:usesCleartextTraffic="true"
tools:ignore="GoogleAppIndexingWarning">
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" />
</provider>
<!-- <service android:name=".BackgroundService" />-->
<!-- Service that delivers messages from the phone "quick response" -->
<service
android:name=".BackgroundService"
android:exported="false"
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>
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar"
android:exported="true">
<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.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>
<receiver
android:name=".SmsReceiver"
android:permission="android.permission.BROADCAST_SMS"
android:exported="false">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_DELIVER" />
</intent-filter>
</receiver>
<receiver
android:name=".MmsReceiver"
android:permission="android.permission.BROADCAST_WAP_PUSH"
android:exported="false">
<intent-filter>
<action android:name="android.provider.Telephony.WAP_PUSH_DELIVER" />
<data android:mimeType="application/vnd.wap.mms-message" />
</intent-filter>
</receiver>
</application>
and here is my mainActivity:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (!isDefaultSmsApp(this))
setDefaultSmsApp();
}
private void setDefaultSmsApp() {
Toast.makeText(this, "Setting default....", Toast.LENGTH_SHORT).show();
Intent intent =
new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT);
intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME,
getPackageName());
startActivity(intent);
}
public boolean isDefaultSmsApp(Context context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
return context.getPackageName().equals(Telephony.Sms.getDefaultSmsPackage(context));
}
return true;
}
public void requestSmsPermission() {
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.SEND_SMS)) {
new AlertDialog.Builder(this)
.setTitle("Permission Needed")
.setMessage("This permission is needed to send messages")
.setPositiveButton("Ok", (dialogInterface, i) -> ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.SEND_SMS}, ACCESS_SMS_CODE))
.setNegativeButton("Cancel", (dialogInterface, i) -> {
dialogInterface.dismiss();
finish();
})
.create()
.show();
} else {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.SEND_SMS}, ACCESS_SMS_CODE);
}
}
What am i missing ?
I have also tried using intent.createChooser but it was not working, as you can see i have registered all the necessary registers in my manifest,
After doing some more research I was able to show the dialog here is the updated code for my Main Activity:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_default_sms);
if (!isDefaultSmsApp(this))
setDefaultSmsApp();
}
private void setDefaultSmsApp() {
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.Q){
//String mypackagename = getPackageName();
if(Telephony.Sms.getDefaultSmsPackage(this)!=null){
if (Telephony.Sms.getDefaultSmsPackage(this).equals(getPackageName())){
openMainActivity();
}else{
Intent setSmsAppIntent = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT);
setSmsAppIntent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME,getPackageName());
startActivityForResult(setSmsAppIntent, 1);
}
}else{
Toast.makeText(this, "No default Sms App found", Toast.LENGTH_SHORT).show();}
}
else{
RoleManager rolemanager = getApplicationContext().getSystemService(RoleManager.class);
if (rolemanager.isRoleAvailable(RoleManager.ROLE_SMS)){
if (rolemanager.isRoleHeld(RoleManager.ROLE_SMS)){
openMainActivity();
}
else{
Intent roleRequestIntent = rolemanager.createRequestRoleIntent(RoleManager.ROLE_SMS);
startActivityForResult(roleRequestIntent,REQUEST_SET_DEFAULT_SMS_APP);
}
}
}
}
Hope this helps someone!