<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>CodePlay &#187; Mobil</title>
	<atom:link href="http://codeplay.hu/tag/mobil/feed/" rel="self" type="application/rss+xml" />
	<link>http://codeplay.hu</link>
	<description>Kitaláljuk, lefejlesztjük, telepítjük</description>
	<lastBuildDate>Wed, 21 Dec 2011 14:48:53 +0000</lastBuildDate>
	<language>hu</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Android onItemClick probléma ListView és Button használatakor</title>
		<link>http://codeplay.hu/developer/2010/07/android-onitemclick-problema-listview-es-button-hasznalatakor/</link>
		<comments>http://codeplay.hu/developer/2010/07/android-onitemclick-problema-listview-es-button-hasznalatakor/#comments</comments>
		<pubDate>Tue, 27 Jul 2010 23:16:26 +0000</pubDate>
		<dc:creator>kepes</dc:creator>
				<category><![CDATA[Szoftverfejlesztés]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[fejlesztés]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[Mobil]]></category>

		<guid isPermaLink="false">http://codeplay.hu/?p=40</guid>
		<description><![CDATA[Népszerű és mindenképp használatra javasolt komponens Androidon a ListView. Gyakorlatilag a legtöbbet használt UI elem, bárhmely programot használunk, rendszeresen feltűnik különböző formákban. Lényege, hogy a képernyőn megjelenő elemeket egy listába rendezzük, és ezt a listát görgethetjük le-fel ha nem fér ki minden elem a képernyőre. Használata relative egyszerű, amíg nem akarunk egyedi megjelenést, például Button vagyCheckbox komponenseket [...]]]></description>
			<content:encoded><![CDATA[<p>Népszerű és mindenképp használatra javasolt komponens Androidon a <code>ListView</code>. Gyakorlatilag a legtöbbet használt UI elem, bárhmely programot használunk, rendszeresen feltűnik különböző formákban. Lényege, hogy a képernyőn megjelenő elemeket egy listába rendezzük, és ezt a listát görgethetjük le-fel ha nem fér ki minden elem a képernyőre. Használata relative egyszerű, amíg nem akarunk egyedi megjelenést, például <code>Button</code> vagy<code>Checkbox</code> komponenseket belerakni, mert ekkor azonnal beleütközünk a problémába, a <code>ListView onItemClick</code>event handler nem hívódik meg kattintáskor.</p>
<p><span id="more-40"></span>Az Internet tele van a problémával, de teljes egészében leírt megoldást ritkán találni. Általában utalások vannak rá, hogy tároljunk ID-t a Tag mezőben, vagy írjuk át az <code>Adapter</code>-t, de mik is ezek az utalások tulajdonképpen?</p>
<p>A feladat amit kitaláltam egy olyan <code>ListView</code> megjelenítés, ami a <code>SimpleAdaptert</code>-t használja adatforrásnak, így a layout betölthető XML-ből egyszrűen. A layout tartalmaz egy gombot, amit megnyomva az Activity onClick metódusa hívódik meg. A probléma itt következik: az <code>onClick</code> az <code>onItemClick</code>-el ellentétben nem kapja meg melyik soron kattintottunk. Valahonnan pedig illene tudni, hiszen nem minden soron ugyanazt szeretnénk végrehajtani.</p>
<p>Az ötelt a fent amlített netes leírások alapján adja magát, tároljuk le az onClick-et meghívó View Tag-jében (<code>View.setTag(Object o)</code>) a szükséges azonosítót, így az onClick-ben a paraméterként megkapott View-tól le tudjuk kérdezni.</p>
<p>Minden ListView a lista elemeit egy Adapter osztálytól kapja (<code>ListView.setAdapter()</code>) a <code>getView()</code> metóduson keresztül. Az adapter kis átírásával megoldható, hogy a lista elemeibe bekerüljön a az Id a megfelelő Tag property-be, amikor a ListView meghívja a <code>getView()</code>-t. Leszármaztattam hát a <code>SimpleAdaptert</code>-t:</p>
<pre class="brush: java">public class ClickableButtonListAdapter extends SimpleAdapter {	

	private static final String HASHMAP_ID = "_id";

	public ClickableButtonListAdapter(Context context,
			List&lt;? extends Map&lt;String, ?&gt;&gt; data, int resource, String[] from,
			int[] to) {
		super(context, data, resource, from, to);

	}

	@SuppressWarnings("unchecked")
	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		View view = super.getView(position, convertView, parent);
		setViewTag(view, ((HashMap&lt;String,String&gt;) getItem(position)).get(HASHMAP_ID) );
		return view;
	}

	private void setViewTag(View view, Object tag) {
		view.setTag(tag);
		if (view instanceof ViewGroup) {
			for (int i=0; i &lt; ((ViewGroup) view).getChildCount(); i++) {
				setViewTag(((ViewGroup) view).getChildAt(i), tag);
			}
		}
	}
}
</pre>
<p>A példában a lista elemei HashMap-ek, így ebből szedem ki az Id-t. A <code>HahMap</code>-ben az Id mező az &#8220;_id&#8221; elemben van, így ezt keresem ki, és rakom a Tag-be. A <code>setViewTag()</code> rekurzív metódus végigmegy az összes megjelenítendő View elemen és beállítja a Tag-et, így bármelyikre definiálhatjuk majd az onClick-et, mindig megkapjuk a Tag-ben a kiválasztott sor Id-ját.</p>
<p>Az <code>Activity</code>-ben az <code>onClick()</code> igen egyszerű:</p>
<pre class="brush: java">public void onClick(View v) {
         Toast.makeText(this, "onClick id: " + v.getTag(), Toast.LENGTH_SHORT).show();
}</pre>
<p>Nem mondom, hogy szép megoldás, de használható. Jobban tetszene, ha az Android megfelelően támogatná az egyedi ListView létrehozását esetleg azzal, hogy az onItemClick meghívódna, és eldönthetném, hogy mit akarok kezdeni az eseménnyel.</p>
]]></content:encoded>
			<wfw:commentRss>http://codeplay.hu/developer/2010/07/android-onitemclick-problema-listview-es-button-hasznalatakor/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Android és adatbázis</title>
		<link>http://codeplay.hu/developer/2010/05/android-es-adatbazis/</link>
		<comments>http://codeplay.hu/developer/2010/05/android-es-adatbazis/#comments</comments>
		<pubDate>Sat, 22 May 2010 22:55:14 +0000</pubDate>
		<dc:creator>kepes</dc:creator>
				<category><![CDATA[Szoftverfejlesztés]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[fejlesztés]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[Mobil]]></category>

		<guid isPermaLink="false">http://codeplay.hu/?p=31</guid>
		<description><![CDATA[Előző bejegyzésekben már írtam a HTC Desire felhasználhatóságáról, tapasztalataimról, mint end-user. Mivel szoftverfejlesztőként is érdekelt a telefon és az Android, ezért amint megvolt a készülék, azonnal elkezdtem nézni az Android SDK-t. Elsőként szerettem volna egy egyszerű kis alkalmazást összerakni, amely tartalmaz beviteli mezőket, és egy listát, ahol a már felvitt elemek módosíthatók. A lista természetesen [...]]]></description>
			<content:encoded><![CDATA[<p>Előző bejegyzésekben már írtam a HTC Desire felhasználhatóságáról, tapasztalataimról, mint end-user. Mivel szoftverfejlesztőként is érdekelt a telefon és az Android, ezért amint megvolt a készülék, azonnal elkezdtem nézni az <a href="http://developer.android.com">Android SDK</a>-t. Elsőként szerettem volna egy egyszerű kis alkalmazást összerakni, amely tartalmaz beviteli mezőket, és egy listát, ahol a már felvitt elemek módosíthatók.<span id="more-31"></span></p>
<p>A lista természetesen legyen a tapifonokon már megszokott szépen gördíthető lista, a beviteli képernyő standard beviteli mezőkből álljon össze. Egy ilyen alkalmazás leírását a <a href="http://developer.android.com">Developer portál </a>elég jól leírja a <a href="http://developer.android.com/guide/index.html">Guideokban </a>erre nem térek most ki. Ami szerintem egy kicsit elbonyolított, és nem épp lényegre törő rész ebben az útmutatóban az az <a href="http://developer.android.com/guide/topics/data/data-storage.html">adatok tárolása</a>, ezen belül is az Androidba beépített <a href="http://www.sqlite.org">SQLite</a> adatbázis kezelő <a href="http://developer.android.com/guide/topics/data/data-storage.html#db">leírása</a>. Ezt egy külön részben tovább boncolgatja a <a href="http://developer.android.com/resources/tutorials/notepad/index.html">Notepad tutorial</a>, de itt sajnos már belekeverik a <a href="http://developer.android.com/guide/topics/providers/content-providers.html">Content Provider</a>-eket is, így nem kapunk kellő instrukciót, hogyan is kellene használni az adatbázist.</p>
<p>A neten található leírások általában azt a módszert erőltetik, hogy a <a href="http://developer.android.com/reference/android/database/Cursor.html">Cursor</a> objektumon végig iterálva, vagy azt felhasználva a <a href="http://developer.android.com/reference/android/widget/ListView.html">ListView </a>objektumhoz a <a href="http://developer.android.com/reference/android/widget/SimpleCursorAdapter.html">SimpleCursorAdatpter</a> segítségével kezeljük mi az adatbázis kapcsolatot, a kurzort és az ezzel járó minden nyűgös dolgot. Ez nekem nem igazán tetszett, hiszen a Java világában már jópár éve létezik az <a href="http://en.wikipedia.org/wiki/Object-relational_mapping">ORM</a> technika, amit általában egy J2EE alkalmazásban a <a href="http://www.hibernate.org/">Hibernate</a>-el szoktunk használni (vagy <a href="http://java.sun.com/developer/technicalArticles/J2EE/jpa/">JPA</a> kinek mi tetszik). Így nincs szükség az adatbázis kapcsolat közvetlen kezelésér, kurzorok bezárogatására, adatbázis kivételek kezelésére. Bánatomra a Hibernate és a JPA nem tűnik jó megoldásnak Android alatt, mert a Hibernate nem kezeli megfelelően az SQLite-ot, és különben is miért lövünk ágyúval verébre?</p>
<p>Így arra gondoltam, ORM technikát nem felejtem el, de az itt felmerülő igényeknek megfelelően alakítom ki. Amit meghatároztam igényként:</p>
<ul>
<li>Lightweight megoldás, lehetőleg J2EE technológiák nélkül</li>
<li>Az alkalmazás felületének és üzelti logikájának elkülönítése az adatbázistól</li>
<li>Az adatbázis POJO objektumokon keresztül reprezentált</li>
</ul>
<p>Nem tűnik nagy feladatnak, mégis sokat segít majd később. Elsőként kitaláltam egy alkalmazást. Mindig is szerettem a helyzetmeghatározással foglalkozni, tároljunk hát térkép pontokat adatbázisban.</p>
<p>A tábla szerkezete:</p>
<ul>
<li>id</li>
<li>név</li>
<li>szélesség</li>
<li>hosszúság</li>
<li>magasság</li>
</ul>
<p>Az adatbázis műveletekhez létrehoztam egy <a href="http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html">SQLiteOpenHelper </a>osztályt a <a href="http://developer.android.com/guide/topics/data/data-storage.html#db">developer portálon megfogalmazottak</a> szerint:</p>
<pre class="brush: java">public class DatabaseHelper extends SQLiteOpenHelper {

private static final String TAG = "DatabaseHelper";
private static final String DATABASE_NAME = "mydatabase.db";
private static final int DATABASE_VERSION = 1;

public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table " + MapPoint.TABLE_NAME + " (" +
MapPoint._ID + " integer primary key," +
MapPoint.NAME + " text," +
MapPoint.LATITUDE + " real," +
MapPoint.LONGTITUDE + " real," +
MapPoint.ALTITUDE + " integer);");
}

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

Log.w(TAG, "Upgrading database from version " + oldVersion + " to "

+ newVersion + ", which will destroy all old data");

db.execSQL("DROP TABLE IF EXISTS mappoint");

onCreate(db);

}

}
</pre>
<p>Az osztályból látszik, hogy szükséges egy MapPoint nevű osztály. Az ORM-ben ez az osztály lesz a Model osztályom. Így néz ki:</p>
<pre class="brush: java">public class MapPoint implements BaseColumns {

 public static String NAME = "name";
 public static String LATITUDE = "latitude";
 public static String LONGTITUDE = "longtitude";
 public static String ALTITUDE = "altitude";

 public static String TABLE_NAME = "mappoint";

 public static final String DEFAULT_SORT_ORDER = "name";

 private Long _id;
 private String name;
 private Double latitude;
 private Double longtitude;
 private Integer altitude;

 public Long get_id() {
 return _id;
 }
 public void set_id(Long _id) {
 this._id = _id;
 }
 public String getName() {
 return name;
 }
 public void setName(String name) {
 this.name = name;
 }
 public Double getLatitude() {
 return latitude;
 }
 public void setLatitude(Double latitude) {
 this.latitude = latitude;
 }
 public Double getLongtitude() {
 return longtitude;
 }
 public void setLongtitude(Double longtitude) {
 this.longtitude = longtitude;
 }
 public Integer getAltitude() {
 return altitude;
 }
 public void setAltitude(Integer altitude) {
 this.altitude = altitude;
 }
}
</pre>
<p>A Model osztály az Adroidos <a href="http://developer.android.com/reference/android/provider/BaseColumns.html">BaseColumn</a>-ból származik, ami miatt egy _ID nevű mező van definiálva benne. Ez azért jó, mert ilyen mezője minden SQLite adatbázs táblának kell legyen, és így nem kell külön foglalkozni vele.<br />
 A Model osztályban nem biztos, hogy jó helyen vannak a statikus tulajdonságok, de egyelőre itt hagyom őket. Ezeket a Notepad tutorial a ContentProvider-be rakja, de nekünk ilyenünk nem lesz.</p>
<p>Végül a legfontosabb elem, a DAO osztály következik. Ez az osztály intézi el végül is az ORM-et, lekéri az adatbázisból a rekordokat, map-eli őket a Model osztályba, jelen esetben a MapPoint-be.</p>
<pre class="brush: java">public class MapPointDao {

 private DatabaseHelper databaseHelper;

 public MapPointDao(Context context) {
 this.databaseHelper = new DatabaseHelper(context);
 }

 public int deleteById(long id) {
 return -1;
 }

 public long insert(MapPoint mapPoint) {
 ContentValues values = new ContentValues();
 values.put(MapPoint.NAME, mapPoint.getName());
 values.put(MapPoint.LATITUDE, mapPoint.getLatitude());
 values.put(MapPoint.LONGTITUDE, mapPoint.getLongtitude());
 values.put(MapPoint.ALTITUDE, mapPoint.getAltitude());

 SQLiteDatabase db = databaseHelper.getWritableDatabase();        

 long rowId = db.insertOrThrow(MapPoint.TABLE_NAME, MapPoint.NAME, values);
 db.close();

 if (rowId &gt; 0) {
 return rowId;
 }

 throw new SQLException("Failed to insert row into ");
 }

 public List find(boolean distinct, String[]  columns,
 String  selection, String[]  selectionArgs, String  groupBy, String  having,
 String  orderBy, String  limit) {

 MapPoint mapP = new MapPoint();
 mapP.set_id(new Long(1));
 mapP.setAltitude(new Integer(2));
 mapP.setLongtitude(new Double(200));

 findByExample(mapP);

 if (TextUtils.isEmpty(orderBy)) {
 orderBy = MapPoint.DEFAULT_SORT_ORDER;
 }

 SQLiteDatabase db = databaseHelper.getReadableDatabase();
 Cursor c = db.query(distinct, MapPoint.TABLE_NAME, columns, selection, selectionArgs, groupBy, having,
 orderBy, limit);

 List list = new ArrayList();

 while (c.moveToNext()) {
 MapPoint mapPoint = new MapPoint();

 mapPoint.set_id(c.getLong(c.getColumnIndex(MapPoint._ID)));
 mapPoint.setName(c.getString(c.getColumnIndex(MapPoint.NAME)));
 mapPoint.setAltitude(c.getInt(c.getColumnIndex(MapPoint.ALTITUDE)));
 mapPoint.setLatitude(c.getDouble(c.getColumnIndex(MapPoint.LATITUDE)));
 mapPoint.setLongtitude(c.getDouble(c.getColumnIndex(MapPoint.LONGTITUDE)));

 list.add(mapPoint);
 }
 c.close();
 db.close(); 

 return list;
 }

 public List find(String  selection, String[]  selectionArgs) {
 return find(false,null,selection, selectionArgs, null, null, null, null);
 }

 public List findAll() {
 return find(null,null);
 }

 public int update(MapPoint mapPoint) {
 return -1;
 }

 public List&lt;Map&lt;String, String&gt;&gt; convertForAdapter(List&lt;MapPoint&gt; mapPointList) {
 List&lt;Map&lt;String, String&gt;&gt; list = new ArrayList&lt;Map&lt;String, String&gt;&gt;();
 for (int i=0; i&lt;mapPointList.size(); i++) {
 Map&lt;String, String&gt; map = new HashMap&lt;String, String&gt;();

 map.put(MapPoint._ID, String.valueOf(mapPointList.get(i).get_id()));
 map.put(MapPoint.NAME, mapPointList.get(i).getName());
 map.put(MapPoint.LATITUDE, String.valueOf(mapPointList.get(i).getLatitude()));
 map.put(MapPoint.LONGTITUDE, String.valueOf(mapPointList.get(i).getLongtitude()));
 map.put(MapPoint.ALTITUDE, String.valueOf(mapPointList.get(i).getAltitude()));
  list.add(map);
 }
 return list;
 }
}
</pre>
<p>A DAO osztály-t nem fejeztem be, csak a find() és insert() metódusokat programoztam le, a delete() és update() mindeninek házi feladat <img class="wp-smiley" src="http://codeplay.hu/wp-includes/images/smilies/icon_smile.gif" alt=":)" /> . Az igazság az, hogy már most rájöttem ez nem egészen lesz így jó, mert a DAO osztályt így minden adatbázis táblára létre kell hoznom, minden mezőt egyesével map-elni kell. Nem szeretem az ilyet.</p>
<p>A DAO minden lekérdező metódusa a Model osztályt, vagy az ebből generált lista objektumot adja vissza lekérdezésnél. A módosító metódusok általában azt adják vissza, mennyi rekord módosult, az insert() pedig az új rekord id-t.</p>
<p>Lényeges kiemelni a DAO osztály convertForAdapter() metódusát, ami a <a href="http://developer.android.com/reference/android/widget/SimpleAdapter.html">SimpleAdatpter </a>számára fog használható objektumstruktúrát előállítani. A find() által visszaadott List objektumból egy más struktúrájú listát állít elő, aminek az elemei már nem Model osztályok.</p>
<p>Végül lássuk, hogyan jelenik meg az Activity-ben a ListView. Az egész Activity-t nem másolom ide be, csak egyes részeit.</p>
<pre class="brush: java"> private ListView listMapPoints;

 private List mapPointList;
 private MapPointDao mapPointDao;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);

 this.listMapPoints = (ListView) findViewById(R.id.listMapPoints);

 mapPointDao = new MapPointDao(this);                

 refreshList();
 }

 private void refreshList() {
 mapPointList = mapPointDao.findAll();

 int[] i = { R.id.textName, R.id.textDesc };
 String[] s = { "name", "_id" };

 this.listMapPoints.setAdapter(
 new SimpleAdapter(this, mapPointDao.convertForAdapter(mapPointList),
 R.layout.pointlistitem,s,i));
 }
</pre>
<p>Először az onCreate()-ben kikeressük a ListView objektumot a layout fájlból, majd létrehozzuk a DAO-t. A refreshList() metódusban programoztam le az lista elemek lekérdezését, mert így a refresh esetleg máshonnan is meghívható. Például egy dialógus ablakot definiálhatunk, ami törölni tud lista elemeket, és a törlés után jó ha a lista frissül.</p>
<h3>Miért jó?</h3>
<ul>
<li>Szerintem elég lightweight lett, nem igényel külső lib-et</li>
<li>Az adatbázis kezelés a program egyetlen pontján van, nem kell az Activity-ben foglalkozni a kurzorral</li>
<li>POJO osztályok</li>
<li>Elkülönül az üzleti logika, a megjelenítés és a perzisztencia réteg (MVC)</li>
</ul>
<h3>Problémák</h3>
<p>Természetesen ezzel nem állítottam elő egy Hibernate funkcionalitású ORM-et. A fentebbi programban elférnének a következő kiegészítések:</p>
<ul>
<li>A DAO egyes metódusainak paraméterezése történhetne Model osztállyal, így szűrőket lehetne megadni. Például findByExample(Model model) vagy deleteByExample(Model model)</li>
<li>Jó lenne a DAO-t generikusra megírni, hogy ne kelljen mindig a mapeléseket megírni</li>
<li>A DatabaseHelper az adatbázis szkriptet betölthetné külső fájlból vagy resource-ból</li>
<li>A DAO-ban az adatbázis kapcsolatokat nem kellene mindig bezárni, egyszer kéne a konstruktorban létrehozni, és a nyitottat használni</li>
<li>Jó lenne megoldani a foreign key-ek kezelését a Model-ben és a DAO-ban, hogy ne kelljen többször bekérdezni, ha például egy lista több táblából épül fel.</li>
<li>Hibakezelés és logolás</li>
</ul>
<p>Tovább fogom fejleszteni kis alkalmazásomat, így a fentebbi problémákra megoldást fogok kidolgozni, amit hasonló módon publikálni fogok.</p>
]]></content:encoded>
			<wfw:commentRss>http://codeplay.hu/developer/2010/05/android-es-adatbazis/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Desire tapasztalatok</title>
		<link>http://codeplay.hu/mobil/2010/05/desire-tapasztalatok/</link>
		<comments>http://codeplay.hu/mobil/2010/05/desire-tapasztalatok/#comments</comments>
		<pubDate>Thu, 13 May 2010 22:50:00 +0000</pubDate>
		<dc:creator>kepes</dc:creator>
				<category><![CDATA[Mobil]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[htc]]></category>

		<guid isPermaLink="false">http://codeplay.hu/mobil/2010/05/desire-tapasztalatok/</guid>
		<description><![CDATA[Körülbelül egy hónapja pötyögök a tapifon-on, és úgy tűnik beigazolódnak első benyomásaim, egy igen jól használható készülékről van szó. Az elmúlt hónapban megváltoztak számítógép használati szokásaim, gyakorlatilag nem olvasok notebook-on híreket, és leveleimet is általában a telefonon nézem át. Az twitter-ről és facebbok-ról nem is beszélek, mert Deziré előtt nem nagyon használtam őket.Elsőként az Android [...]]]></description>
			<content:encoded><![CDATA[<p><br class="spacer_" /></p>
<p>Körülbelül egy hónapja pötyögök a tapifon-on, és úgy tűnik beigazolódnak első benyomásaim, egy igen jól használható készülékről van szó. Az elmúlt hónapban megváltoztak számítógép használati szokásaim, gyakorlatilag nem olvasok notebook-on híreket, és leveleimet is általában a telefonon nézem át. Az twitter-ről és facebbok-ról nem is beszélek, mert Deziré előtt nem nagyon használtam őket.<span id="more-25"></span>Elsőként az Android sokoldalúságát kell kiemelnem. Gyakorlatilag nem telefonról, hanem egy komplett Linux operációs rendszerrel ellátott számítógépről beszélünk. Már régebben is szimpatizáltam a Linux-al, nekem meglehetősen kézre álló oprendszer, és csodák csodája itt is megállja a helyét. (Bár az Android oldalon kiemelik, ez nem egy normál linux). Egyszerűen telepíthetek rá alkalmazásokat, akár párhuzamosan futtathatom őket, vagy ha éppen előtör a szunnyadó kockafej, kernelt is fordíthatok. Mindebből persze a tetszőlegesen telepíthető alkalmazások adják a dolog lényegét, amiből minden témakörben számtalan található a Market-ben. Két pöccintés, és fent is van bármi.</p>
<p><img class="alignright" src="http://www.htc.com/uploadedImages/WWW/Press_Room/Product_Photo_Gallery/HTC_Desire/Button_03.jpg" alt="HTC Desire" width="210" height="155" /></p>
<p>Alapvetően jók a hozzáadott HTC Sense szoftverek. A Friend Stream alkalmazás egy helyre gyűjti a social network alkalmazásokból az eseményeket, ami jó, mert egy helyen van minden, nem kell külön oldalon vagy appban keresni a twitteket és fácse bejegyzéseket. Egyedül a Newsreader-el gyűlt meg a bajom, ami elég sokáig frissít és ezzel foglalja a CPU-t, mert túl sok hírfolyamot követek. Ez a frissítési probléma néha előjön a Favorites ablakban is, ahonnan egy tapival hívhatók a telefonszámok, és a facebook-ról letöltött képek mellett az app megjeleníti a “kedvenceim” friss leveleinek és hozzászólásainak számát is.</p>
<p>Álljon itt most néhány általam jól használhatónak gondolt alkalmazás.</p>
<ul>
<li>Nem részletezem a twitter alkalmazások között dúló háborút, nálam a Twitdroid nyert, mert képes egy oldalon hozni az összes accountom twittjeit (4$- ért). A többi hasonló tudású, a hivatalos twitter app is jó.</li>
<li>Nálam nyerő szoftver az Easy Money, ahol nyomon követhetem pénztárcám alakulását. Mindig is szerettem volna tudni, hova költöm el a pénzem. Valóra vált az álmom, bár nem örülök az eredménynek <img src="http://codeplay.hu/wp-includes/images/smilies/icon_smile.gif" alt=":)" /></li>
<li>Skype az alap, hogy legyen kéznél. Mivel hivatalos skype app még nem fut a dezirén, a fring kézenfekvő megoldásnak bizonyult. Kezeli a skype accountomat, beolvassa ismerőseimet, gyekorlatilag mindent tud amit a skype. A hangminősége kicsit rosszabb mint az eredeti skype-nak, de ez betudható annak, hogy nem egy hivatalos fejlesztés.</li>
<li>A last.fm-re múlt évben kattantam rá, természetesen kijött az androidos verzió is. Semmi csicsa, jól használható zenelejátszó. Kicsit zavar, hogy a scrobler funkció nincs rajta, de szerintem idővel megoldódik a dolog.</li>
<li>Számos google alkalmazás tölthető le természetesen, így nem hiányozhat a telefonomról a maps.</li>
<li>Mivel a 3g szolgáltatás nem korlátlan, érdemes figyelni hol járunk a letöltött adatmennyiségben. A nettrafic statisztikát készít, és figyelmeztet ha közel a vég.</li>
<li>Számomra új szolgáltatás a magyar érdekeltségű ustream. Az androidos app szuperül működik, még 3g-n keresztül is elfogadható live stream-et képes küldeni a webre.</li>
<li>Néha az uninstall funkció nem működik, mindenféle hibát dobál. Szerencsére létezik a quickuninstaller nevű app, ami felolja a problémát.</li>
</ul>
<p>A telefon nagy erőssége, hogy az alkalmazások nagyon szépen, simán futnak rajta. Nem vehető észre semmilyen akadás a futás közben, a képernyő átmenetek szépen “úsznak”. Tetszőleges mértű, akár HD videó is lejátszható rajta. Ami külön szépség, hogy a kijelző tökéletes képminőséget produkál mindehhez. Egyáltalán nem látszanak a pixelek.</p>
<h3>Negatívumok</h3>
<p>Mint mindennek, a Desire-nek is megvannak a maga negatívumai, gyerekbetegségei. Ezek nyilván az idővel javítva lesznek, de jelenleg a sok újítás és úttörő megoldás miatt számos funkción van még mit finomítani.</p>
<p>Legbosszantóbb talán a  már sok más fórumon említett akkumulátor para. Mivel a telefon egy erős processzort tartalmaz, egy hatalmas kijelzővel, előfordul, hogy naponta egy töltés nem elég szegénynek. Főleg, ha elmegyek kirándulni valamerre, közben nézem a térképet, fotózgatok, és olvasom a wikipédián a helyi nevezetességeket. Nem értem, hogy manapság, amikor a tölthető elemek már 2800 mAh kapacitásúak, egy ilyen felső kategóriás termékbe miért egy 1400mAh-s aksi figyel. Természetesen nem értek az akkumulátorokhoz, és gondolom valami olyasmiről lehet szó, hogy a lítiumos aksikban ez nem annyira egyszerű, de az is lehet, hogy valamiféle spórolásról van szó. A telefont szétkapva, szerintem elfért volna egy 50%-al hosszabb aksi.</p>
<p>Szerencsére a Market-ben vannak alkalmazások, amik a töltések közti idő meghosszabbítására alkalmasak. Mindegyik hasonló elven működik, megpróbálják észrevehetetlenül kikapcsolni a telefon egyes funkcióit, wi-fit, gps-t, vagy állítani a kijelző fényerejét. A legjobb ötlet, a lokalizált beállításokra alapuló energiagazdálkodás. Például beállíthatóm, hogy a GPS-re nincs szükségem Budapesten belül, vagy a lakhelyemet elhagyva a wi-fi legyen kikapcsolva. Ezeket a funkciókat a Locale nevű alkalmazással próbáltam először, ami fizetős lett, másrészt belerondított a telefon egyes funkcióiba. És itt jön a következő gond:</p>
<p>Egyes alkalmazások képesek a telefon alap funkcióit tönkrevágni. A Locale például elérte, hogy a telefont nem lehetett kikapcsolni, valamint az alapértelmezett uninstall program sem indult el. Ez kicsit bosszantott. Uninstall programból persze van a Marketben bőven, de ne má’, hogy telepítenem kell egy pogit, mert egy másik az eredetit összekavarta.</p>
<p>Bosszantó még, hogy egyes HTC Sense alkalmazások túlterhelik a procit, és így a Desire mintha lefagyna egy pár másodpercre. Ilyen a HTC Sense-es hírolvasó, amíg frissít, valamint a Friend Stream szintén frissítés közben. Nem gondolom, hogy ennek így kell lennie, ez programozói hiba, javítani kell. Mi lehet egy gyengébb készülék esetében? Remélem az Android 2.2 sebességnövelésével ezek a problémák megoldódnak.</p>
<p>A Marketen is lehetne mit finomítani. Az Android egyik lényeges elemét adó felületet nem sikerült valami jól összerakni. A több ezer alkalmazás között igen nehéz keresni, hacsak nem ismerjük annak nevét. Tematizálva vagy tag-elve nemigen van a Market tartalma. Annyit sikerült kihozniuk magukból a Market applikáció fejlesztőinek, hogy a keresési lehetőség mellett van két fő kategória, Games valamint Apps, az Apps alatt 18,a games alatt 4 alkategória. Aztán ha ebbe belelép az ember akkor megkapja ömlesztve a négyezer kártyajátékot, vagy a háromezer multimédia alkalmazást. Ja, lehet rendezni még “Top Free” és “Just in”-el. Köszi!</p>
<p>Nagy szívfájdalmam, hogy nem találtam még megfelelő tokot hozzá, ami megvédené, ha leejtem, vagy ráteszek valamit. Ezt outdoor sportolás közben szívesen használnám, most meg csak vigyázok rá, mint egy hímes tojásra.</p>
<h3>Végül</h3>
<p>A pár negatívum ellenére az első hónap után nyugodt szívvel ajánlom nem csak geekeknek, hanem bárkinek aki el tudja képzelni magáról, hogy megváltoznak eddigi netezési szokásai egy új, telefonnak nem épp nevezhető készüléktől. Nyilvánvaló, hogy az elkövetkezendő hónapokban a konkurens gyártók hasonló termékekkel fognak elkápráztatni minket, vagy akár a HTC is, hogy a Google IO-n szétosztott<a href="http://now.sprint.com/evo/"> EVO-ról </a>ne is beszéljünk, én mégis úgy gondolom, nem fogom megbánni a Dezirét.</p>
<h3>Update</h3>
<p>Mindenképp javaslom az izgő-mozgó háttér animáció kikapcsolását. Csodákat művel az aksival!</p>
<h3>Update2</h3>
<p>A JuiceDefender rettentő sokat segít, valószínűleg a WiFi és 3G ki-be kapcsolgatásával. Tegnap több mint 28 órát használtam Dezirét normál üzemben (net, levelek, twitter, fácse és telefon)</p>
]]></content:encoded>
			<wfw:commentRss>http://codeplay.hu/mobil/2010/05/desire-tapasztalatok/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Az első okos három nap után</title>
		<link>http://codeplay.hu/mobil/2010/04/az-elso-okos-harom-nap-utan/</link>
		<comments>http://codeplay.hu/mobil/2010/04/az-elso-okos-harom-nap-utan/#comments</comments>
		<pubDate>Mon, 12 Apr 2010 22:44:42 +0000</pubDate>
		<dc:creator>kepes</dc:creator>
				<category><![CDATA[Mobil]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[htc]]></category>

		<guid isPermaLink="false">http://codeplay.hu/?p=19</guid>
		<description><![CDATA[Három napja használom új és egyben első tapi telefonomat a HTC Desire-t. Az ilyen jellegű készülékek piacán jelenleg ez a legújabb, nem feltétlenül a legjobb készülék, bár egyelőre úgy tűnik sokmindenben legalább annyira jó ha nem jobb mint a konkurens iPhone. A megvásárlás eredeti indoka az Androidos fejlesztés volt, és elég keményen kellett magamnak magyarázni, hogy [...]]]></description>
			<content:encoded><![CDATA[<p><br class="spacer_" /></p>
<p>Három napja használom új és egyben első tapi telefonomat a<a href="http://www.htc.com/www/product/desire/overview.html"> HTC Desire</a>-t. Az ilyen jellegű készülékek piacán jelenleg ez a legújabb, nem feltétlenül a legjobb készülék, bár egyelőre úgy tűnik sokmindenben legalább annyira jó ha nem jobb mint a konkurens <a href="http://www.apple.com/hu/iphone/">iPhone</a>. A megvásárlás eredeti indoka az Androidos fejlesztés volt, és elég keményen kellett magamnak magyarázni, hogy miért is vásárolok meg egy ilyen top kategóriás készüléket. Még a bolt előtt is át kellett gondolnom a dolgot, de aztán pénz ment, készülék jött.</p>
<p><span id="more-19"></span></p>
<p><img class="alignleft" src="http://www.htc.com/uploadedImages/Common/Shared_Image/Icons/HTC_Desire_Make_It_Mine.jpg" alt="HTC Desire" width="219" height="205" />Első benyomásom, hogy annak ellenére mennyire csilli-villi a felület, igen gyors. Eddigi tapasztalataim szerint (az iPhone-t leszámítva) a tapi telefonok felülete lassúcska, helyenként használhatatlan volt. A Desire teljesen megfelelően reagál, a képernyők folyamatosan, pillanatok alatt úsznak át egymásba. Az igen egyszerű setup után rögtön kipróbáltam az összes social alkalmazást, így teljesen online lettem. A fácse és a csipogó a felhasználó megadása után azonnal indult. A telefon HTC Sense felületéhez kapott alkalmazások gond nélkül működnek, és szépek. A telefonszámokhoz és nevekhez a HTC Sense automatikusan hozzárendeli a facebook profilt, tehát ha név vagy telefonszám azonosságot talál contact list-ben és ismerőseim facebook profiljában, letölti a contact list-be ismerősöm képét, és minden olyan adatát amit megadott magáról a közösségi portálon. A telefonon van még Flickr és Picasa kapcsolódási lehetőség is, valamint google account-al azonnal elérhető az Android  Market.</p>
<p>A telefonról már sokan írták mennyire jó a fogása, jó képeket és videókat rögzít, és elég jól megvalósított a billentyűzet alkalmazása is, így ezt most kihagyom. Ami engem igazán érdekelt az az <a href="http://www.android.com/">Android </a>operációs rendszer, a Java alapú fejlesztés, valamint a Market. A fejlesztésről később írok, a Market-et kipróbálva elsőre lenyűgöző választék volt. Látszik, hogy nehéz lesz újat kitalálni. Minden feladatra alkalmazások sokaságát hozza a kereső, pillanatok alatt települ az alkalmazás, és a széles körben használtak hiba nélkül indulnak is. Rossz tapasztalatom csak egy-két kis letöltésszámú béta, vagy nullás verziószámú appal volt, így ezt nem is sorolom a negatívumok közé. Találtam 3d-s szimulátort, twitter kliens, googles alkalmazást ami kép alapján keres, és financiális ügyeimet nyomon követő programot.</p>
<p>Első igazi negatív élményem a fizetős alkalmazásoknál jelentkezett, amikor a <a href="http://twidroid.com/">Twidroid</a>-ot szerettem volna megvásárolni kemény 4$-os áron, mert az kezeli, ha több twitter accountom van. A Market keresője nem hozta fel a fizetős appokat. Kis keresgélés után rájöttem, országunkban nem lehetséges a vásárlás, ami felettébb bosszantó, hiszen pár dollárért olyan kész alkalmazásokat kaphatunk, amik jóval többet szolgáltatnak ingyenes társaiknál. A Twidroid szerencsére megoldja máshogy a dolgot, és ha jól tudom elvileg nem csak a Marketből letölthető szoftverek telepíthetők az Androidra.</p>
<p>Három nap után nem bántam meg a dolgot, szuper online lettem, híreket olvasok rajta, netezek. Ja, és telefonálni is lehet vele.</p>
]]></content:encoded>
			<wfw:commentRss>http://codeplay.hu/mobil/2010/04/az-elso-okos-harom-nap-utan/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

