diff --git a/src/com/android/contacts/editor/ContactEditorBaseFragment.java b/src/com/android/contacts/editor/ContactEditorBaseFragment.java
index 22ee710..5b341a0 100644
--- a/src/com/android/contacts/editor/ContactEditorBaseFragment.java
+++ b/src/com/android/contacts/editor/ContactEditorBaseFragment.java
@@ -148,6 +148,8 @@
     protected static final int REQUEST_CODE_ACCOUNTS_CHANGED = 1;
     protected static final int REQUEST_CODE_PICK_RINGTONE = 2;
 
+    private static final int CURRENT_API_VERSION = android.os.Build.VERSION.SDK_INT;
+
     /**
      * An intent extra that forces the editor to add the edited contact
      * to the default group (e.g. "My Contacts").
@@ -678,13 +680,7 @@
     }
 
     private void onRingtonePicked(Uri pickedUri) {
-        if (pickedUri == null) {
-            mCustomRingtone = ""; // silent ringtone
-        } else if (RingtoneManager.isDefault(pickedUri)){
-            mCustomRingtone = null; // default ringtone
-        } else {
-            mCustomRingtone = pickedUri.toString();
-        }
+        mCustomRingtone = EditorUiUtils.getRingtoneStringFromUri(pickedUri, CURRENT_API_VERSION);
         Intent intent = ContactSaveService.createSetRingtone(
                 mContext, mLookupUri, mCustomRingtone);
         mContext.startService(intent);
@@ -879,17 +875,8 @@
         // Allow the user to pick a silent ringtone
         intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, true);
 
-        final Uri ringtoneUri;
-        if (mCustomRingtone != null) {
-            if ("".equals(mCustomRingtone)) { // select silent ringtone in RingtonePickerActivity
-                ringtoneUri = null;
-            } else {
-                ringtoneUri = Uri.parse(mCustomRingtone);
-            }
-        } else {
-            // Otherwise pick default ringtone Uri so that something is selected.
-            ringtoneUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
-        }
+        final Uri ringtoneUri = EditorUiUtils.getRingtoneUriFromString(mCustomRingtone,
+                CURRENT_API_VERSION);
 
         // Put checkmark next to the current ringtone for this contact
         intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, ringtoneUri);
diff --git a/src/com/android/contacts/editor/EditorUiUtils.java b/src/com/android/contacts/editor/EditorUiUtils.java
index 3da5ee9..106c5e3 100644
--- a/src/com/android/contacts/editor/EditorUiUtils.java
+++ b/src/com/android/contacts/editor/EditorUiUtils.java
@@ -32,6 +32,9 @@
 import android.provider.ContactsContract.CommonDataKinds.SipAddress;
 import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
 import android.provider.ContactsContract.CommonDataKinds.Website;
+import android.media.RingtoneManager;
+import android.net.Uri;
+import android.os.Build;
 import android.text.TextUtils;
 import android.util.Pair;
 import com.android.contacts.R;
@@ -189,4 +192,31 @@
                 return null;
         }
     }
+
+    /**
+     * Returns a ringtone string based on the ringtone URI and version #.
+     */
+    public static String getRingtoneStringFromUri(Uri pickedUri, int currentVersion) {
+        if (isNewerThanM(currentVersion)) {
+            if (pickedUri == null) return ""; // silent ringtone
+            if (RingtoneManager.isDefault(pickedUri)) return null; // default ringtone
+        }
+        if (pickedUri == null || RingtoneManager.isDefault(pickedUri)) return null;
+        return pickedUri.toString();
+    }
+
+    /**
+     * Returns a ringtone URI, based on the string and version #.
+     */
+    public static Uri getRingtoneUriFromString(String str, int currentVersion) {
+        if (str != null) {
+            if (isNewerThanM(currentVersion) && TextUtils.isEmpty(str)) return null;
+            return Uri.parse(str);
+        }
+        return RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
+    }
+
+    private static boolean isNewerThanM(int currentVersion) {
+        return currentVersion > Build.VERSION_CODES.M;
+    }
 }
diff --git a/tests/src/com/android/contacts/editor/EditorUiUtilsTest.java b/tests/src/com/android/contacts/editor/EditorUiUtilsTest.java
index 58e6f26..4a180ef 100644
--- a/tests/src/com/android/contacts/editor/EditorUiUtilsTest.java
+++ b/tests/src/com/android/contacts/editor/EditorUiUtilsTest.java
@@ -21,6 +21,10 @@
 import com.android.contacts.common.model.account.GoogleAccountType;
 
 import android.content.Context;
+import android.media.RingtoneManager;
+import android.net.Uri;
+import android.os.Build;
+import android.provider.Settings;
 import android.test.AndroidTestCase;
 import android.test.suitebuilder.annotation.SmallTest;
 import android.util.Pair;
@@ -37,6 +41,8 @@
     private static final String GOOGLE_ACCOUNT_NAME = "somebody@gmail.com";
     private static final String GOOGLE_DISPLAY_LABEL = "Google";
 
+    private static final String RINGTONE = "content://media/external/audio/media/31";
+
     private static final class MockAccountType extends AccountType {
 
         private final String mDisplayLabel;
@@ -140,4 +146,41 @@
                         getContext().getString(R.string.account_phone)),
                 pair.second); // "Phone-only, unsynced contact"
     }
+
+    public void testGetRingtongStrFromUri_lessThanOrEqualsToM() {
+        final int currentVersion = Build.VERSION_CODES.M;
+        assertNull(EditorUiUtils.getRingtoneStringFromUri(null, currentVersion));
+        assertNull(EditorUiUtils.getRingtoneStringFromUri(Settings.System.DEFAULT_RINGTONE_URI,
+                currentVersion));
+        assertEquals(RINGTONE, EditorUiUtils.getRingtoneStringFromUri(Uri.parse(RINGTONE),
+                        currentVersion));
+    }
+
+    public void testGetRingtongStrFromUri_nOrGreater() {
+        final int currentVersion = Build.VERSION_CODES.M + 1;
+        assertEquals("", EditorUiUtils.getRingtoneStringFromUri(null, currentVersion));
+        assertNull(EditorUiUtils.getRingtoneStringFromUri(Settings.System.DEFAULT_RINGTONE_URI,
+                currentVersion));
+        assertEquals(RINGTONE, EditorUiUtils.getRingtoneStringFromUri(Uri.parse(RINGTONE),
+                        currentVersion));
+    }
+
+    public void testGetRingtongUriFromStr_lessThanOrEqualsToM() {
+        final int currentVersion = Build.VERSION_CODES.M;
+        assertEquals(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE), EditorUiUtils
+                        .getRingtoneUriFromString(null, currentVersion));
+        assertEquals(Uri.parse(""), EditorUiUtils.getRingtoneUriFromString("", currentVersion));
+        assertEquals(Uri.parse(RINGTONE), EditorUiUtils.getRingtoneUriFromString(RINGTONE,
+                currentVersion));
+    }
+
+    public void testGetRingtongUriFromStr_nOrGreater() {
+        final int currentVersion = Build.VERSION_CODES.M + 1;
+        assertEquals(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE), EditorUiUtils
+                        .getRingtoneUriFromString(null, currentVersion));
+        assertNull(EditorUiUtils.getRingtoneUriFromString("", currentVersion));
+        assertEquals(Uri.parse(RINGTONE), EditorUiUtils.getRingtoneUriFromString(RINGTONE,
+                currentVersion));
+    }
+
 }
