Android Kotlin:发送彩信(照片信息)不起作用

时间:2021-03-09 22:54:31

标签: android kotlin android-mms

我正在使用 Kotlin 构建一个 Android 消息传递应用程序。我的应用程序将在应用程序内发送彩信或照片消息。它不应该使用内置服务发送。我正在尝试使用此库 https://github.com/klinker41/android-smsmms?fbclid=IwAR2lFynDGHsbExnzdhn1fIPX-m55lZxoDJjwwpdL4jgcANP1-8mdjKSFe_8 来实现逻辑。但它没有按预期工作。

这就是我发送彩信的方式。

我使用以下函数初始化设置。

private fun initApns() {
        ApnUtils.initDefaultApns(
            this
        ) {
            settings =
                Settings.get(this@SendOrdinaryMessageActivity, true)
        }
    }

    private fun initSettings() {
        settings = Settings[this]
        if (TextUtils.isEmpty(settings!!.mmsc) &&
            Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP
        ) {
            initApns()
        }
    }

当活动开始时,我调用 initSettings 函数。

这是我的 ApnUtils 类。

public class ApnUtils {
    private static final String TAG = "ApnUtils";

    public ApnUtils() {
    }

    public static void initDefaultApns(final Context context, final ApnUtils.OnApnFinishedListener listener) {
        loadMmsSettings(context);
        final ArrayList<ApnUtils.APN> apns = loadApns(context);
        if (apns != null && apns.size() != 0) {
            if (apns.size() == 1) {
                setApns(context, (ApnUtils.APN)apns.get(0));
                if (listener != null) {
                    listener.onFinished();
                }
            } else if (!PreferenceManager.getDefaultSharedPreferences(context).getBoolean("has_seen_select_apns_warning", false)) {
                (new Builder(context)).setTitle(string.auto_select_apn).setMessage(string.auto_select_multiple_apns).setPositiveButton(string.ok, new OnClickListener() {
                    public void onClick(DialogInterface dialogInterface, int num) {
                        ApnUtils.showApnChooser(context, apns, listener);
                    }
                }).show();
                PreferenceManager.getDefaultSharedPreferences(context).edit().putBoolean("has_seen_select_apns_warning", true).commit();
            } else {
                showApnChooser(context, apns, listener);
            }
        } else {
            Log.v("ApnUtils", "Found no APNs :( Damn CDMA network probably.");
            Toast.makeText(context, context.getString(string.auto_select_failed), 0).show();
            if (listener != null) {
                listener.onFinished();
            }
        }

    }

    private static void showApnChooser(final Context context, final ArrayList<ApnUtils.APN> apns, final ApnUtils.OnApnFinishedListener listener) {
        CharSequence[] items = new CharSequence[apns.size()];
        SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context);
        String curMmsc = sharedPrefs.getString("mmsc_url", "");
        String curProxy = sharedPrefs.getString("mms_proxy", "");
        String curPort = sharedPrefs.getString("mms_port", "");
        int defaultApn = -1;

        for(int i = 0; i < items.length; ++i) {
            ApnUtils.APN apn = (ApnUtils.APN)apns.get(i);
            items[i] = i + 1 + ". " + apn.name;
            if (apn.mmsc.equals(curMmsc) && apn.proxy.equals(curProxy) && apn.port.equals(curPort)) {
                defaultApn = i;
            }
        }

        (new Builder(context)).setSingleChoiceItems(items, defaultApn, new OnClickListener() {
            public void onClick(DialogInterface dialogInterface, int i) {
                ApnUtils.setApns(context, (ApnUtils.APN)apns.get(i));
                if (listener != null) {
                    listener.onFinished();
                }

                dialogInterface.dismiss();
            }
        }).setOnCancelListener(new OnCancelListener() {
            public void onCancel(DialogInterface dialogInterface) {
                if (listener != null) {
                    listener.onFinished();
                }

            }
        }).show();
    }

    private static void loadMmsSettings(Context context) {
        XmlResourceParser parser = context.getResources().getXml(xml.mms_config);
        String maxMessageSize = "1000000";
        int maxImageHeight = 800;
        int maxImageWidth = 800;
        String userAgent = "Android Messaging";
        String uaProfUrl = "http://www.gstatic.com/android/hangouts/hangouts_mms_ua_profile.xml";

        String tag;
        String name;
        try {
            beginDocument(parser, "mms_config");

            while(true) {
                nextElement(parser);
                tag = parser.getName();
                if (tag == null) {
                    break;
                }

                name = parser.getAttributeName(0);
                String value = parser.getAttributeValue(0);
                String text = null;
                if (parser.next() == 4) {
                    text = parser.getText();
                }

                Log.v("ApnUtils", "tag: " + tag + " value: " + value + " - " + text);
                if ("name".equalsIgnoreCase(name)) {
                    if ("int".equals(tag)) {
                        if ("maxMessageSize".equalsIgnoreCase(value)) {
                            maxMessageSize = text;
                        } else if ("maxImageHeight".equalsIgnoreCase(value)) {
                            maxImageHeight = Integer.parseInt(text);
                        } else if ("maxImageWidth".equalsIgnoreCase(value)) {
                            maxImageWidth = Integer.parseInt(text);
                        }
                    } else if ("string".equals(tag)) {
                        if ("userAgent".equalsIgnoreCase(value)) {
                            userAgent = text;
                        } else if ("uaProfUrl".equalsIgnoreCase(value)) {
                            uaProfUrl = text;
                        }
                    }
                }
            }
        } catch (XmlPullParserException var16) {
            Log.e("ApnUtils", "loadMmsSettings caught ", var16);
        } catch (NumberFormatException var17) {
            Log.e("ApnUtils", "loadMmsSettings caught ", var17);
        } catch (IOException var18) {
            Log.e("ApnUtils", "loadMmsSettings caught ", var18);
        } finally {
            parser.close();
        }

        tag = null;
        if (tag != null) {
            name = String.format("MmsConfig.loadMmsSettings mms_config.xml missing %s setting", tag);
            Log.e("ApnUtils", name);
        }

        if (VERSION.SDK_INT >= 19) {
            TelephonyManager telephonyManager = (TelephonyManager)context.getSystemService("phone");
            userAgent = telephonyManager.getMmsUserAgent();
            uaProfUrl = telephonyManager.getMmsUAProfUrl();
        }

        PreferenceManager.getDefaultSharedPreferences(context).edit().putInt("mms_max_width", maxImageWidth).putInt("mms_max_height", maxImageHeight).putString("mms_max_size", maxMessageSize).putString("mms_agent", userAgent).putString("mms_user_agent_profile_url", uaProfUrl).commit();
    }

    private static ArrayList<ApnUtils.APN> loadApns(Context context) {
        XmlResourceParser parser = context.getResources().getXml(xml.apns);
        ArrayList<ApnUtils.APN> apns = new ArrayList();
        String mmsc = "";
        String proxy = "";
        String port = "";
        String carrier = "";
        int mcc = true;
        int mnc = true;
        TelephonyManager manager = (TelephonyManager)context.getSystemService("phone");
        String networkOperator = manager.getNetworkOperator();
        String errorStr;
        int mcc;
        int mnc;
        if (isValidNetworkOperator(networkOperator)) {
            mcc = Integer.parseInt(networkOperator.substring(0, 3));
            errorStr = networkOperator.substring(3);

            try {
                mnc = Integer.parseInt(errorStr.replaceFirst("^0{1,2}", ""));
            } catch (Exception var27) {
                mnc = -1;
            }
        } else {
            mcc = context.getResources().getConfiguration().mcc;
            mnc = context.getResources().getConfiguration().mnc;
        }

        try {
            if (mcc == -1) {
                mcc = Integer.parseInt((new ServiceState()).getOperatorNumeric().substring(0, 3));
            }

            if (mnc == -1) {
                TelephonyManager tm = (TelephonyManager)context.getSystemService("phone");
                mnc = ((CdmaCellLocation)tm.getCellLocation()).getSystemId();
            }
        } catch (Exception var26) {
        }

        if (mcc != -1 && mnc != -1) {
            Log.v("ApnUtils", "mcc: " + mcc + " mnc: " + mnc);

            try {
                beginDocument(parser, "apns");

                label301:
                while(true) {
                    int i;
                    do {
                        boolean mccCorrect;
                        boolean mncCorrect;
                        int i;
                        String name;
                        do {
                            do {
                                nextElement(parser);
                                errorStr = parser.getName();
                                if (errorStr == null) {
                                    break label301;
                                }

                                mccCorrect = false;
                                mncCorrect = false;

                                for(i = 0; i < parser.getAttributeCount(); ++i) {
                                    try {
                                        name = parser.getAttributeName(i);
                                        i = Integer.parseInt(parser.getAttributeValue(i));
                                        if ("mcc".equals(name) && mcc == i) {
                                            mccCorrect = true;
                                        } else if ("mnc".equals(name) && mnc == i) {
                                            mncCorrect = true;
                                        }
                                    } catch (Exception var28) {
                                    }
                                }
                            } while(!mccCorrect);
                        } while(!mncCorrect);

                        for(i = 0; i < parser.getAttributeCount(); ++i) {
                            name = parser.getAttributeName(i);
                            String value = parser.getAttributeValue(i);
                            if ("type".equals(name)) {
                                if (!value.contains("mms")) {
                                    mmsc = "";
                                    proxy = "";
                                    port = "";
                                    break;
                                }
                            } else if ("mmsc".equals(name)) {
                                mmsc = value;
                            } else if ("mmsproxy".equals(name)) {
                                proxy = value;
                            } else if ("mmsport".equals(name)) {
                                port = value;
                            } else if ("carrier".equals(name)) {
                                carrier = value;
                            } else if ("port".equals(name) && port.equals("")) {
                                port = value;
                            }
                        }
                    } while(mmsc.equals(""));

                    ApnUtils.APN apn = new ApnUtils.APN();
                    apn.name = carrier;
                    apn.mmsc = mmsc;
                    apn.proxy = proxy;
                    apn.port = port;
                    boolean contains = false;

                    for(i = 0; i < apns.size(); ++i) {
                        ApnUtils.APN current = (ApnUtils.APN)apns.get(i);
                        if (current.mmsc.equals(apn.mmsc) && current.port.equals(apn.port) && current.proxy.equals(apn.proxy)) {
                            contains = true;
                            break;
                        }
                    }

                    if (!contains) {
                        apns.add(apn);
                    }
                }
            } catch (XmlPullParserException var29) {
                Log.e("ApnUtils", "loadApns caught ", var29);
            } catch (NumberFormatException var30) {
                Log.e("ApnUtils", "loadApns caught ", var30);
            } catch (IOException var31) {
                Log.e("ApnUtils", "loadApns caught ", var31);
            } finally {
                parser.close();
            }

            Log.v("ApnUtils", "MMSC: " + mmsc + ", MMS Proxy: " + proxy + ", MMS Port: " + port);
            errorStr = null;
            if (errorStr != null) {
                String err = String.format("MmsConfig.loadMmsSettings mms_config.xml missing %s setting", errorStr);
                Log.e("ApnUtils", err);
            }

            return apns;
        } else {
            Log.v("ApnUtils", "couldn't find both mcc and mnc. mcc = " + mcc + ", mnc = " + mnc);
            return null;
        }
    }

    private static boolean isValidNetworkOperator(String networkOperator) {
        return networkOperator != null && !networkOperator.isEmpty() && !networkOperator.contains("null");
    }

    private static void setApns(Context context, ApnUtils.APN apn) {
        PreferenceManager.getDefaultSharedPreferences(context).edit().putString("mmsc_url", apn.mmsc).putString("mms_proxy", apn.proxy).putString("mms_port", apn.port).commit();
    }

    private static void beginDocument(XmlPullParser parser, String firstElementName) throws XmlPullParserException, IOException {
        int type;
        while((type = parser.next()) != 2 && type != 1) {
        }

        if (type != 2) {
            throw new XmlPullParserException("No start tag found");
        } else if (!parser.getName().equals(firstElementName)) {
            throw new XmlPullParserException("Unexpected start tag: found " + parser.getName() + ", expected " + firstElementName);
        }
    }

    private static void nextElement(XmlPullParser parser) throws XmlPullParserException, IOException {
        int type;
        while((type = parser.next()) != 2 && type != 1) {
        }

    }

    private static class APN {
        public String name;
        public String mmsc;
        public String proxy;
        public String port;

        private APN() {
        }
    }

    public interface OnApnFinishedListener {
        void onFinished();
    }
}

这是我发送附有照片的彩信的功能。

fun sendMMS(
    to: String,
    messageText: String,
    settings: com.forkthecoop.com22222.messaging.Settings
) {
    val sendSettings = Settings()
    //Telephony.Carriers.TYPE
    sendSettings.mmsc =  settings.mmsc
    sendSettings.proxy = settings.mmsProxy
    sendSettings.port = settings.mmsPort
    sendSettings.useSystemSending = true
    var sendTransaction = Transaction(context, sendSettings)
    var message = Message(messageText, to)
     message.setImage(this.bitmap)
    sendTransaction.sendNewMessage(message, Transaction.NO_THREAD_ID)
    Toast.makeText(context, "Message sent", Toast.LENGTH_SHORT).show()
}

当我运行代码时,它正在烤消息,“消息已发送”,但它没有向其他设备发送任何消息。我的代码有什么问题,我该如何解决?

0 个答案:

没有答案