diff --git a/src/com/android/phone/EmergencyAssistanceHelper.java b/src/com/android/phone/EmergencyAssistanceHelper.java
index 9e1ac21..a98d81d 100644
--- a/src/com/android/phone/EmergencyAssistanceHelper.java
+++ b/src/com/android/phone/EmergencyAssistanceHelper.java
@@ -16,6 +16,8 @@
 
 package com.android.phone;
 
+import android.app.role.RoleManager;
+import android.app.role.RoleManagerCallback;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
@@ -23,10 +25,15 @@
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
-import android.provider.Settings;
+import android.os.AsyncTask;
+import android.os.Binder;
+import android.os.Process;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
 import android.util.FeatureFlagUtils;
+import android.util.Log;
+
+import com.android.internal.util.CollectionUtils;
 
 import java.util.List;
 
@@ -34,7 +41,7 @@
  * A helper to query activities of emergency assistance.
  */
 public class EmergencyAssistanceHelper {
-
+    private static final String TAG = EmergencyAssistanceHelper.class.getSimpleName();
     /**
      * Get intent action of target emergency app.
      *
@@ -61,8 +68,8 @@
      * or null if there is no installed system application of emergency assistance.
      */
     public static List<ResolveInfo> resolveAssistPackageAndQueryActivities(Context context) {
-        List<ResolveInfo> infos = queryAssistActivities(context);
-
+        final String assistPackage = getDefaultEmergencyPackage(context);
+        List<ResolveInfo> infos = queryAssistActivities(context, assistPackage);
         if (infos == null || infos.isEmpty()) {
             PackageManager packageManager = context.getPackageManager();
             Intent queryIntent = new Intent(getIntentAction(context));
@@ -86,9 +93,8 @@
             }
 
             if (bestMatch != null) {
-                Settings.Secure.putString(context.getContentResolver(),
-                        Settings.Secure.EMERGENCY_ASSISTANCE_APPLICATION, bestMatch.packageName);
-                return queryAssistActivities(context);
+                setDefaultEmergencyPackageAsync(context, bestMatch.packageName);
+                return queryAssistActivities(context, bestMatch.packageName);
             } else {
                 return null;
             }
@@ -106,9 +112,7 @@
                 resolveInfo.activityInfo.name);
     }
 
-    private static List<ResolveInfo> queryAssistActivities(Context context) {
-        final String assistPackage = Settings.Secure.getString(context.getContentResolver(),
-                Settings.Secure.EMERGENCY_ASSISTANCE_APPLICATION);
+    private static List<ResolveInfo> queryAssistActivities(Context context, String assistPackage) {
         List<ResolveInfo> infos = null;
 
         if (!TextUtils.isEmpty(assistPackage)) {
@@ -123,4 +127,34 @@
         return info.applicationInfo != null
                 && (info.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
     }
+
+    private static String getDefaultEmergencyPackage(Context context) {
+        long identity = Binder.clearCallingIdentity();
+        try {
+            return CollectionUtils.firstOrNull(context.getSystemService(RoleManager.class)
+                    .getRoleHolders(RoleManager.ROLE_EMERGENCY));
+        } finally {
+            Binder.restoreCallingIdentity(identity);
+        }
+    }
+
+    private static boolean setDefaultEmergencyPackageAsync(Context context, String pkgName) {
+        long identity = Binder.clearCallingIdentity();
+        try {
+            context.getSystemService(RoleManager.class).addRoleHolderAsUser(
+                    RoleManager.ROLE_EMERGENCY, pkgName, 0, Process.myUserHandle(),
+                    AsyncTask.THREAD_POOL_EXECUTOR, new RoleManagerCallback() {
+                        @Override
+                        public void onSuccess() {
+                        }
+                        @Override
+                        public void onFailure() {
+                            Log.e(TAG, "Failed to set emergency default app.");
+                        }
+                    });
+        } finally {
+            Binder.restoreCallingIdentity(identity);
+        }
+        return true;
+    }
 }
