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);
}
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.
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 ...
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.
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
dbf.setIgnoringComments(true);
dbf.setValidating(true);