odftoolkit icon indicating copy to clipboard operation
odftoolkit copied to clipboard

Android support

Open Junzz0 opened this issue 1 year ago • 3 comments

Sorry, because I clicked the wrong order and it closed #292 .

When I manually add the following dependencies,

implementation("xerces:xercesImpl:2.12.2")
implementation("com.fasterxml.woodstox:woodstox-core:6.6.2")

java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/xerces/dom/DocumentImpl;error will not be reported.

I call

val odt = OdfTextDocument.newTextDocument()

odt.addText("TEST")

application.contentResolver
.openFileDescriptor(path.toUri(), "w")
.use { pfd -> odt.save(ParcelFileDescriptor.AutoCloseOutputStream(pfd)) }

,The following error will be reported: java.lang.NoSuchMethodError: No static method newFactory()Ljavax/xml/stream/XMLOutputFactory; in class Ljavax/xml/stream/XMLOutputFactory; or its super classes (declaration of 'javax.xml.stream.XMLOutputFactory' appears in dex) at org.odftoolkit.odfdom.pkg.rdfa.DOMRDFaParser.(DOMRDFaParser.java:34) at org.odftoolkit.odfdom.pkg.rdfa.DOMRDFaParser.createInstance(DOMRDFaParser.java:38) at org.odftoolkit.odfdom.pkg.OdfFileDom.updateInContentMetadataCache(OdfFileDom.java:699) at org.odftoolkit.odfdom.dom.element.text.TextPElement.onInsertNode(TextPElement.java:114) at org.odftoolkit.odfdom.pkg.OdfElement.onInsertNode(OdfElement.java:783) at org.odftoolkit.odfdom.pkg.OdfElement.insertBefore(OdfElement.java:794) at org.apache.xerces.dom.NodeImpl.appendChild(Unknown Source:1) at org.odftoolkit.odfdom.pkg.OdfElement.appendChild(OdfElement.java:589) at org.odftoolkit.odfdom.pkg.OdfFileSaxHandler.startElement(OdfFileSaxHandler.java:137) at org.odftoolkit.odfdom.pkg.rdfa.MultiContentHandler.startElement(MultiContentHandler.java:76) at org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown Source:146) at org.apache.xerces.parsers.AbstractXMLDocumentParser.emptyElement(Unknown Source:0) at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source:427) at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source:514) at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source:15) at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source:79) at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source:11) at org.apache.xerces.parsers.XMLParser.parse(Unknown Source:5) at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source:35) at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source:41) at org.odftoolkit.odfdom.pkg.OdfFileDom.initialize(OdfFileDom.java:236) at org.odftoolkit.odfdom.dom.OdfContentDom.initialize(OdfContentDom.java:74) at org.odftoolkit.odfdom.pkg.OdfFileDom.(OdfFileDom.java:102) at org.odftoolkit.odfdom.dom.OdfContentOrStylesDomBase.(OdfContentOrStylesDomBase.java:45) at org.odftoolkit.odfdom.dom.OdfContentDom.(OdfContentDom.java:59) at org.odftoolkit.odfdom.dom.OdfSchemaDocument.getContentDom(OdfSchemaDocument.java:418) at org.odftoolkit.odfdom.doc.OdfDocument.getContentRoot(OdfDocument.java:737) at org.odftoolkit.odfdom.doc.OdfTextDocument.getContentRoot(OdfTextDocument.java:321) at org.odftoolkit.odfdom.doc.OdfTextDocument.addText(OdfTextDocument.java:357) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:104) at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(LimitedDispatcher.kt:111) at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:99) at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:584) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:811) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:715) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:702) Suppressed: kotlinx.coroutines.internal.DiagnosticCoroutineContextException: [StandaloneCoroutine{Cancelling}@e56a0d2, Dispatchers.IO]

Junzz0 avatar May 20 '24 07:05 Junzz0

Check that xml-apis has been imported, but the https://developer.android.com/reference/packages Android documentation does not have the javax.xml.stream package, so I'm not sure if it's because xml-apis doesn't support Android.

Junzz0 avatar May 20 '24 07:05 Junzz0

If the official is willing to be compatible with Android, I still hope to get help.

Junzz0 avatar May 20 '24 07:05 Junzz0

If you look into the error stack above, you see that the following call does not exist in your Android: XMLOutputFactory.newFactory() being called from https://github.com/tdf/odftoolkit/blob/master/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/rdfa/DOMRDFaParser.java#L34 the method is available in JDK 11: https://docs.oracle.com/en/java/javase/11/docs/api/java.xml/javax/xml/stream/XMLOutputFactory.html#newFactory()

But it seems Android does not support the full JDK functionality: https://stackoverflow.com/questions/5176028/how-writing-xml-file-usning-xmlstreamwriter-in-android

To me, it is fine to support Android and would review any pull requested that you might provide, but I am too occupied to pursue this task myself. But perhaps others might be interested as well.

Godspeed! Svante

PS: For next time, I accidentally closed issues as well, but you may reopen them in the future - but no problem we can continue here... :-)

svanteschubert avatar May 22 '24 15:05 svanteschubert