Category Archives: Android - Page 2

Android NoClassDefFound komma-ihåg

Denna bara måste jag lägga in i dataminnet för att se till att jag inte måste leta upp den igen: http://android.foxykeep.com/dev/how-to-fix-the-classdefnotfounderror-with-adt-17

Automata-dagliga-, -nattliga-, -när-ni-vill-byggen av Android med Ant

Androidengineer har ett blogginlägg som jag läst på och testat för att få ordning på schemalagda byggen av mina (singular, egentligen) Android-applikationer.
Jag ska kortfattat försöka stylta upp vad det är som innefattar en sådan uppsättning i en Debian headless servermiljö. Jag har inte lyckats stillisera ihop en ren och fin sammanhängande process för detta, så vänligen läs in på länken ovan för att (föhopnningsvis) få svar på eventuella funderingar och frågor kring hur man använder vissa verktyg.
Logga in på din Debian-burk, bestäm dig för var du vill sätta upp saker och var du kan tänka dig vilja placera ett flertal hundra megabyte av Android SDK och kör:

  1. Installera Ant
  2. Installera Java Compiler (Jag använder openjdk-6-jdk)
  3. Ladda ner Android SDK:t (http://developer.android.com)
  4. Se till att Android SDK:t finns i din Path
  5. I SDK-mappen, kör: android update sdk –no-ui
  6. Checka ut/Kopiera ut ditt Android-projekt till en lämplig mapp på servern. Denna fungerar som bas för byggena
  7. Kör: android update project –path [sökväg till projektet] –target [Android build target] (Headless- Android-kommandostöd)
  8. Kör: ant

Så, nu bör du iallafall kunna bygga projektet genom Ant, vilket innebär att du är såhär [] nära att kunna fixa automatbyggebitarna.
Jag kan ge ett exempel på ett bash-skript jag kör, så du har något att utgå ifrån:

#!/bin/sh
cd /home/drlaban/projects/banjolejon
git checkout development //Kan vara vilken branch som helst
git reset --hard HEAD //Ser till så att det under inga omständigheter finns någon form av ändringar kvar innan bygget (man kan aldrig vara säker)
git pull
rm build.xml //Den här tas bort då den verkar fela då och då när man fösöker uppdatera sitt Android-projekt
android update project --path . //Uppdaterar Android-projektet, bygger build.xml
ant clean //Tar bort allt gammalt Ant-skröfs som ligger och skräpar
ant debug //Bygger nu hela projektet med Ant. Tar lite tid beroende på storlek
cp /home/drlaban/projects/banjolejon/bin/banjo-debug.apk /storage/dump/banjo-daily.apk

Sådär! Då har ni fått grunden för det här. Jag har gjort det och testat det och har till synes fått det att fungera. Så det borde du med kunna göra.

OBS! Detta bygger bara debug-versioner av din applikation. För att kunna bygga livliga applikationer måste man signera dem. Det står beskrivet i den första länken hur man kan gå till väga där.

AndroidManifest.xml-fel

Androidmanifestet är en nyckelspelare i det här med Androidutveckling eftersom den definierar upp vilka aktiviteter som ska finnas tillgängliga, vilka rättigheter till enheten applikationen ska ha och massvis med annat.
Får man fel här kan det hända att man kör applikationen och till synes inte får ut något användbart i loggen.
I det här fallet kan det dock dyka upp ett loggat fel likt

W/ResourceType(53): Resources don't contain package for resource number 0x7f0700e5

i en eller flera rader.
Det underliga och lite snikna här är att applikationen kompilerar, installeras och körs. Men det kan te sig lite olika resultat

  • Det loggade felet ovan
  • Det finns ingen launcher-ikon
  • Det loggas inget (som ser ut att vara sammankopplat med applikationen man kör)
  • Min aktivitet visas/körs aldrig

Svaren till alla dessa händelser är (tills någon säger annorlunda): Ditt Androidmanifest är fel! Så se nu till att kolla lite närmre på det och försäkra dig om att det som står där i faktiskt är något som Android förstår och kan köra.

Logga (System.out.print) allt!

Satt och försökte hjälpa en snubbe med ett problem rörande Spinners i Android. Tydligen kraschade appen han byggde varje gång man tryckte på Spinnern och valen skulle visas. Enligt stacktracen var det ett NullPointerException, men det som gjorde det hela svårare var att Spinnern faktiskt innehöll minst ett val.

Efter ungefär en trkvarts, timmes felsökande visar det sig att det körs två loopar, baserat på databasresultat. Varje iteration i första loopen lägger in ett val i listan, varje iteration i andra loopen drar ifrån ett antal val i listan. I detta fallet visade det sig att första loopen gjordes med en check

for(int i = 1; i <= list.getsize(); i++) { //Lägg till val }

Den andra loopen använde sig av

for(int i = 0; i < list2.getsize(); i++) { //Dra ifrån val }

Det intressanta i de här looparna är att den första lägger till hela listans resultat + 1. Detta innebar att det hamnat ett null-objekt i listan, som loop två inte kunde ta bort.
Det enda som skvallrade om något kring detta var att skriva ut loggar över vad som inträffade. Det hade tagit ungefär 15 minuter att lösa detta, om man hade börjat direkt med att logga vad som skedde. Så, till alla er som sitter där ute och tror/litar på att ni vet vad er kod gör, _utan_ att se loggarna: Tänk om. Ni har ingen aning.

EditText med allt annat än strängar

Det här förbryllade mig ett tag. Jag försökte sätta ett värde i en EditText och fick glada skutt från logcat:en

E/AndroidRuntime( 3712): java.lang.RuntimeException: Unable to start activity ComponentInfo{se.sigtuna.android.uvbaisk/se.sigtuna.android.uvbaisk.UvbaiskQuestions1Activity}: android.content.res.Resources$NotFoundException: String resource ID #0x0
E/AndroidRuntime( 3712): Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x0

Det tog mig ca tjugo minuter att till slut prova

editText.setText(String.valueOf(myObject.intId))

istället för

editText.setText(myObject.intId)

Så, kids. Se till att bara, bara, BARA skicka in strängar till en EditText, oavsett om logcat vill säga att den saknar en resurs, likt det som kan hänta om man anger tex en widget som tillhör en annan aktivitet än den som syns just nu……

Positioneringsbedrövelse med ZoomButtonsController

Jag har suttit och försökt få ordning på det här till och från i flera dagar, men det tycks inte finnas någon annan lösning än:

Om du vill placera knapparna till en ZoomButtonsController någon annanstans än centrerad i botten på skärmen: Glöm det!

Jag använder mig av ZoomButtonsControllern i en klass som extendar en ImageView och med Internets hjälp har jag konstaterat att det till dags dator inte är möjligt att placera om knapparna.

Det tråkiga i den här kråksången är att ZoomButtonsControllern är en i övrigt bra klass som bland annat implementerar godbitar som fade in/ut när de visas. Det alternativ man har att använda sig av istället är klassen ZoomControls, som är en enklare form av ZoomButtonsController, men i en layout-mässigt bättre widget.

Men för all del, ni får gärna öppna mina ögon för att komma åt möjligheten att påverka placeringen. Det hade jag högljutt tackat för!

Androidemulatorn startar inte på grund av sökvägsproblem

Androids AVD-hanterare kan ibland ställa till lite trubbel, beroende på om man valt att installera saker och ting på nytt, om man använder Windows XP/7/Linux/[Något annat]. Min miljö är Windows 7 x64 och jag får ibland upp detta fel

PANIC: Could not open: C:\Users\drlaban\.android/avd/Android2.1.ini

Den som är lite uppmärksam ser att det kan vara lite härligt blandat mellan Windows/Linux-slasharna, men en sak som inte är alltför tydlig är det faktum att jag i min Windows-miljö flyttat alla “Mina *”-mappar till en annan disk. Detta hanteras inte så himla bra av AVD och ställer alltså till det när man skapar emulator-avbildningar.

Så, vad göra? Det hela är mycket enkelt:

  • Skapa en miljövariabel som heter ANDROID_SDK_HOME som pekar ut sökvägen till den disk/mapp som innehåller mappen “.android”
  • Starta om AVD-managern, skapa om avbildningarna och kör på som det var tänkt från början.

Min bild i Meddelande-appen i Android

Googles appar kan lämna en del att önska ibland och en sån sak är till exempel den lilla bilden som ska synas i Meddelande-appen när man skickar SMS eller MMS till folk.
Alltsomoftast visas en grå ruta istället för din egen bild på utgående meddelanden, medan inkommande meddelanden (oftast) inte har några problem alls med att visa en bild på personen om det finns någon.
Jag vet inte hur det är i IceCreamSandwich, men anledningen till att det blir så i Gingerbread beror (säkert bland annat) på att Android inte vet vilket nummer du har. Och Android bygger det på ditt nummer som du har på SIM-kortet, av alla ställen. Du kan kolla om du har ett telefonnummer satt genom att gå via Home -> Meny-knappen -> Settings -> About phone -> Status och kika under My phone number. Står det inget eller Unknown där så måste man fixa det.

Så, för att fixa det:

1: Ta fram/Låna en gammal/annan telefon där man kan redigera något som kallas Mitt nummer (undvik Android-telefoner för detta)
2: Sätt in SIM-kortet i den gamla telefonen och starta den
3: Beroende på hur telefonen fungerar kan man lägga in Mitt nummer i någon del av telefonen, ta dig dit
4: Lägg in ditt nummer och spara
5: Sätt tillbaks SIM-kortet i din Android-telefon
6: Kolla så att det nu står ett nummer i Status enligt ovan
7: Om det fortfarande saknas en bild på dig, lägg till dig själv i Kontakt-listan med exakt samma nummer som du gjort i steg 4
(8: Om det fortfarande saknas en bild på dig, kontrollera att du verkligen har en bild på ditt Google-konto och försök att skicka ett nytt meddelande och kolla igen.)

Android-handgrepp

När man jobbar med ADB och håller på att utveckla appar är paketnamnen för installerade appar lämpliga att känna till. Det finns ett ADB-kommando som är rätt vettigt till detta:

pm list packages -f

Blekinge studentkår-appen uppdaterad!

Blekinge studentkårs Android-app har uppdaterats. Eftersom jag är en av utvecklarna av denna app (som dessutom har det yttersta ansvaret för den just nu) tycker jag det är lite lämpligt att jag åtminstonde langar in en länk till original-inlägget.

http://sis.bthstudent.se/2011/721/blekinge-studentkar-appen-har-uppdaterats/

En QR-kod till er att skanna av

https://market.android.com/details?id=se.bthstudent.android.bsk