Habs gefixt, true false als Rückgabe hatte nicht funktioniert. Man muss die super Methode zurückgeben, dann funktionierts!
Beiträge von Chrizzle
-
-
Habe onTouchEvent durch dispatchTouchEvent ersetzt und nun funktionierts. Das Problem ist nun nur, dass meine ganzen onClickListener in meinen Tabs nicht mehr funktionieren.
-
Sers,
ich habe ein Problem mit dem ViewFlipper. Und zwar habe ich 3 Tabs. im ersten befindet sich nur ein Button und ein TextView. In den beiden anderen sind 2 ListViews angelegt. Ich habe den ViewFlipper in meiner TabActivity angelegt. Mit einem onTouchEvent fange ich die Bewegung ab und setze den aktuellen Tab dementsprechend. Mein Problem ist, dass es nur im ersten Tab funktioniert. Meine Vermutung ist, dass meine ListViews, die fill_parent gesetzt sind, dieses TouchEvent nicht akzeptieren, da sie ihr eigenes TouchEvent haben.
Hat jemand einen Einfall dazu? -
Keiner eine Idee?:/
-
Hab eben den Fehler gefunden. Beim Kippen des Telefons wird onDestroy() aufgerufen. Da ich das Telefon zum Scannen drehen muss, hing es immer davon ab, ob ich das Telefon vor oder nach dem Öffnen des Barcodescanner Apps gedreht habe
Was ein blödes Problem...
Mit android:configChanges="orientation|keyboardHidden" verhinder ich, dass dies geschieht. Zack alles läuft. Da macht man sich Tage lang Gedanken und dann liegt es an so etwas bescheuertem.
Trotzdem danke für die HilfeEdit:
Der Code der im onDestroy() liegt, entfernt nur den Listener aus meiner webApi. Setzt sie aber nicht komplett null. Da hatte ich mich wohl schlecht ausgedrückt
Und das soll eben dort liegen. -
Er läuft natürlich trotzdem in das onDestroy() rein. Und daraus folgt natürlich dass alle Klassenvariablen null werden. Somit auch meine webApi. Das seltsame ist aber, dass es nicht immer der Fall ist. Die Chance steht aber 70/30, dass onDestroy() aufgerufen wird
Auch dein Tipp konnte mir daher leider nicht helfenEdith sagt:
Hab nochmal mit ganz kleinen Schritten durchdebugged. In dem Moment, in dem ich einen Barcode eingescannt habe(die Activity wurde also schon lange verlassen), wird erst das onDestroy() der Ursprungs-Activity aufgerufen. Was aber wie gesagt nicht immer passiert. Wenn es aber eintritt, dann gleich mehrmals hintereinander. Sehr sehr skuril -
Hallo zusammen,
ich habe ein Problem mit meinem Lifecycle.
Ich rufe von einer Activity die zxing Barcodescanner App auf.Hier die Methode im IntenIntegrator:
Java
Alles anzeigenpublic AlertDialog initiateScan(Collection<String> desiredBarcodeFormats) { Intent intentScan = new Intent(BS_PACKAGE + ".SCAN"); intentScan.addCategory(Intent.CATEGORY_DEFAULT); // check which types of codes to scan for if (desiredBarcodeFormats != null) { // set the desired barcode types StringBuilder joinedByComma = new StringBuilder(); for (String format : desiredBarcodeFormats) { if (joinedByComma.length() > 0) { joinedByComma.append(','); } joinedByComma.append(format); } intentScan.putExtra("SCAN_FORMATS", joinedByComma.toString()); } String targetAppPackage = findTargetAppPackage(intentScan); if (targetAppPackage == null) { return showDownloadDialog(); } intentScan.setPackage(targetAppPackage); intentScan.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); intentScan.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); activity.startActivityForResult(intentScan, REQUEST_CODE); return null; }
und dann geht der Spaß los. im onActivityResult verarbeite ich das Ergebnis:
Java
Alles anzeigenIntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent); if (scanResult != null && scanResult.contents.length() != 0) { this.scanResultBarcode = scanResult.contents; try { progressbar.setVisibility(View.VISIBLE); webApi.addRequest(this.settings.getUser(), this.settings.getPassword(), this.scanResultBarcode); Log.e(TAG, "Api request send"); } catch (RemoteException ex) { Log.i("EXCEPTION_SCAN", "Api request failed"); } }
ich schiebe den Barcode in einen Hintergrundprozess, wo er an einen SOAP Service geschickt wird. Genau hier habe ich das Problem.
Hier wird in der Ursprungs-Activity ab und an das onDestroy(nicht immer) aufgerufen und somit wird meine wepApi null:Java
Alles anzeigen@Override protected void onDestroy() { super.onDestroy(); try { if (this.webApi != null) { this.webApi.removeListener(this.webListener); } getApplicationContext().unbindService(this.serviceConnection); stopService(this.webIntent); Log.e(TAG, "Service stopped from Activity"); } catch(RemoteException ex) { Log.e(TAG, "Failed to unbind from the service", ex); } }
Hier hängt sich meine App natürlich auf. Ich vermute ja, dass Android aufgrund von Speicherplatz einfach meine Ursprungs-Activity killt. Aber wie gehe ich dagegen vor? Kann ich das irgendwie verhindern? Oder habe ich eine Möglichkeit meine webApi zu sichern?
Viele Grüße
Christian -
-
Was bekommst du denn für eine Exception im Debugger?
-
Du könntest einfach alles akzeptieren was du bekommst.
So hat es bei mir funktioniert:Java
Alles anzeigenfinal static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() { public boolean verify(String hostname, SSLSession session) { return true; } }; private static void trustAllHosts() { TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { @Override public void checkClientTrusted(java.security.cert.X509Certificate[] x509Certificates, String s) throws java.security.cert.CertificateException { //To change body of implemented methods use File | Settings | File Templates. } @Override public void checkServerTrusted(java.security.cert.X509Certificate[] x509Certificates, String s) throws java.security.cert.CertificateException { //To change body of implemented methods use File | Settings | File Templates. } public java.security.cert.X509Certificate[] getAcceptedIssuers() { return new java.security.cert.X509Certificate[] {}; } public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } } }; try { SSLContext sc = SSLContext.getInstance("TLS"); sc.init(null, trustAllCerts, new java.security.SecureRandom()); HttpsURLConnection .setDefaultSSLSocketFactory(sc.getSocketFactory()); } catch (Exception e) { e.printStackTrace(); } }
-
Ich habe soweit alles umgesetzt:
Java
Alles anzeigenpublic void createContact(Contacts contact) { ArrayList ops = new ArrayList(); int rawContactInsertIndex = ops.size(); ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI) .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null) .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null) .build()); //------------------------------------------------------ Names ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex) .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, contact.getFirstName() + " " + contact.getSecondName()) .withValue(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, contact.getSecondName()) .withValue(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, contact.getFirstName()) .withValue(ContactsContract.CommonDataKinds.StructuredName.PREFIX, contact.getTitle()) .build()); //------------------------------------------------------ Organization ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex) .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE) .withValue(ContactsContract.CommonDataKinds.Organization.COMPANY, contact.getCompany()) .withValue(ContactsContract.CommonDataKinds.Organization.TITLE, contact.getFunction()) .withValue(ContactsContract.CommonDataKinds.Organization.TYPE, ContactsContract.CommonDataKinds.Organization.TYPE_WORK) .build()); //------------------------------------------------------ Work Numbers ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex) .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE) .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, contact.getPhone()) .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_WORK) .build()); //------------------------------------------------------ Mobile Number ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex) .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE) .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, contact.getMobilePhone()) .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE) .build()); //------------------------------------------------------ Fax Number Work ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex) .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE) .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, contact.getFax()) .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_FAX_WORK) .build()); //------------------------------------------------------ Email ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex) .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE) .withValue(ContactsContract.CommonDataKinds.Email.DATA, contact.getEmail()) .withValue(ContactsContract.CommonDataKinds.Email.TYPE, ContactsContract.CommonDataKinds.Email.TYPE_WORK) .build()); //------------------------------------------------------ Address ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex) .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE) .withValue(ContactsContract.CommonDataKinds.StructuredPostal.CITY, contact.getCity()) .withValue(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY,contact.getCountry()) .withValue(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE,contact.getZipCode()) .withValue(ContactsContract.CommonDataKinds.StructuredPostal.STREET,contact.getStreet()) .withValue(ContactsContract.CommonDataKinds.StructuredPostal.TYPE, ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK) .build()); try { getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); } catch (RemoteException e) { // ToDo }catch (OperationApplicationException e) { // ToDo } }
Ich habe nur nachwievor das Problem mit dem Accounttypen. Ich möchte gerne einen komplett neuen haben, den ich dann den Kontakten zuweisen kann, die ich mit meiner App erstellt habe. Bin da auf Quellen mit dem AccountManager gestoßen, kam damit aber nicht wirklich zurecht. Vielleicht hat ja jemand Erfahrung mit dem Umgang der damit in Zusammenhang stehenden Klassen und kann mir da unter die Arme greifen bzw ein paar hilfreiche Tipps geben...
Vielen Dank
Christian -
Hallo zusammen,
ich habe folgendes in Planung:
Ich habe ein Objekt mit verschiedenen Informationen über einen Kontakt, welches ich mir von einem Webservice abhole. Nun möchte ich mit diesen Properties einen neuen Kontakt erstellen. Bislang habe ich es wie folgt geregelt:Javapublic void createContact(Contacts contact) { Intent intent = new Intent(Intent.ACTION_INSERT); intent.setType(ContactsContract.Contacts.CONTENT_TYPE); intent.putExtra(ContactsContract.Intents.Insert.NAME, contact.getTitle() + contact.getFirstName() + " " + contact.getSecondName()); intent.putExtra(ContactsContract.Intents.Insert.PHONE, contact.getPhone()); intent.putExtra(ContactsContract.Intents.Insert.PHONE_TYPE, "Büro"); intent.putExtra(ContactsContract.Intents.Insert.SECONDARY_PHONE, contact.getMobilePhone()); intent.putExtra(ContactsContract.Intents.Insert.SECONDARY_PHONE_TYPE, "Mobil"); intent.putExtra(ContactsContract.Intents.Insert.TERTIARY_PHONE, contact.getFax()); intent.putExtra(ContactsContract.Intents.Insert.TERTIARY_PHONE_TYPE, "Fax"); intent.putExtra(ContactsContract.Intents.Insert.EMAIL, contact.getEmail()); intent.putExtra(ContactsContract.Intents.Insert.COMPANY, contact.getCompany()); intent.putExtra(ContactsContract.Intents.Insert.POSTAL, contact.getZipCode()); intent.putExtra(ContactsContract.Intents.Insert.JOB_TITLE, contact.getFunction()); intent.putExtra(ContactsContract.Intents.Insert.POSTAL_TYPE, "PLZ");
Mit dieser Möglichkeit bin ich aber stark eingeschränkt. Ich kann z.B. Vor- und Nachname nicht von einander trennen. Dazu kann ich nicht alle Informationen, die mir der Webservice gibt, einbauen. Hier die XML die ich bekomme und parse:
XML<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Body> <getVisitenkarteByBarcodeResponse xmlns="http://tempuri.org/"> <getVisitenkarteByBarcodeResult xmlns:a="http://schemas.datacontract.org/2004/07/ADITUS.LeadTrackingService" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <a:abteilung></a:abteilung> <a:anrede></a:anrede> <a:branche></a:branche> <a:email></a:email> <a:fax/> <a:firma></a:firma> <a:funktion></a:funktion> <a:handy/> <a:nachname></a:nachname> <a:nation></a:nation> <a:ort></a:ort> <a:plz></a:plz> <a:strasse></a:strasse> <a:strasse2/> <a:telefon/> <a:titel/> <a:vorname></a:vorname> </getVisitenkarteByBarcodeResult> </getVisitenkarteByBarcodeResponse> </s:Body></s:Envelope>
Daher wäre es schön, wenn ich die Möglichkeit hätte, neue Felder im Kontakt zu erstellen und sie beliebig zu benennen. Dazu möchte ich die Möglichkeit haben, einen neuen Kontakt Typ zu haben, dem ich meinen neuen Kontakt zuordnen kann, wie z.B. googlemail oder Facebook etc.
Ich trete ein wenig auf der Stelle. Wäre schön, wenn jemand eine Idee für mich hat.Liebe Grüße
Christian