java.lang.ClassNotFoundException: Didn't find class "javax.xml.stream.XMLEventFactory"

0

Cześć, walczę już od jakiegoś czasu z problemem, który wystepuje gdy próbuje użyć w mojej aplikacji biblioteki:

implementation 'org.apache.poi:poi-ooxml:4.0.0'

bład:

java.lang.RuntimeException: An error occured while executing doInBackground()
        at android.os.AsyncTask$3.done(AsyncTask.java:304)
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
        at java.util.concurrent.FutureTask.run(FutureTask.java:242)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
        at java.lang.Thread.run(Thread.java:818)
     Caused by: java.lang.NoClassDefFoundError: Failed resolution of: Ljavax/xml/stream/XMLEventFactory;
        at org.apache.poi.openxml4j.opc.internal.marshallers.PackagePropertiesMarshaller.<clinit>(PackagePropertiesMarshaller.java:41)
        at org.apache.poi.openxml4j.opc.OPCPackage.<init>(OPCPackage.java:140)
        at org.apache.poi.openxml4j.opc.ZipPackage.<init>(ZipPackage.java:78)
        at org.apache.poi.openxml4j.opc.OPCPackage.create(OPCPackage.java:365)
        at org.apache.poi.xssf.usermodel.XSSFWorkbook.newPackage(XSSFWorkbook.java:495)
        at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:261)
        at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:257)
        at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:245)
        at com.krzys.weilandtapp.SaveActivity$AsyncSaveToFile.writeExcel(SaveActivity.java:159)
        at com.krzys.weilandtapp.SaveActivity$AsyncSaveToFile.doInBackground(SaveActivity.java:116)
        at com.krzys.weilandtapp.SaveActivity$AsyncSaveToFile.doInBackground(SaveActivity.java:96)
        at android.os.AsyncTask$2.call(AsyncTask.java:292)
        at java.util.concurrent.FutureTask.run(FutureTask.java:237)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
        at java.lang.Thread.run(Thread.java:818) 
     Caused by: java.lang.ClassNotFoundException: Didn't find class "javax.xml.stream.XMLEventFactory" on path: DexPathList

próbuje różnych rozwiązań ale ciągle mi nie wychodzi, np. z multiDexem
https://stackoverflow.com/questions/26609734/how-to-enable-multidexing-with-the-new-android-multidex-support-library

albo próbowałem użyć https://github.com/centic9/poi-on-android
ale do końca nie wiem jak tego użyć

czy pomoże ktoś rozwiązać ten problem ? ktoś może zna metode na to?

lub może znacie inny sposób tworzenia pliku Excel.xlsx w aplikacji Androida ?

0

spróbowałem to w inny sposób, użyłem do tworzenia Excela Api:
http://www.independentsoft.de/jspreadsheet/index.html

ale dalej nie mogłem utworzyć podpisanego pliku APK, wiec w buildzie gradla dodałem:

lintOptions {
        checkReleaseBuilds false
        abortOnError false
    }

teraz mogłem utworzyć plik APK, ale nie moge go zainstalować :(

02-01 12:58:34.118 756-789/? W/PackageManager: Failed collect during installPackageLI
    android.content.pm.PackageParser$PackageParserException: Package /data/app/vmdl275365086.tmp/base.apk has no certificates at entry AndroidManifest.xml
        at android.content.pm.PackageParser.collectCertificates(PackageParser.java:1108)
        at android.content.pm.PackageParser.collectCertificates(PackageParser.java:1061)
        at com.android.server.pm.PackageManagerService.installPackageLI(PackageManagerService.java:10963)
        at com.android.server.pm.PackageManagerService.access$2300(PackageManagerService.java:255)
        at com.android.server.pm.PackageManagerService$6.run(PackageManagerService.java:8999)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:135)
        at android.os.HandlerThread.run(HandlerThread.java:61)
        at com.android.server.ServiceThread.run(ServiceThread.java:46)

jakby ktoś miał chwilke czasu i rzucił okiem, co w poniższej klasie może być uważane za przestarzałe ?

import android.app.ProgressDialog;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Environment;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Toast;

import com.google.gson.Gson;
import com.independentsoft.office.spreadsheet.Cell;
import com.independentsoft.office.spreadsheet.Workbook;
import com.independentsoft.office.spreadsheet.Worksheet;

import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;

public class SaveActivity extends AppCompatActivity {

    public static final String MY_HASHMAP = "myHashMap";

    Button btnSave;
    EditText etFileName;
    RadioGroup rgFileType;
    RadioButton rbExcelXLSX, rbCSV;
    String fileType;

    HashMap<String, Long> barcodeMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_save);

        ActionBar actionBar = getSupportActionBar();
        actionBar.setTitle(R.string.titleSaveAvtivity);
        actionBar.setDisplayUseLogoEnabled(true);
        actionBar.setDisplayShowHomeEnabled(true);

        barcodeMap = new HashMap<String, Long>();

        loadHashMapFromMemory();

        btnSave = (Button) findViewById(R.id.btnSave);
        btnSave.setOnClickListener((view) -> {
            if (checkedRadioButton()) {
                new AsyncSaveToFile().execute();
            } else {
                Toast.makeText(SaveActivity.this, R.string.stCheckFileType, Toast.LENGTH_SHORT).show();
            }
        });

        etFileName = (EditText) findViewById(R.id.etFileName);

        rgFileType = (RadioGroup) findViewById(R.id.rgFileType);
        rbExcelXLSX = (RadioButton) findViewById(R.id.rbExcelTypeXLSX);
        rbCSV = (RadioButton) findViewById(R.id.rbCSVType);

    }

    boolean checkedRadioButton() {
        boolean checked = (rbExcelXLSX.isChecked() || rbCSV.isChecked());
        return checked;
    }

    public void onRadioButtonClick(View view) {

        switch (view.getId()) {
            case R.id.rbExcelTypeXLSX:
                fileType = ".xlsx";
                break;
            case R.id.rbCSVType:
                fileType = ".csv";
                break;
        }
    }

    private class AsyncSaveToFile extends AsyncTask<Void, Integer, Void> {

        ProgressDialog dialog;
        File file;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();

            dialog = new ProgressDialog(SaveActivity.this);
            dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            dialog.setMax(barcodeMap.size());
            dialog.show();
        }


        @Override
        protected Void doInBackground(Void... voids) {

            if (rbExcelXLSX.isChecked()) {
                writeExcel();
            }
            if (rbCSV.isChecked()) {
                writeCSV();
            }

            return null;
        }

        void writeCSV() {

            file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS), fileName() + fileType);
            try {
                Writer writer = new FileWriter(file);
                writer.append(getString(R.string.strScanedBarcode))
                        .append(" , ")
                        .append(getString(R.string.strHowManyTimesScaned))
                        .append("\n");
                for (Map.Entry<String, Long> entry : barcodeMap.entrySet()) {
                    writer.append(entry.getKey())
                            .append(" , ")
                            .append(entry.getValue().toString())
                            .append("\n");
                }
                writer.flush();
                writer.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }

        void writeExcel() {

            Workbook workbook = new Workbook();
            Worksheet sheet = new Worksheet();
            sheet.set("A1", new Cell(getString(R.string.strScanedBarcode)));
            sheet.set("B1", new Cell(getString(R.string.strHowManyTimesScaned)));

            workbook.getSheets().add(sheet);

            int rowNum = 2;

            double currentProgress = 0;
            double previousProgress = 0;

            for (Map.Entry<String, Long> entry : barcodeMap.entrySet()){

                sheet.set("A",rowNum, new Cell(entry.getKey()));
                sheet.set("B", rowNum, new Cell(entry.getValue().toString()));
                rowNum++;

                currentProgress = barcodeMap.entrySet().size() / barcodeMap.size();
                if (currentProgress - previousProgress >= 0.05) {
                    publishProgress(barcodeMap.entrySet().size());
                    previousProgress = currentProgress;
                }
            }


            file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS), fileName() + fileType);
            FileOutputStream fileOutputStream = null;

            try {
                fileOutputStream = new FileOutputStream(file);
                workbook.save(fileOutputStream);
                fileOutputStream.flush();
                fileOutputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);

            dialog.setProgress(values[0]);
        }

        @Override
        protected void onPostExecute(Void v) {
            super.onPostExecute(v);

            dialog.dismiss();
            Toast.makeText(SaveActivity.this, getString(R.string.strSavedIn) + file.getPath(), Toast.LENGTH_LONG).show();
        }
    }

    String fileName() {
        String fileName = etFileName.getText().toString().trim();
        if (fileName.equals("")) {
            fileName = "default";
        }

        return fileName;
    }

    void loadHashMapFromMemory() {
        SharedPreferences preferences = getSharedPreferences(MY_HASHMAP, MODE_PRIVATE);
        String wrapperStr = preferences.getString("hashmap", "");
        Gson gson = new Gson();
        MapWrapper wrapper = gson.fromJson(wrapperStr, MapWrapper.class);
        if (wrapper != null) {
            barcodeMap = wrapper.getBarcodeMap();
        }
    }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1