Einbindung auf Android

152 views
Skip to first unread message

Jan Schüttken

unread,
Feb 19, 2018, 9:09:56 AM2/19/18
to hbci4java
Hallo,
Ich versuche die Bibliothek auf Android einzubinden, jedoch bekomme ich ich immer den "loading of passport file failed" Fehler, der 
durch "org.kapott.hbci.passport.HBCIPassportPinTan.read(HBCIPassportPinTan.java:237)" ausgelöst wird.  Dies wird in meinem Code durch "AbstarctHBCIPassport.getInstance();" aufgerufen. (Mein Code ist aus dem Beispielprojekt und ich versuche momentan nur eine Verbindung herzustellen.)
Mit der benötigten Datei habe ich schon alle mir erdenklichen Varianten ausprobiert, sowohl im Cash der App, Internal Files, External Files. Bei allen Varianten konnte ich die Datei beschreiben und das beschriebene wieder auslesen. Dabei ist nie ein Fehler entstanden, daher weiß ich nicht wieso ein Fehler beim lesen der Datei durch hbci4java ensteht.
Könnt ihr mir weiterhelfen?

Olaf Willuhn

unread,
Feb 19, 2018, 9:22:28 AM2/19/18
to hbci...@googlegroups.com
Wie lautet denn der komplette Stacktrace?

Gruss
Olaf

Jan Schüttken

unread,
Feb 19, 2018, 10:01:13 AM2/19/18
to hbci4java
Anbei mal der Error Report ;)
fail.pdf

Olaf Willuhn

unread,
Feb 19, 2018, 10:07:22 AM2/19/18
to hbci...@googlegroups.com
> Anbei mal der Error Report ;)

Der eigentliche Fehler ist: "java.lang.IllegalStateException: password
has been cleared".

Zu finden in Zeile 55 deines PDFs. Den Text musste ich uebrigens per
Hand abtippen, weil das (ueber 2MB grosse(!) PDF) keinen Text sondern
nur Bilder von Text enthaelt). Du haettest den Text auch einfach in
deine Mail kopieren koennen.

Zum eigentlichen Fehler. Siehe:
https://www.willuhn.de/bugzilla/show_bug.cgi?id=1707

Jan Schüttken

unread,
Feb 19, 2018, 1:12:24 PM2/19/18
to hbci4java
Wenn ich das richtig verstehe, geht es bei der Seite nur um Passwörter, welche die genanten Sonderzeichen enthalten. Das ist nicht mein Problem, egal welche Verbindungsgraten ich eingebe, es kommt immer dieser Fehler.
Sorry wegen dem PDF, ich ich dachte das wäre eine gute Option.

Hier mein Code:
private final static HBCIVersion VERSION = HBCIVersion.HBCI_300;

public File getTempFile(Context context, String url) {
File file = null;
try {
String fileName = Uri.parse(url).getLastPathSegment();
file = File.createTempFile(fileName, null, context.getCacheDir());
} catch (IOException e) {
// Error while creating file
}
return file;
}

public static final int REQUEST_WRITE_STORAGE = 112;

private void requestPermission(Activity context) {
boolean hasPermission = (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED);
if (!hasPermission) {
ActivityCompat.requestPermissions(context,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
REQUEST_WRITE_STORAGE);
} else {
// You are allowed to write external storage:
String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/new_folder";
File storageDir = new File(path);
if (!storageDir.exists() && !storageDir.mkdirs()) {
// This should never happen - log handled exception!
}
}
}

private File getExternalFile() {
if (isExternalStorageReadable() && isExternalStorageWritable()) {
// Get the directory for the user's public pictures directory.
File file = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), "test2passport.dat");
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
Log.e("FILE", file.getAbsolutePath());
}
return file;
} else {
return null;
}
}

/* Checks if external storage is available for read and write */
public boolean isExternalStorageWritable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
return true;
}
return false;
}

/* Checks if external storage is available to at least read */
public boolean isExternalStorageReadable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state) ||
Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
return true;
}
return false;
}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//requestPermission(this);
File passportFile = getExternalFile();// new File(this.getFilesDir(), "testpassport.dat");
Log.d("EXISTS", passportFile.exists() + "");
Log.d("READ", passportFile.canRead() + "");
Log.d("WRITE", passportFile.canWrite() + "");
Log.d("PATH", passportFile.getAbsolutePath() + "");
startBank(passportFile.getAbsolutePath());
}

private void startBank(String passportFilePath) {
Properties props = new Properties();
HBCIUtils.init(props, new MyHBCICallback());

// In der Passport-Datei speichert HBCI4Java die Daten des Bankzugangs (Bankparameterdaten, Benutzer-Parameter, etc.).
// Die Datei kann problemlos geloescht werden. Sie wird beim naechsten mal automatisch neu erzeugt,
// wenn der Parameter "client.passport.PinTan.init" den Wert "1" hat (siehe unten).
// Wir speichern die Datei der Einfachheit halber im aktuellen Verzeichnis.
File passportFile = new File(passportFilePath);// new File(this.getFilesDir(), "testpassport.dat");
Log.d("EXISTS", passportFile.exists() + "");
Log.d("READ", passportFile.canRead() + "");
Log.d("WRITE", passportFile.canWrite() + "");
Log.d("PATH", passportFile.getAbsolutePath() + "");
//passportFile = getTempFile(this, "testpassport.dat");
// Wir setzen die Kernel-Parameter zur Laufzeit. Wir koennten sie alternativ
// auch oben in "props" setzen.
HBCIUtils.setParam("client.passport.default", "PinTan"); // Legt als Verfahren PIN/TAN fest.
HBCIUtils.setParam("client.passport.PinTan.filename", passportFile.getAbsolutePath());
HBCIUtils.setParam("client.passport.PinTan.init", "1");

// Erzeugen des Passport-Objektes.
HBCIPassport passport = AbstractHBCIPassport.getInstance();

// Konfigurieren des Passport-Objektes.
// Das kann alternativ auch alles ueber den Callback unten geschehen

// Das Land.
passport.setCountry("DE");

// Server-Adresse angeben. Koennen wir entweder manuell eintragen oder direkt von HBCI4Java ermitteln lassen
BankInfo info = HBCIUtils.getBankInfo(BLZ);
passport.setHost(info.getPinTanAddress());

// TCP-Port des Servers. Bei PIN/TAN immer 443, da das ja ueber HTTPS laeuft.
passport.setPort(443);

// Art der Nachrichten-Codierung. Bei Chipkarte/Schluesseldatei wird
// "None" verwendet. Bei PIN/TAN kommt "Base64" zum Einsatz.
passport.setFilterType("Base64");

// Das Handle ist die eigentliche HBCI-Verbindung zum Server
HBCIHandler handle = null;

try {
// Verbindung zum Server aufbauen
handle = new HBCIHandler(VERSION.getId(), passport);

// Wir verwenden einfach das erste Konto, welches wir zur Benutzerkennung finden
Konto[] konten = passport.getAccounts();
if (konten == null || konten.length == 0)
error("Keine Konten ermittelbar");

log("Anzahl Konten: " + konten.length);
Konto k = konten[1];

// 1. Auftrag fuer das Abrufen des Saldos erzeugen
HBCIJob saldoJob = handle.newJob("SaldoReq");
saldoJob.setParam("my", k); // festlegen, welches Konto abgefragt werden soll.
saldoJob.addToQueue(); // Zur Liste der auszufuehrenden Auftraege hinzufuegen

// 2. Auftrag fuer das Abrufen der Umsaetze erzeugen
HBCIJob umsatzJob = handle.newJob("KUmsAll");
umsatzJob.setParam("my", k); // festlegen, welches Konto abgefragt werden soll.
umsatzJob.addToQueue(); // Zur Liste der auszufuehrenden Auftraege hinzufuegen

// Hier koennen jetzt noch weitere Auftraege fuer diesen Bankzugang hinzugefuegt
// werden. Z.Bsp. Ueberweisungen.

// Alle Auftraege aus der Liste ausfuehren.
HBCIExecStatus status = handle.execute();

// Pruefen, ob die Kommunikation mit der Bank grundsaetzlich geklappt hat
if (!status.isOK())
error(status.toString());

// Auswertung des Saldo-Abrufs.
GVRSaldoReq saldoResult = (GVRSaldoReq) saldoJob.getJobResult();
if (!saldoResult.isOK())
error(saldoResult.toString());

Value s = saldoResult.getEntries()[0].ready.value;
log("Saldo: " + s.toString());


// Das Ergebnis des Jobs koennen wir auf "GVRKUms" casten. Jobs des Typs "KUmsAll"
// liefern immer diesen Typ.
GVRKUms result = (GVRKUms) umsatzJob.getJobResult();

// Pruefen, ob der Abruf der Umsaetze geklappt hat
if (!result.isOK())
error(result.toString());

// Alle Umsatzbuchungen ausgeben
List<GVRKUms.UmsLine> buchungen = result.getFlatData();
for (GVRKUms.UmsLine buchung : buchungen) {
StringBuilder sb = new StringBuilder();
sb.append(buchung.valuta);

Value v = buchung.value;
if (v != null) {
sb.append(": ");
sb.append(v);
}

List<String> zweck = buchung.usage;
if (zweck != null && zweck.size() > 0) {
sb.append(" - ");
// Die erste Zeile des Verwendungszwecks ausgeben
sb.append(zweck.get(0));
}

// Ausgeben der Umsatz-Zeile
log(sb.toString());
}
} finally {
// Sicherstellen, dass sowohl Passport als auch Handle nach Beendigung geschlossen werden.
if (handle != null)
handle.close();

passport.close();
}
}

/**
* Ueber diesen Callback kommuniziert HBCI4Java mit dem Benutzer und fragt die benoetigten
* Informationen wie Benutzerkennung, PIN usw. ab.
*/
private static class MyHBCICallback extends AbstractHBCICallback {

@Override
public void log(String msg, int level, Date date, StackTraceElement trace) {

}

/**
* @see org.kapott.hbci.callback.HBCICallback#callback(org.kapott.hbci.passport.HBCIPassport, int, java.lang.String, int, java.lang.StringBuffer)
*/
@Override
public void callback(HBCIPassport passport, int reason, String msg, int datatype, StringBuffer retData) {
// Diese Funktion ist wichtig. Ueber die fragt HBCI4Java die benoetigten Daten von uns ab.
switch (reason) {
// Mit dem Passwort verschluesselt HBCI4Java die Passport-Datei.
// Wir nehmen hier der Einfachheit halber direkt die PIN. In der Praxis
// sollte hier aber ein staerkeres Passwort genutzt werden.
// Die Ergebnis-Daten muessen in dem StringBuffer "retData" platziert werden.
case NEED_PASSPHRASE_LOAD:
case NEED_PASSPHRASE_SAVE:
retData.replace(0, retData.length(), PIN);
break;

// PIN wird benoetigt
case NEED_PT_PIN:
retData.replace(0, retData.length(), PIN);
break;

// BLZ wird benoetigt
case NEED_BLZ:
retData.replace(0, retData.length(), BLZ);
break;

// Die Benutzerkennung
case NEED_USERID:
retData.replace(0, retData.length(), USER);
break;

// Die Kundenkennung. Meist identisch mit der Benutzerkennung.
// Bei manchen Banken kann man die auch leer lassen
case NEED_CUSTOMERID:
retData.replace(0, retData.length(), USER);
break;

// Manche Fehlermeldungen werden hier ausgegeben
case HAVE_ERROR:
System.out.println(msg);
break;

default:
// Wir brauchen nicht alle der Callbacks
break;

}
}

/**
* @see org.kapott.hbci.callback.HBCICallback#status(org.kapott.hbci.passport.HBCIPassport, int, java.lang.Object[])
*/
@Override
public void status(HBCIPassport passport, int statusTag, Object[] o) {
// So aehnlich wie log(String,int,Date,StackTraceElement) jedoch fuer Status-Meldungen.
}

}

/**
* Gibt die angegebene Meldung aus.
*
* @param msg die Meldung.
*/
private static void log(String msg) {
System.out.println(msg);
}

/**
* Beendet das Programm mit der angegebenen Fehler-Meldung.
*
* @param msg die Meldung.
*/
private static void error(String msg) {
System.err.println(msg);
System.exit(1);
}

Gruß Jan

Olaf Willuhn

unread,
Feb 20, 2018, 3:28:43 AM2/20/18
to hbci...@googlegroups.com
> Wenn ich das richtig verstehe, geht es bei der Seite nur um Passwörter,
> welche die genanten Sonderzeichen enthalten. Das ist nicht mein Problem,
> egal welche Verbindungsgraten ich eingebe, es kommt immer dieser Fehler.

Du bist also sicher, dass in der PIN (welche du ja laut deinem Code in
den Callbacks NEED_PASSPHRASE_LOAD und NEED_PASSPHRASE_SAVE fuer die
Verschluesselung der Passport-Datei verwendest) keine Sonderzeichen
enthalten sind?

Dann weiss ich auch nicht, was die Ursache ist. Ggf. muesstest du dir
den Java-Source des von dir verwendeten Android-SDK herunterladen, in
deine IDE einbinden und einen Breakpoint in
org.bouncycastle.jcajce.provider.symmetric.util.BCPBEKey in Zeile 122
setzen. Genau dort findet ja der Aufruf zu PBEKey#getPassword statt, wo
PBEKey eine Exception wirft, weil das Passwort NULL ist.

Jan Schüttken

unread,
Feb 22, 2018, 8:50:37 AM2/22/18
to hbci4java

Also ich habe meinen Code jetzt in "normalen" Java also auf dem Pc zum laufen bekommen. Kann es sein das Linux Umgebung bei Android Probleme macht?
Hast du da Erfahrung?
Oder hast du es schon mal auf Linux/Android zum laufen bekommen?

Gruß Jan

Olaf Willuhn

unread,
Feb 22, 2018, 9:03:08 AM2/22/18
to hbci...@googlegroups.com
> Also ich habe meinen Code jetzt in "normalen" Java also auf dem Pc zum
> laufen bekommen. Kann es sein das Linux Umgebung bei Android Probleme macht?

Nein, ich denke eher, dass es die JVM ist, die sich unter Android
unterscheidet.

Ich selbst arbeite nur unter Linux. Allerdings auf PC, nicht Android.

> Hast du da Erfahrung?

Nein, leider auch nicht.

Gruss
Olaf

Jan Schüttken

unread,
Feb 23, 2018, 7:00:22 AM2/23/18
to hbci4java
Gibt es eine Möglichkeit die Passwort- File zu umgehen?

Dorian

unread,
Feb 23, 2018, 7:12:40 AM2/23/18
to hbci4java
Ja, indem man einen eigenen Passport, wie hier beschrieben, nutzt.

Jan Schüttken

unread,
Feb 23, 2018, 1:47:08 PM2/23/18
to hbci4java
Ok danke, jetzt bin ich auf ein anderes Problem gestoßen.
Ich habe wie von dir beschrieben die Password-File umgangen und auf dem Windows Pc klappt wieder alles super, danke dafür!
Auf Andorid kommt nun folgender crash:

E/AndroidRuntime: FATAL EXCEPTION: Thread-6
                  Process: jan.schuettken.moneybank, PID: 5260
                  org.kapott.hbci.exceptions.HBCI_Exception: can not create HBCI handle
                      at org.kapott.hbci.manager.HBCIHandler.<init>(HBCIHandler.java:142)
                      at jan.schuettken.bank.UmsatzAbrufPinTan.runDemo(UmsatzAbrufPinTan.java:114)
                      at jan.schuettken.moneybank.main.MainActivity$4.run(MainActivity.java:174)
                   Caused by: org.kapott.hbci.exceptions.HBCI_Exception: error while initializing message generator
                      at org.kapott.hbci.manager.HBCIKernelImpl.<init>(HBCIKernelImpl.java:89)
                      at org.kapott.hbci.manager.HBCIHandler.<init>(HBCIHandler.java:127)
                      at jan.schuettken.bank.UmsatzAbrufPinTan.runDemo(UmsatzAbrufPinTan.java:114) 
                      at jan.schuettken.moneybank.main.MainActivity$4.run(MainActivity.java:174) 
                   Caused by: org.kapott.hbci.exceptions.HBCI_Exception: can not create document builder
                      at org.kapott.hbci.manager.MsgGen.<init>(MsgGen.java:91)
                      at org.kapott.hbci.manager.HBCIKernelImpl.<init>(HBCIKernelImpl.java:86)
                      at org.kapott.hbci.manager.HBCIHandler.<init>(HBCIHandler.java:127) 
                      at jan.schuettken.bank.UmsatzAbrufPinTan.runDemo(UmsatzAbrufPinTan.java:114) 
                      at jan.schuettken.moneybank.main.MainActivity$4.run(MainActivity.java:174) 
                   Caused by: javax.xml.parsers.ParserConfigurationException: No validating DocumentBuilder implementation available
                      at org.apache.harmony.xml.parsers.DocumentBuilderFactoryImpl.newDocumentBuilder(DocumentBuilderFactoryImpl.java:61)
                      at org.kapott.hbci.manager.MsgGen.<init>(MsgGen.java:83)
                      at org.kapott.hbci.manager.HBCIKernelImpl.<init>(HBCIKernelImpl.java:86) 
                      at org.kapott.hbci.manager.HBCIHandler.<init>(HBCIHandler.java:127) 
                      at jan.schuettken.bank.UmsatzAbrufPinTan.runDemo(UmsatzAbrufPinTan.java:114) 
                      at jan.schuettken.moneybank.main.MainActivity$4.run(MainActivity.java:174) 

Weißt du was jetzt der Fehler sein könnte?

Gruß Jan

Olaf Willuhn

unread,
Feb 24, 2018, 2:22:16 AM2/24/18
to hbci4java

Kann es sein, dass du für eine recht alte Android-Zielversion compilierst?

Hab folgendes gefunden: https://stackoverflow.com/questions/8370148/android-org-w3c-dom-no-validating-documentbuilder-implementation-available

Scheinbar unterstuetzten aeltere Android-Versionen noch keine XML-Schema-Validierung.

--
Sie erhalten diese Nachricht, weil Sie in Google Groups E-Mails von der Gruppe "hbci4java" abonniert haben.
Wenn Sie sich von dieser Gruppe abmelden und keine E-Mails mehr von dieser Gruppe erhalten möchten, senden Sie eine E-Mail an hbci4java+...@googlegroups.com.
Wenn Sie in dieser Gruppe einen Beitrag posten möchten, senden Sie eine E-Mail an hbci...@googlegroups.com.
Gruppe besuchen: https://groups.google.com/group/hbci4java
Wenn Sie diese Diskussion im Web verfolgen möchten, rufen Sie https://groups.google.com/d/msgid/hbci4java/4ebe09e6-7373-4fa6-82a4-1275c176afdf%40googlegroups.com auf.
Weitere Optionen finden Sie unter https://groups.google.com/d/optout.

Jan Schüttken

unread,
Feb 24, 2018, 6:15:53 AM2/24/18
to hbci4java
Nein, das ist leider nicht das Problem. Ich arbeite mit Version 5.1 und habe mal auf 8.0 hochgesetzt selbe Fehlermeldung. Es liegt glaube ich an dem DocumentBuilderFactory der ist wohl auch noch immer nicht dabei...

TestUser

unread,
Jul 31, 2018, 10:01:39 AM7/31/18
to hbci4java
Hi, hast du das Problem gelöst?

On Saturday, February 24, 2018 14:15:53 ​​UTC + 3 Jan Schüttken wrote:
No, that's not the problem. I am working with version 5.1 and have set the same error message to 8.0. I think it's the DocumentBuilderFactory which is probably still not there ...

fabia...@googlemail.com

unread,
Aug 7, 2018, 4:13:18 PM8/7/18
to hbci4java
Hallo,

ich habe versuche auch gerade die Library unter Android zu verwenden und habe (glaube ich) das gleiche Problem:

Beim Versuch das Beispiel zum Laufen zu bekommen, wird folgender Fehler geworfen:
org.kapott.hbci.exceptions.InvalidUserDataException: can not load syntaxfile /data/data/com.f2ktools.androidhbci.demo.debug/files/hbci-300.xml with this classloader

Der Fehler tritt in der Klasse HBCIKernelImpl auf, und zwar in der Zeile:

syntaxStream=cl.getResourceAsStream(filename); //--> Hier gibt der Classloader null zurück
        if (syntaxStream==null)
            throw new InvalidUserDataException(HBCIUtilsInternal.getLocMsg("EXCMSG_KRNL_CANTLOAD_SYN",filename));

Auf meinem Linux Rechner läuft es dagegen.
Hat jemand eine mögliche Lösung?
Dankeschön.

Olaf Willuhn

unread,
Aug 7, 2018, 4:19:32 PM8/7/18
to hbci4java

Hatte versehentlich auf deine Mail-Adresse geantwortet - hier nochmal in der Liste: Ist die XML-Datei denn ueberhaupt im JAR mit drin? Denn das ist eine Stelle im Code, die bei anderen unter Android schon funktioniert hatte.

--
Sie erhalten diese Nachricht, weil Sie in Google Groups E-Mails von der Gruppe "hbci4java" abonniert haben.
Wenn Sie sich von dieser Gruppe abmelden und keine E-Mails mehr von dieser Gruppe erhalten möchten, senden Sie eine E-Mail an hbci4java+...@googlegroups.com.
Wenn Sie in dieser Gruppe einen Beitrag posten möchten, senden Sie eine E-Mail an hbci...@googlegroups.com.
Gruppe besuchen: https://groups.google.com/group/hbci4java
Wenn Sie diese Diskussion im Web verfolgen möchten, rufen Sie https://groups.google.com/d/msgid/hbci4java/19e9ffdc-6b48-4d3b-b243-b5d764aad4e0%40googlegroups.com auf.

fabia...@googlemail.com

unread,
Aug 11, 2018, 8:49:44 AM8/11/18
to hbci4java
Hallo Olaf,

Die XML Datei wird geladen und der Filestream auf die Datei in den MsgGen Konstruktor übergeben. Hier passiert die Exception.

syntax=db.parse(syntaxFileStream); --> Wirft Exception: org.xml.sax.SAXParseException: name expected (position:DOCDECL @14:20 in java.io.InputStreamReader@42390028)

Im XML Dokument steht an der Stelle:
<!ELEMENT DEGdef ((DE | DEG)+,valids*,value*)>
<!ATTLIST DEGdef
  id ID #REQUIRED
  needsRequestTag (1) #IMPLIED
>

Das XML File habe ich nicht verändert und die XML Syntax ist lauf einem Web Parser valide
Message has been deleted

fabia...@googlemail.com

unread,
Aug 11, 2018, 10:47:47 AM8/11/18
to hbci4java
Hallo,

ich bin weitergekommen, nur habe ich wohl das Problem, dass registerUser() fehlschlägt, weil die PDB properties leer sind.

Beim Abfragen der BPD Daten bei der Bank kommt leider nichts mit "BPD." . Davor gibt es eine Exception in der Funktion ping(), beim Versuche zu Verbinden (conn.connect()).

Eigentlich würde mir reichen, nur die Historie der Transaktionen runterzuladen. Gibt es dafür irgendeinen vereinfachten Weg?
- zitierten Text einblenden -

fabia...@googlemail.com

unread,
Aug 12, 2018, 4:05:01 AM8/12/18
to hbci4java
Hallo Jahn, ich glaube ich hatte den gleichen Fehler wie du im MsgGen Code. Das müsste da sein, wo der Documenta Bilder die hbci-300.XML einlesen will. Android hat ein glaube ich ein Problem mit der Schema Definition vor dem eigentlichen XML Inhalt. Ich habe den Teil aus dem XML rausgeworfen, dann klappte auch das parsen

Jan Schüttken

unread,
Aug 12, 2018, 7:01:45 AM8/12/18
to hbci4java
Ja, genau die Fehler hatte ich auch.
Bei Android fehlen einige Bibliotheken und die Umsetzung des Filereaders oder ähnlich scheint mir etwas anders zu sein.
Gibt es eine offizielle Dokumentation des Vorgangs? Vielleicht kann man da ein paar Dinge umgehen?

fabia...@googlemail.com

unread,
Aug 13, 2018, 1:20:33 PM8/13/18
to hbci4java
Jetzt bin ich in der Funktio pingpong und bekomme eine Java.IO.IOECXEPTION wenn eine HttpUrlConnection zur Bank aufgemacht werden soll.
Mehr steht in der Exception leider nicht drin. Die Permissions für Internetzugriff habe ich im Manifest hinzugefügt.
Vielleicht gibt es unter Android eine andere Http Library die ich verwenden muss?

Jan Schüttken

unread,
Aug 13, 2018, 2:53:52 PM8/13/18
to hbci4java
Also die Bib gibt es auf jeden Fall unter Android:
https://developer.android.com/reference/java/net/HttpURLConnection
Message has been deleted

Jan Schüttken

unread,
Sep 30, 2018, 7:08:04 AM9/30/18
to hbci4java
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();

dbf.setIgnoringComments(true);
dbf.setValidating(true);


Hallo,
weiß jemand von euch, was das Validating des Dokumentes macht?
(Der Code ist aus der MsgGen Klasse, Zeile 84)
Oder besser, was genau in diesem Fall passiert?
Gibt es eine Möglichkeit das XML Dokument anzupassen?
Auf Andoird ist dieses nicht möglich, daher müsste diese Methode umgangen werden.

Der Fehler, welcher auftritt:

Caused by: org.xml.sax.SAXParseException: name expected (position:DOCDECL @14:20 in java.io.InputStreamReader@1f53624) 
        at org.apache.harmony.xml.parsers.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:147)
        at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:107)
        at org.kapott.hbci.manager.MsgGen.<init>(MsgGen.java:87)
        at org.kapott.hbci.manager.HBCIKernelImpl.<init>(HBCIKernelImpl.java:86) 
        at org.kapott.hbci.manager.HBCIHandler.<init>(HBCIHandler.java:127) 
        at jan.schuettken.bank.banking.Banking.getHandler(Banking.java:96) 
        at jan.schuettken.bank.banking.Banking.startConnectionAndReadItems(Banking.java:47) 
        at jan.schuettken.bank.main.BankActivity.testBank(BankActivity.java:26) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385) 
        at android.view.View.performClick(View.java:6294) 
        at android.view.View$PerformClick.run(View.java:24770) 
        at android.os.Handler.handleCallback(Handler.java:790) 
        at android.os.Handler.dispatchMessage(Handler.java:99) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.ActivityThread.main(ActivityThread.java:6494) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:440) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 

Jan Schüttken

unread,
Sep 30, 2018, 7:14:54 AM9/30/18
to hbci4java
Das XML welches aufgerufen wird ist die Version 300

Olaf Willuhn

unread,
Oct 1, 2018, 4:28:12 AM10/1/18
to hbci...@googlegroups.com
Hallo,

Jan Schüttken wrote:
> DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
>
> dbf.setIgnoringComments(true);
> dbf.setValidating(true);
>
>
> Hallo,
> weiß jemand von euch, was das Validating des Dokumentes macht?

Da wird das XML-Dokument halt auf Validitaet gegen die DTD geprueft.

> Oder besser, was genau in diesem Fall passiert?
> Gibt es eine Möglichkeit das XML Dokument anzupassen?

Was genau willst du denn da anpassen?

Gruss
Olaf
Reply all
Reply to author
Forward
0 new messages