java.lang.IllegalArgumentException: недопустимый символ (U + 0) при записи XML-файла Android - PullRequest
2 голосов
/ 10 апреля 2019

Я создаю XML-файл для резервного копирования SMS.Он отлично работает на большинстве устройств, но на некоторых устройствах выдает ошибку.

Ниже приведен код для записи XML-файла:

fun writeAllMsgs(msgList: ArrayList<MsgModel>, fileNm: String): Boolean{
        val xmlSerializer = Xml.newSerializer()
        val writer = StringWriter()
        try {

            xmlSerializer.setOutput(writer)
            xmlSerializer.startDocument("UTF-8", true)
            xmlSerializer.startTag("", MSG_ALL_SMS)

            for (msg in msgList) {
                xmlSerializer.startTag("", MSG_SMS)

                xmlSerializer.startTag("", MSG_ADDRESS)
                xmlSerializer.text(msg.address)
                xmlSerializer.endTag("", MSG_ADDRESS)

                xmlSerializer.startTag("", MSG_BODY)
                xmlSerializer.text(msg.body)
                xmlSerializer.endTag("", MSG_BODY)


                xmlSerializer.startTag("", MSG_DATE)
                xmlSerializer.text(msg.date)
                xmlSerializer.endTag("", MSG_DATE)

                xmlSerializer.startTag("", MSG_TYPE)
                xmlSerializer.text(msg.type)
                xmlSerializer.endTag("", MSG_TYPE)

                xmlSerializer.startTag("", MSG_NAME)
                xmlSerializer.text(msg.name)
                xmlSerializer.endTag("", MSG_NAME)

                xmlSerializer.startTag("", MSG_READ)
                xmlSerializer.text(msg.read)
                xmlSerializer.endTag("", MSG_READ)

                xmlSerializer.startTag("", MSG_SER_CENTER)
                xmlSerializer.text(msg.serviceCenter)
                xmlSerializer.endTag("", MSG_SER_CENTER)

                xmlSerializer.startTag("", MSG_PHOTO_URI)
                if (msg.photo.isNullOrEmpty())
                    xmlSerializer.text("")
                else
                    xmlSerializer.text(msg.photo)
                xmlSerializer.endTag("", MSG_PHOTO_URI)
                xmlSerializer.endTag("", MSG_SMS)

            }

            xmlSerializer.endTag("", MSG_ALL_SMS)
            xmlSerializer.endDocument()
            xmlSerializer.flush()

            val createdFile = CreateSMSFile(fileNm)
            val out = mContext.contentResolver.openOutputStream(createdFile)
            val strData = writer.toString()
            out!!.write(strData.toByteArray())
            out.close()
            return true

        } catch (e: Exception) {
            Applog.e(TAG, e)
            return false
        }
    }

Я получаю следующий журнал аварийного отказа:

java.lang.IllegalArgumentException: Illegal character (U+0)
       at org.kxml2.io.KXmlSerializer.reportInvalidCharacter(KXmlSerializer.java:148)
       at org.kxml2.io.KXmlSerializer.writeEscaped(KXmlSerializer.java:139)
       at org.kxml2.io.KXmlSerializer.text(KXmlSerializer.java:540)
       at com.allbackup.helpers.MsgHelper.writeAllMsgs(MsgHelper.java:156)
       at com.allbackup.ui.activity.InnerHomeActivity$backupData.doInBackground(InnerHomeActivity.java:553)
       at com.allbackup.ui.activity.InnerHomeActivity$backupData.doInBackground(InnerHomeActivity.java:523)
       at android.os.AsyncTask$2.call(AsyncTask.java:295)
       at java.util.concurrent.FutureTask.run(FutureTask.java:237)
       at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
       at java.lang.Thread.run(Thread.java:818)

В соответствии с приведенной выше ошибкой в ​​этой строке отображается ошибка:

xmlSerializer.text(msg.body)

Насколько я понимаю, это происходит из-за латинского или специального символа и для этой обработки, которую я уже реализовал "UTF-8 ", как вы можете видеть при написании XML-файла, но все еще сталкиваетесь с этой ошибкой.

Пожалуйста, помогите мне решить эту проблему

Ответы [ 2 ]

1 голос
/ 10 апреля 2019

Я подозреваю, что вы получаете нулевой символ Unicode, и именно поэтому он ломается.

Недопустимый символ (U + 0)

Более подробную информацию можно найти по адресу: https://www.fileformat.info/info/unicode/char/0000/index.htm

Записать содержимое msg.body, чтобы подтвердить это, и если это так, вам нужно продезинфицировать его, прежде чем пытаться его сохранить.

Я смог воссоздать исходное сообщение об ошибке, используя этот фрагмент

private fun writeMessageBodyTest() {

    val xmlSerializer = Xml.newSerializer()

    val writer = StringWriter()

    try {

        xmlSerializer.setOutput(writer)
        xmlSerializer.startDocument("UTF-8", true)

        val illegalChar = '\u0000'

        xmlSerializer.startTag("", "message")
        xmlSerializer.text("$illegalChar")
        xmlSerializer.endTag("", "message")

        xmlSerializer.endDocument()
        xmlSerializer.flush()

        Log.d(TAG, "Xml: ${writer.toString()}")

    } catch (e: Exception) {
        Log.e(TAG, e.message, e)
    }
}
0 голосов
/ 10 апреля 2019

"U+..." означает, что это символ utf16. Я предполагаю, что это сбой в SMS с Emoji, потому что Emojis являются utf16 символы. Попробуйте сохранить смс с Emoji, чтобы проверить это предположение.

 xmlSerializer.text("??")
...