diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 2c9c2f979e4b8928e40745b9bec83ae4fc5b47db..063afb22ddf5348b6971cdafa39a8cd33f428d36 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -647,4 +647,5 @@
     <string name="pref_mms_enable_delay">彩信释放网络延迟开启</string>
     <string name="pref_mms_delay_title">彩信释放网络延迟</string>
     <string name="pref_set_mms_delay_title">设置延迟时间</string>
+    <string name="invalid_mms_apn_config">不支持彩信,请检查彩信APN配置!</string>
 </resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 2881b5a5fc19921c2c95ab285868c78023b6202c..817ef3bee5d61eb8e79d0bb29ce3041917ade979 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1214,4 +1214,5 @@
 
     <string name="enable_notification">Notification disabled, it blocks send notification. Please enable it in Settings.</string>
 
+    <string name="invalid_mms_apn_config">Mms not supported for this operator or incorrect MMS APN configuration in device. Please check the MMS APN configuration.</string>
 </resources>
diff --git a/src/com/android/mms/data/WorkingMessage.java b/src/com/android/mms/data/WorkingMessage.java
old mode 100755
new mode 100644
index 00f5c5dc3d09efacc35b6a0c845bd5a3b0c068d4..0ddea956afae29236acf2f05e30fd1d7cead0d73
--- a/src/com/android/mms/data/WorkingMessage.java
+++ b/src/com/android/mms/data/WorkingMessage.java
@@ -391,6 +391,11 @@ public class WorkingMessage {
     public void setWorkingMessageSub(int subId) {
         mCurrentConvSubId = subId;
     }
+
+    public int getWorkingMessageSub() {
+        return mCurrentConvSubId;
+    }
+
     /**
      * @return True if the message has any text. A message with just whitespace is not considered
      * to have text.
diff --git a/src/com/android/mms/ui/ComposeMessageActivity.java b/src/com/android/mms/ui/ComposeMessageActivity.java
index 1f276453e8b14ad6ee6aaa71d852007f53edf7f6..f03e9d11a2e784b5007a84e4dc70290761d4fbce 100644
--- a/src/com/android/mms/ui/ComposeMessageActivity.java
+++ b/src/com/android/mms/ui/ComposeMessageActivity.java
@@ -476,6 +476,17 @@ public class ComposeMessageActivity extends Activity
     private static final String SIM_STATE_CHANGE_ACTION =
             "android.intent.action.SIM_STATE_CHANGED";
 
+    private static final String[] APN_PROJECTION = {
+            Telephony.Carriers.TYPE,            // 0
+            Telephony.Carriers.MMSC,            // 1
+            Telephony.Carriers.MMSPROXY,        // 2
+            Telephony.Carriers.MMSPORT          // 3
+    };
+    private static final int COLUMN_TYPE         = 0;
+    private static final int COLUMN_MMSC         = 1;
+    private static final int COLUMN_MMSPROXY     = 2;
+    private static final int COLUMN_MMSPORT      = 3;
+
     /**
      * Whether this activity is currently running (i.e. not paused)
      */
@@ -5600,6 +5611,69 @@ public class ComposeMessageActivity extends Activity
         return eSmsCarrierSupport;
     }
 
+    private boolean isValidApnType(String types, String requestType) {
+        // If APN type is unspecified, assume APN_TYPE_ALL.
+        if (TextUtils.isEmpty(types)) {
+            return true;
+        }
+
+        for (String t : types.split(",")) {
+            if (t.equals(requestType) || t.equals(ConstantsWrapper.Phone.APN_TYPE_ALL)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private boolean hasValidMmsApnConfiguration(int subId) {
+        if (subId == SubscriptionManagerWrapper.INVALID_SUBSCRIPTION_ID) {
+            Log.d(TAG,"hasValidMmsApnConfiguration: invalid Sub");
+            return false;
+        }
+
+        Uri contentUri = Uri.withAppendedPath(Telephony.Carriers.CONTENT_URI,
+                "/subId/" + subId);
+        Cursor cursor = SqliteWrapper.query(this, getContentResolver(),
+                contentUri, APN_PROJECTION, null, null,
+                null);
+        if (cursor == null || cursor.getCount() == 0) {
+            Log.e(TAG, "hasValidMmsApnConfiguration: cursor null or empty");
+            return false;
+        }
+
+        try {
+            while (cursor.moveToNext()) {
+                if (isValidApnType(cursor.getString(COLUMN_TYPE),
+                        ConstantsWrapper.Phone.APN_TYPE_MMS)) {
+                    // need check MMSC is non empty even if type config support mms capability
+                    String mmsc = cursor.getString(COLUMN_MMSC);
+                    if (!TextUtils.isEmpty(mmsc)) {
+                        Log.v(TAG, "hasValidMmsApnConfiguration: return true for mmsc = "
+                                + mmsc);
+                        return true;
+                    }
+                }
+            }
+        } finally {
+            cursor.close();
+        }
+        Log.v(TAG, "hasValidMmsApnConfiguration: no valid MMS APN config");
+        return false;
+    }
+
+    private void showMmsNotSupportedDialog() {
+        AlertDialog.Builder builder = new AlertDialog.Builder(this);
+        builder.setTitle(R.string.send_mms);
+        builder.setMessage(getString(R.string.invalid_mms_apn_config));
+        builder.setCancelable(true);
+        builder.setPositiveButton(R.string.yes, new OnClickListener() {
+            public void onClick(DialogInterface dialog, int whichButton) {
+                dialog.dismiss();
+            }
+        });
+        builder.show();
+    }
+
     private void sendMessage(boolean bCheckEcmMode) {
         // Check message size, if >= max message size, do not send message.
         if(checkMessageSizeExceeded()){
@@ -5607,6 +5681,14 @@ public class ComposeMessageActivity extends Activity
             return;
         }
 
+        // Check MMS APN config, prompt one dialog if missing MMS APN or its config incorrect
+        int subId = mWorkingMessage.getWorkingMessageSub();
+        if (mWorkingMessage.requiresMms() && !hasValidMmsApnConfiguration(subId)) {
+            LogTag.debugD("sendMessage: Miss MMS APN or no valid MMS APN configuration");
+            showMmsNotSupportedDialog();
+            return;
+        }
+
         if (bCheckEcmMode) {
             // TODO: expose this in telephony layer for SDK build
             boolean inEcm = TelephonyProperties.in_ecm_mode().orElse(false);