<?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>More Than Technical &#187; Mobile phones</title>
	<atom:link href="http://www.morethantechnical.com/category/mobile-phones/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.morethantechnical.com</link>
	<description>On software, code, the internet and more.</description>
	<lastBuildDate>Mon, 06 Feb 2012 23:48:17 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com"/><atom:link rel="hub" href="http://superfeedr.com/hubbub"/>		<item>
		<title>Android Market&#8217;s apps compatibility problem [w/ solution]</title>
		<link>http://www.morethantechnical.com/2011/11/03/android-markets-apps-compatibility-problem-with-solutio/</link>
		<comments>http://www.morethantechnical.com/2011/11/03/android-markets-apps-compatibility-problem-with-solutio/#comments</comments>
		<pubDate>Thu, 03 Nov 2011 18:42:49 +0000</pubDate>
		<dc:creator>Arnon</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Solutions]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[compatibility]]></category>
		<category><![CDATA[compatible]]></category>
		<category><![CDATA[fix]]></category>
		<category><![CDATA[item]]></category>
		<category><![CDATA[market]]></category>
		<category><![CDATA[This item is not compatible with your device]]></category>
		<category><![CDATA[your device is not compatible with this item]]></category>

		<guid isPermaLink="false">http://www.morethantechnical.com/?p=973</guid>
		<description><![CDATA[WOW That was annoying! From the moment I started using a custom ROM on my Samsung Galaxy S2 (Cognition S2, to be exact), I started having issues with some apps. Sometimes they won&#8217;t appear in search results, other times it will just say it&#8217;s not compatible. It drove me nuts! Naturally I started with the [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.morethantechnical.com/wp-content/uploads/2011/11/110311_1837_HowIsolvedt1.png" alt="" align="left" /></p>
<p><span style="font-size: 12pt;">WOW That was annoying! From the moment I started using a custom ROM on my Samsung Galaxy S2 (<a href="http://forum.xda-developers.com/showthread.php?t=1124396">Cognition S2</a>, to be exact), I started having issues with some apps.<br />
</span></p>
<p><span style="font-size: 12pt;">Sometimes they won&#8217;t appear in search results, other times it will just say it&#8217;s not compatible. It drove me nuts!<br />
</span></p>
<p><span style="font-size: 12pt;">Naturally I started with the forums – All the solutions there were about <a href="http://myraroldan.com/wp/2011/09/your-device-is-not-compatible-with-this-item-annoying-android-market-message/">LCD DPI change</a>. Funny, I never thought of that, but it did make sense. The only problem was that I never touched my DPI settings (Heck, I didn&#8217;t know I could).<br />
</span></p>
<p><span style="font-size: 12pt;">(On a side note – tampering with the density is pretty cool… if you want to try it, you can download apps from the Market like LCD Density)<br />
</span></p>
<p><span style="font-size: 12pt;">Back to my problem…<br />
<span id="more-973"></span><br />
</span></p>
<p><span style="font-size: 12pt;">At that point, I knew for sure it was a ROM issue. My friend, who bought the same phone in Thailand, was able to install all the &#8216;problematic&#8217; apps, up until the point that I installed the same ROM on his machine. So, when in doubt – Check what the guys at the awesome <a href="http://www.cyanogenmod.com">CyanogenMod</a> ROM did!<br />
</span></p>
<p><span style="font-size: 12pt;">My experience showed me that a lot can happen by changing <strong>build.prop</strong> file (Guys.. Do it only if you have to! I am not responsible for any damage and ALWAYS BACKUP!).<br />
</span></p>
<p><span style="font-size: 12pt;">Ok now that I got that out of my system, I pulled CyanogenMod&#8217;s build.prop file, and compared it to my device&#8217;s build.prop.<br />
</span></p>
<p><span style="font-size: 12pt;">My hunch told me that it was the fingerprint section. It just made sense that if the device is sending an incorrect fingerprint to the Market, it will think some apps are not incompatible.<br />
</span></p>
<p><span style="font-size: 12pt;">So… My hunch was right!<br />
</span></p>
<p><span style="font-size: 12pt;">The <strong>original build.prop</strong> had those lines in:<br />
</span></p>
<pre class="brush: plain; title: ; notranslate"> ro.build.description=GT-I9100-user 2.3.4 GINGERBREAD XXKH3 release-keys
ro.build.fingerprint=samsung/GT-I9100/GT-I9100:2.3.4/GINGERBREAD/XXKH3:user/release-keys
</pre>
<p><span style="font-size: 12pt;">The changed buildprop had this data instead:</span></p>
<pre class="brush: plain; title: ; notranslate">
ro.build.description=GT-I9100-user 2.3.4 GINGERBREAD XXKG2 release-keys
ro.build.fingerprint=samsung/GT-I9100/GT-I9100:2.3.4/GINGERBREAD/XXKG2:user/release-keys
</pre>
<p><span style="font-size: 12pt;">I really don&#8217;t know what causes the original data to be invalid to some apps, but it did! It appears XXKH3 is for some reason incompatible… It might be a bug on Google&#8217;s side, or there is some logic I don&#8217;t understand (feel free to enlighten me in the comments)</span></p>
<p><span style="font-size: 12pt;">Keep in mind, that you need to compare the lines between two ROMs which are made for YOUR device. In this case it is the GT-I9100. Just download the right ROM from CyanogenMod, and see inside the zip, under &#8220;system&#8221; folder you can get the build.prop file. Then, compare it to the file you got from your own ROM </span></p>
<p><span style="font-size: 12pt;">So, to make a long story short… If you want to do like me you should do the following:<br />
</span></p>
<ol>
<li><span style="font-size: 12pt;">Pull out /system/build.prop file from your device <strong>AND BACK IT UP</strong><br />
</span></li>
<li><span style="font-size: 12pt;">Change the fingerprint attributes<br />
</span></li>
<li><span style="font-size: 12pt;">Remount your system as writable<br />
</span></li>
<li><span style="font-size: 12pt;">Push the modified build.prop back in your device<br />
</span></li>
<li><span style="font-size: 12pt;">Reboot<br />
</span></li>
</ol>
<p><span style="font-size: 12pt;">I hope this post is helpful to some of you!<br />
</span></p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.morethantechnical.com%2F2011%2F11%2F03%2Fandroid-markets-apps-compatibility-problem-with-solutio%2F&amp;title=Android%20Market%26%238217%3Bs%20apps%20compatibility%20problem%20%5Bw%2F%20solution%5D" id="wpa2a_2"><img src="http://www.morethantechnical.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.morethantechnical.com/2011/11/03/android-markets-apps-compatibility-problem-with-solutio/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android frame animation revisited [w/ code]</title>
		<link>http://www.morethantechnical.com/2011/10/17/android-frame-animation-revisited-w-code/</link>
		<comments>http://www.morethantechnical.com/2011/10/17/android-frame-animation-revisited-w-code/#comments</comments>
		<pubDate>Mon, 17 Oct 2011 15:06:54 +0000</pubDate>
		<dc:creator>Roy</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[graphics]]></category>
		<category><![CDATA[gui]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Mobile phones]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[animation]]></category>
		<category><![CDATA[frame]]></category>

		<guid isPermaLink="false">http://www.morethantechnical.com/?p=946</guid>
		<description><![CDATA[So, been working hard on my projects, and discovered some interesting things in Android possibilities for frame animation. Last time I was using an HTML approach, because of memory consumption issues with using ImageViews. However now my approach is using View.onDraw(Canvas) to draw BMPs straight off files, in an asynchronous way, and it seems to [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.morethantechnical.com/wp-content/uploads/2011/10/android_will_allow2.png" rel="lightbox[946]"><img src="http://www.morethantechnical.com/wp-content/uploads/2011/10/android_will_allow2-300x279.png" alt="" title="android_will_allow" width="300" height="279" class="alignleft size-medium wp-image-954" /></a>So, been working hard on my projects, and discovered some interesting things in Android possibilities for frame animation. Last time I was using an <a href="http://www.morethantechnical.com/2011/03/01/the-woes-of-frame-animation-on-android-w-code/">HTML approach</a>, because of memory consumption issues with using ImageViews. However now my approach is using View.onDraw(Canvas) to draw BMPs straight off files, in an asynchronous way, and it seems to work pretty good.<br />
Let me tell you how I did it<br />
<span id="more-946"></span><br />
The general idea was explained in the preface, and the technicality is as follows. I plainly subclass View, and override onDraw(Canvas):</p>
<pre class="brush: plain; title: ; notranslate">
public class MyCanvasView extends View {
...
private Bitmap bmp;
private Lock bmpLock;
private Animator a;
private float scale = 1.0f;
private Rect clip;

@Override
protected void onDraw(Canvas canvas) {
   super.onDraw(canvas);
   ...
   clip = canvas.getClipBounds();
   w = clip.width();
   w2 = w/2.0f;
   h = clip.height();
   h2 = h/2.0f;

   bmpLock.lock();
   float left = scale*(w2 - (float)bmp.getWidth()/2.0f);
   float top = scale*(h2 - (float)bmp.getHeight()/2.0f);

   Bitmap _bmp = bmp;
   canvas.drawBitmap(_bmp, left, top, paint);
   bmpLock.unlock();
   ...
}
}
</pre>
<p>To drive the animation I privately subclass a Thread, that will push out new Bitmap objects (or at least write into the data of the private Bitmap object).</p>
<pre class="brush: plain; title: ; notranslate">
private class Animator extends Thread {
   private final MyCanvasView myCanvasView;
   private AssetManager assets;
   private int start = 0;
   private int end = 10;
   private boolean loop = false;

   public Animator(MyCanvasView myCanvasView)
   {
      this.myCanvasView = myCanvasView;
      assets = myCanvasView.getContext().getAssets();
   }

   @Override
   public void run() {
   super.run();

   try {
      do {
         for (int i = start; i &lt;= end; i++) {
            boolean bitmapLoaded;
            bitmapLoaded = tryLoadBitmap(&quot;anim&quot; + new DecimalFormat(&quot;0000&quot;).format(i) + &quot;.png&quot;);
            if(!bitmapLoaded) { break; }
         }
      } while(loop);
   } catch (InterruptedException e) {
      e.printStackTrace();
   }
   }

   private boolean tryLoadBitmap(String bmpFilename) throws InterruptedException {
      try {
         bmpLock.lock();
         bmp = BitmapFactory.decodeStream(assets.open(bmpFilename));
         bmpLock.unlock();
         if(bmp == null) {
            AlertDialog a = new AlertDialog.Builder(getContext()).create();
            a.setMessage(&quot;Cannot load image&quot;);
            a.show();
            return false;
         }
         myCanvasView.postInvalidate();
         sleep(25);
      } catch (IOException e) {
         e.printStackTrace();
      }
      return true;
   }
}
</pre>
<p>Notice the usage of the Lock bmpLock object to prevent racing conditions on the drawing and loading of new Bitmaps.<br />
Also, you should probably want a mechanism to determine <code>start</code>, <code>end</code> and <code>loop</code> parameters. In the complete source you can see what I have done to address that.</p>
<p>Finally, a way to fire an animation on MyCanvasView:</p>
<pre class="brush: plain; title: ; notranslate">
public void fireAnimation() {
   if(a != null &amp;&amp; a.isAlive()) {
      a.interrupt();
      a = null;
   }
   a = new Animator(this);
   a.start(); //TODO: reuse the object
}
</pre>
<p>This runs in excellent frame rates, and it&#8217;s not even fully optimized. So I guess the approach is correct for the Android environment. I did not, however, test this with many animators on the same layout.</p>
<p>Grab the complete source (including some stuff I didn&#8217;t discuss here like rotating and scaling the &#8220;Sprite&#8221;):<br />
<code></p>
<p>https://raw.github.com/royshil/HeadFollower/master/src/edu/mit/media/fluid/royshil/graphics/MyCanvasView.java</p>
<p></code></p>
<p>This is part of the <a href="https://github.com/royshil/HeadFollower">PoCoMo</a> project I have been working on in our lab.</p>
<p>Enjoy!<br />
Roy.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.morethantechnical.com%2F2011%2F10%2F17%2Fandroid-frame-animation-revisited-w-code%2F&amp;title=Android%20frame%20animation%20revisited%20%5Bw%2F%20code%5D" id="wpa2a_4"><img src="http://www.morethantechnical.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.morethantechnical.com/2011/10/17/android-frame-animation-revisited-w-code/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Number Saver gets a new look</title>
		<link>http://www.morethantechnical.com/2011/06/14/number-saver-gets-a-new-look/</link>
		<comments>http://www.morethantechnical.com/2011/06/14/number-saver-gets-a-new-look/#comments</comments>
		<pubDate>Tue, 14 Jun 2011 06:06:37 +0000</pubDate>
		<dc:creator>Arnon</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Mobile phones]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[cork board]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[number saaver]]></category>
		<category><![CDATA[ui]]></category>

		<guid isPermaLink="false">http://www.morethantechnical.com/?p=885</guid>
		<description><![CDATA[Number Saver (Android App) gets a new look]]></description>
			<content:encoded><![CDATA[<p><a href="https://market.android.com/details?id=com.arnonse.savenum">Number Saver</a> has been around for a while, but when I got around to it, it was always <a href="http://www.morethantechnical.com/wp-content/uploads/2011/06/web_hi_res_512.png" rel="lightbox[885]"><img class="alignleft size-medium wp-image-898" title="Number Save" src="http://www.morethantechnical.com/wp-content/uploads/2011/06/web_hi_res_512-300x300.png" alt="Number Saver App Icon" width="88" height="88" /></a>about the features. I felt the time is right to polish (even a bit) my Android UI skills and try and make it.<span id="more-885"></span></p>
<p>A lot of design ideas later, few tips from designer friends, and my rusty Photoshop skills, eventually came up with this design:</p>
<p><img class="alignright" src="http://www.morethantechnical.com/wp-content/uploads/2011/06/061411_0606_NumberSaver2.png" alt="" width="181" height="302" align="left" />For those of you who are not familiar with this app – its goal is to solve a very annoying missing functionality in Android phones; functionality that existed on each and every &#8220;pre-smartphone&#8221; models.</p>
<p>This app will let you easily take a note of number or text string while you&#8217;re in a call. Assuming the number or note is given to you by the other call party.</p>
<p>Such assumption is supported by the feature to automatically start the phone&#8217;s speakerphone while the app is opened so you can hear the other party while typing the number.</p>
<p>Later on you can return to the app, and the number will appear for you to dial, add a contact, or send SMS.</p>
<p>The app saves the number either in the phone&#8217;s clipboard so you can later &#8220;paste&#8221; the number wherever you want, or in its internal memory</p>
<p>Surprisingly &#8211; I got a comment from someone who said she prefers the old look. So now there&#8217;s also an option to start the app with the old look.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.morethantechnical.com/2011/06/14/number-saver-gets-a-new-look/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Some things I learned about Android&#8217;s Frame animation</title>
		<link>http://www.morethantechnical.com/2011/02/07/some-things-i-learned-about-androids-frame-animation/</link>
		<comments>http://www.morethantechnical.com/2011/02/07/some-things-i-learned-about-androids-frame-animation/#comments</comments>
		<pubDate>Mon, 07 Feb 2011 07:09:21 +0000</pubDate>
		<dc:creator>Roy</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[graphics]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[Mobile phones]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[Solutions]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[animation]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[mogrify]]></category>

		<guid isPermaLink="false">http://www.morethantechnical.com/?p=804</guid>
		<description><![CDATA[Hi Just a quick share of lessons learned about Android&#8217;s Frame-by-Frame animations. Some of the functionality is poorly documented, as many people point out, so the web is the only place for answers. Having looked for some answers to these questions and couldn&#8217;t find any &#8211; here&#8217;s what I found out myself. Update [2/3/11]: A [...]]]></description>
			<content:encoded><![CDATA[<p>Hi</p>
<p>Just a quick share of lessons learned about Android&#8217;s Frame-by-Frame animations. Some of the functionality is poorly documented, as many people point out, so the web is the only place for answers. Having looked for some answers to these questions and couldn&#8217;t find any &#8211; here&#8217;s what I found out myself.</p>
<p>Update [2/3/11]: A <a href="http://www.morethantechnical.com/2011/03/01/the-woes-of-frame-animation-on-android-w-code/">new post</a> on this topic gives a more broad view of my experience.<br />
<span id="more-804"></span></p>
<h2>Resetting Frame Animation</h2>
<p>The API is a bit weird here, because the restart function is inside the setVisible function of AnimationDrawable. If you don&#8217;t restart and just do another <code>start()</code> on an already finished animation &#8211; it will just jump to the last frame. You must reset the animation before starting it.</p>
<p>However if you do <code>setVisible(true,true)</code> your animation will run twice!, so you must do <code>setVisible(false,true);</code>. This will reset the animation for a <code>start()</code> operation.</p>
<h2>Preloading Animations</h2>
<p>I got to preloading animations after understating that trying to fire an animation &#8220;right off the XML&#8221;, has a lag of over a second. This must be due to the inflation process. And I was looking for snappy smooth animations right away, without waiting for them to inflate, so naturally I needed to preload them. But how?</p>
<p>So I loaded the frame animation into an ImageView with <code>android:visibility="gone"</code>, and &#8220;hijacked&#8221; its drawable when I needed to fire it:</p>
<p>The XML, just put it somewhere in your main xml so it will be inflated when the app starts.</p>
<pre class="brush: plain; title: ; notranslate">
&lt;!-- Preload animations --&gt;
&lt;ImageView android:id=&quot;@+id/anim_preloaded_imgview&quot;
	android:layout_width=&quot;wrap_content&quot;
	android:layout_height=&quot;wrap_content&quot;
	android:src=&quot;@drawable/myanim&quot;
	android:visibility=&quot;gone&quot; /&gt;
</pre>
<p>The Java:</p>
<pre class="brush: plain; title: ; notranslate">
ImageView animateHere = (ImageView) findViewById(R.id.animate_here);
animateHere.setImageDrawable(((ImageView)findViewById(R.id.anim_preloaded_imgview).getDrawable());
AnimationDrawable anim = (AnimationDrawable) animateHere.getDrawable();
anim.setVisible(false, true); //reset! see previous section
anim.start(); //now good to start, even if already fired before
</pre>
<p>Voila.</p>
<h2>OutOfMemory expection? srsly?</h2>
<p>So at the beginning I was getting a lot of OutOfMemory exceptions on the loading of the animations. Probably due to loading many big bitmaps into the memory. So I reduced the size of my PNGs to ~80,000 pixels (images are ~200&#215;400), and then I was able to load as many as I wanted! Strange&#8230;<br />
I didn&#8217;t really research what&#8217;s the limit, but using ~140,000 pixels did not fly.</p>
<p>In these cases <code>mogrify</code> is your friend. This will resize all images beginning with &#8220;myanim&#8221; to 200xWhatever keeping aspect ratio:</p>
<pre class="brush: plain; title: ; notranslate">
mogrify -resize 200 myanim*
</pre>
<p>That&#8217;s it for now<br />
But tomorrow I will learn more. Android is surprising..</p>
<p>Please comment if you [dis]agree, and share your own experience!<br />
Roy.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.morethantechnical.com%2F2011%2F02%2F07%2Fsome-things-i-learned-about-androids-frame-animation%2F&amp;title=Some%20things%20I%20learned%20about%20Android%26%238217%3Bs%20Frame%20animation" id="wpa2a_6"><img src="http://www.morethantechnical.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.morethantechnical.com/2011/02/07/some-things-i-learned-about-androids-frame-animation/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Reading contacts in Android 2.0+</title>
		<link>http://www.morethantechnical.com/2010/11/28/reading-contacts-in-android-2-0/</link>
		<comments>http://www.morethantechnical.com/2010/11/28/reading-contacts-in-android-2-0/#comments</comments>
		<pubDate>Sun, 28 Nov 2010 08:32:36 +0000</pubDate>
		<dc:creator>Arnon</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Mobile phones]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[contacts]]></category>
		<category><![CDATA[ContactsContract]]></category>
		<category><![CDATA[SDK 5]]></category>

		<guid isPermaLink="false">http://www.morethantechnical.com/?p=771</guid>
		<description><![CDATA[On one of my Android apps, I added a trivial option to select a contact from the phone&#8217;s contact list. This was working fine until SDK version 5, which changed the way the contacts are represented in the phone&#8217;s SQLite database. It is using the &#8220;newer&#8221; class called ContactsContract instead of the deprecated People class [...]]]></description>
			<content:encoded><![CDATA[<p><span style="font-family: Arial;">On one of my Android apps, I added a trivial option to select a contact from the phone&#8217;s contact list. This was working fine until SDK version 5, which changed the way the contacts are represented in the phone&#8217;s SQLite database. It is using the &#8220;newer&#8221; class called <strong>ContactsContract</strong> instead of the deprecated <strong>People</strong> class<br />
</span></p>
<p><span style="font-family: Arial;">I have spent quite time in order to figure out which was the best way that will fit my needs. If you are in the same position, feel free to use the code below<br />
</span></p>
<p><span style="font-family: Arial;">My example below is will display a two row list of all the contacts, with alphabetical indexing. It is a mixture of code snippets I have found on the net, while may not be optimized; it will definitely give you the hang of things.</span></p>
<p><span style="font-family: Arial;"><span id="more-771"></span></span></p>
<p>If you are only interested in the contact reading procedure, skip to the method named <strong>fillContactsList</strong> below, on ContactListDemo.java line nr. 28. This method demonstrates how contacts are accessed.</p>
<p>The rest of the projects also provides:</p>
<ol>
<li>Reading of all contacts and phone numbers with SDK5+ compliancy</li>
<li>Displaying it in Two Row List Item</li>
<li>Automatically created alphabetical Indexing with FastScrolling</li>
</ol>
<p><span style="font-family: Arial;">This app must have <strong>android.permission.READ_CONTACTS </strong>in the AndroidManifest.xml<br />
</span></p>
<p><span style="font-family: Arial;">Here we go:<br />
</span></p>
<p>First, the data type Contact which will be used to store Name and Number:</p>
<p><strong>Contact.java</strong></p>
<pre class="brush: java; title: ; notranslate">
public class Contact implements Comparable{

	private String Name;
 	private String number;

	public String getName() {
		return Name;
	}

	public void setName(String Name) {
		this.Name = Name;
	}

	public String getNumber() {
		return number;
	}

	public void setNumber(String number) {
		this.number = number;
	}

	public int compareTo(Object arg0) {
		Contact newCont = (Contact)arg0;
		return this.Name.compareTo(newCont.getName());
	}

}
</pre>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp; mso-ascii-theme-font: minor-bidi; mso-hansi-theme-font: minor-bidi; mso-bidi-font-family: Arial; mso-bidi-theme-font: minor-bidi;"><br />
</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp; mso-ascii-theme-font: minor-bidi; mso-hansi-theme-font: minor-bidi; mso-bidi-font-family: Arial; mso-bidi-theme-font: minor-bidi;">Second: the adapter. This will be used to transfer the data to the ListActivity with indexing.</span></p>
<p><strong>ContactArrayAdapter.java</strong></p>
<pre class="brush: java; title: ; notranslate">
public class ContactArrayAdapter extends ArrayAdapter&lt;Contact&gt; implements SectionIndexer{

	private final int resourceId;
	ArrayList&lt;Contact&gt; myElements;
	HashMap&lt;String, Integer&gt; alphaIndexer;
	String[] sections;

	@SuppressWarnings({ &quot;unchecked&quot; })
	public ContactArrayAdapter(Context context, int textViewResourceId, List objects) {
		super(context, textViewResourceId, objects);
		resourceId = textViewResourceId;
		myElements = (ArrayList&lt;Contact&gt;) objects;
		alphaIndexer = new HashMap&lt;String, Integer&gt;();
		int size = objects.size();
		for (int i = size - 1; i &gt;= 0; i--) {
			Contact element = myElements.get(i);
			alphaIndexer.put(element.getName().substring(0, 1), i);

		}
		Set&lt;String&gt; keys = alphaIndexer.keySet();
		Iterator&lt;String&gt; it = keys.iterator();
		ArrayList&lt;String&gt; keyList = new ArrayList&lt;String&gt;();
		while (it.hasNext()) {
			String key = it.next();
			keyList.add(key);
		}
		Collections.sort(keyList);
		sections = new String[keyList.size()];
		keyList.toArray(sections);
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {

		Contact c = (Contact) getItem(position);

		// if the array item is null, nothing to display, just return null
		if (c == null) {
			return null;
		}

		// We need the layoutinflater to pick up the view from xml
		LayoutInflater inflater = (LayoutInflater)
		getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

		// Pick up the TwoLineListItem defined in the xml file
		TwoLineListItem view;
		if (convertView == null) {
			view = (TwoLineListItem) inflater.inflate(resourceId, parent, false);
		} else {
			view = (TwoLineListItem) convertView;
		}

		// Set value for the first text field
		if (view.getText1() != null) {
			view.getText1().setText(c.getName());
		}

		// set value for the second text field
		if (view.getText2() != null) {
			view.getText2().setText(c.getNumber());
		}

		return view;
	}

	public int getPositionForSection(int section) {
        String letter = sections[section];
        return alphaIndexer.get(letter);
	}

	public int getSectionForPosition(int position) {
		// TODO Auto-generated method stub
		return 0;
	}

	public Object[] getSections() {
		return sections;
	}

}
</pre>
<p><span style="font-family: Arial;">Third: the Layout. This will define how the name and number will be displayed:</span></p>
<p><strong>listitemlayout.xml</strong> (should be under /res/layout):</p>
<pre class="brush: xml; title: ; notranslate">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;TwoLineListItem
  xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
  android:layout_width=&quot;fill_parent&quot;
  android:layout_height=&quot;wrap_content&quot;&gt;

     &lt;TextView android:id=&quot;@android:id/text1&quot;
        android:layout_marginTop=&quot;1dip&quot;
        android:layout_width=&quot;wrap_content&quot;
        android:layout_height=&quot;wrap_content&quot;
        android:textSize=&quot;15sp&quot;
        android:textStyle=&quot;bold&quot; /&gt;

    &lt;TextView android:id=&quot;@android:id/text2&quot;
        android:layout_width=&quot;wrap_content&quot;
        android:layout_height=&quot;wrap_content&quot;
        android:layout_below=&quot;@android:id/text1&quot;
        android:layout_alignLeft=&quot;@android:id/text1&quot;
        android:paddingBottom=&quot;4dip&quot;
        android:includeFontPadding=&quot;false&quot;
        android:textSize=&quot;15sp&quot;
        android:textStyle=&quot;normal&quot; /&gt;

&lt;/TwoLineListItem&gt;
</pre>
<p><span style="font-family: Arial;">And finally – the activity itself:</span></p>
<p><strong>ContactListDemo.java</strong></p>
<pre class="brush: java; title: ; notranslate">
public class ContactListDemo extends ListActivity implements Runnable{

	private List&lt;Contact&gt; contacts = null;
	private Contact con;
	private ContactArrayAdapter cAdapter;
	private ProgressDialog prog = null;
	private Context thisContext = this;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		prog = ProgressDialog.show(this, &quot;ContactListDemo&quot;, &quot;Getting Contacts&quot;, true, false);
		Thread thread = new Thread(this);
		thread.start();

	}

	public void run() {
		if (contacts == null)
		{
			contacts = fillContactsList();

		}
		handler.sendEmptyMessage(0);
	}

	private List&lt;Contact&gt; fillContactsList() {
		List&lt;Contact&gt; tmpList = new ArrayList&lt;Contact&gt;();
		Cursor c = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
		while(c.moveToNext()){
			String ContactID = c.getString(c.getColumnIndex(ContactsContract.Contacts._ID));
			String name = c.getString(c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
			String hasPhone =c.getString(
					c.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
			if(Integer.parseInt(hasPhone) == 1){
				Cursor phoneCursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
						null,
						ContactsContract.CommonDataKinds.Phone.CONTACT_ID+&quot;='&quot;+ContactID+&quot;'&quot;,
						null, null);
				while(phoneCursor.moveToNext()){
					String number = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
					con = new Contact();
					con.setName(name);
					con.setNumber(number);
					tmpList.add(con);
				}
				phoneCursor.close();
			}

		}
		c.close();
		Collections.sort(tmpList);
		return tmpList;
	}

	private Handler handler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			prog.dismiss();
			cAdapter = new ContactArrayAdapter(thisContext, R.layout.listitemlayout, contacts);
			getListView().setFastScrollEnabled(true);
			setListAdapter(cAdapter);

		}
	};

	@Override
	protected void onListItemClick(ListView l, View v, int position, long id) {
		super.onListItemClick(l, v, position, id);
		TextView label = ((TwoLineListItem) v).getText2();
		String phoneNumber = label.getText().toString();
		Toast.makeText(this, &quot;Selected &quot; + phoneNumber, Toast.LENGTH_SHORT).show();
	}
}
</pre>
<p><span style="font-family: Arial; font-size: 16px;">For your convenience, you can find the full project in our SVN repository</span></p>
<p><span style="font-family: Arial;"><span style="font-size: small;">Hope this info was helpful. </span></span></p>
<p><span style="font-family: Arial;"><span style="font-size: small;">Last note &#8211; I&#8217;m not giving credits to some websites I got the snippets from, just because it took so much time, and research to get this code working, and i don&#8217;t remember which snipped belong to which website. If one of the owners/readers of a website is reading this&#8230; Give me a shout and I&#8217;ll be glad to add credits</span></span></p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.morethantechnical.com%2F2010%2F11%2F28%2Freading-contacts-in-android-2-0%2F&amp;title=Reading%20contacts%20in%20Android%202.0%2B" id="wpa2a_8"><img src="http://www.morethantechnical.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.morethantechnical.com/2010/11/28/reading-contacts-in-android-2-0/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>An Android solution for listening to online radio while multitasking</title>
		<link>http://www.morethantechnical.com/2010/10/27/an-android-solution-for-listening-to-streamin-radio-while-multitasking-2/</link>
		<comments>http://www.morethantechnical.com/2010/10/27/an-android-solution-for-listening-to-streamin-radio-while-multitasking-2/#comments</comments>
		<pubDate>Wed, 27 Oct 2010 10:57:11 +0000</pubDate>
		<dc:creator>Arnon</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Recommended]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Solutions]]></category>
		<category><![CDATA[Stream]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://www.morethantechnical.com/?p=716</guid>
		<description><![CDATA[Android + Yourmuze.fm + Dolphin Browser HD + XiiaLive = WIN It&#8217;s been a while since I&#8217;ve posted anything in the blog… Sorry for that… very busy times. I had a lot of ideas of what my &#8220;comeback post&#8221; should be about, but I knew I had to share one of my relatively recent discoveries [...]]]></description>
			<content:encoded><![CDATA[<p><strong><em>Android + Yourmuze.fm + Dolphin Browser HD + XiiaLive = WIN<br />
</em></strong></p>
<p><img src="http://www.morethantechnical.com/wp-content/uploads/2010/10/102710_1056_AnAndroidso5.jpg" alt="" align="left" />It&#8217;s been a while since I&#8217;ve posted anything in the blog… Sorry for that… very busy times. I had a lot of ideas of what my &#8220;comeback post&#8221; should be about, but I knew I had to share one of my relatively recent discoveries that made my smartphone online-radio listening experience a whole lot better</p>
<p>If you don&#8217;t know <a href="http://www.yourmuze.fm" target="_blank">yourmuze.fm</a>, this might be the time to get to know it. It&#8217;s a free service that has a LOT of worldwide radio stations available as an online stream for usage with most of the smartphones.</p>
<p>In order to start using it you need to register for free via your desktop computer, and add the stations you like. Later on, you can surf to the <a href="http://m.yourmuze.fm" target="_blank">mobile version</a> of the service by mobile web and listen to the stations you selected.</p>
<p>So far so good… I like it. But how about multitasking?</p>
<p><img src="http://www.morethantechnical.com/wp-content/uploads/2010/10/102710_1056_AnAndroidso3.png" alt="" /><img src="http://www.morethantechnical.com/wp-content/uploads/2010/10/102710_1056_AnAndroidso4.png" alt="" /></p>
<p><span id="more-716"></span></p>
<p>The thing is, if you are an average Android user, and try to use the service, then when you will try to hear the station, it will use the stock <strong>movie player</strong> and will not let you to do anything on your phone while listening to the music.</p>
<p>If you answer a call, or even go to the home screen – Your playback will be stopped, since it must run in the foreground</p>
<p>I have done a small research and discovered a very nice way to make yourmuze run in the background and let you do whatever you like while listening to music.</p>
<p>I use it with my GPS app, listening to online music while navigating.</p>
<p>This is relatively simple.</p>
<ol>
<li><span>Download <a href="market://search?q=pname:mobi.mgeek.TunnyBrowser">Dolphin Browser HD</a> and <a href="market://search?q=pname:com.android.DroidLiveLite">XiiaLive Lite</a> from the market (feel free to buy XiiaLive full if you like it)<br />
</span></li>
<li><span>Open up Dolphin Browser, and hit your phone&#8217;s <strong>Menu</strong> button, then select <strong>More</strong> and then <strong>Settings</strong><br />
</span></li>
<li><span>Scroll down to <strong>User Agent</strong>, and select <strong>iPhone</strong><br />
</span></li>
</ol>
<p>That&#8217;s it!</p>
<p>Go back to the browser, and surf to m.yourmuze.fm and login with your credentials. When you will try to listen to your station you will be able to choose if you want to listen with XiiaLive. I chose it to be default.</p>
<p>There you go. One the station is played you can navigate away from the app and do your multitasking</p>
<p>Hope you will find this post is helpful</p>
<p>Arnon</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.morethantechnical.com%2F2010%2F10%2F27%2Fan-android-solution-for-listening-to-streamin-radio-while-multitasking-2%2F&amp;title=An%20Android%20solution%20for%20listening%20to%20online%20radio%20while%20multitasking" id="wpa2a_10"><img src="http://www.morethantechnical.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.morethantechnical.com/2010/10/27/an-android-solution-for-listening-to-streamin-radio-while-multitasking-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenCV2.1 on Android quickey with Haar object detection [w/ code]</title>
		<link>http://www.morethantechnical.com/2010/10/07/opencv2-1-on-android-quickey-with-haar-object-detection-w-code/</link>
		<comments>http://www.morethantechnical.com/2010/10/07/opencv2-1-on-android-quickey-with-haar-object-detection-w-code/#comments</comments>
		<pubDate>Thu, 07 Oct 2010 07:21:16 +0000</pubDate>
		<dc:creator>Roy</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[opencv]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[vision]]></category>

		<guid isPermaLink="false">http://www.morethantechnical.com/?p=690</guid>
		<description><![CDATA[Hi! Long time no post&#8230; MIT is kicking my ass with work. But it was amazing to come back to so many comments with people anxious to get OpenCV going mobile! Anyway, just wanted to share my work on object detection using OpenCV2.1 on the Android. Although it seems like a trivial task, since you [...]]]></description>
			<content:encoded><![CDATA[<p>Hi!<br />
Long time no post&#8230; MIT is kicking my ass with work. But it was amazing to come back to so many comments with people anxious to get OpenCV going mobile!<br />
Anyway, just wanted to share my work on object detection using OpenCV2.1 on the Android.<br />
<span id="more-690"></span><br />
Although it seems like a trivial task, since you can just <a href="http://code.google.com/p/android-opencv/">compile OCV2.1 as native lib and use JNI to access it</a> &#8211; actually I havn&#8217;t seen too many people <a href="http://www.computer-vision-software.com/blog/2010/04/android/">claim to have done it nicely</a> and also share code&#8230; (Ahem, computer-vision-software.com, share the knowledge!)</p>
<p>Anyway, this is a quickey so I&#8217;ll be brief. I followed <a href="http://code.google.com/p/android-opencv/wiki/opencv">android-opencv project instructions</a> for compiling (using Crystax NDK), and successfully ran their example CVCamera app on my device. A good starting point.</p>
<p>But &#8211; the suggested API they use is so cumbersome&#8230; took me a while to figure out, but in the end I couldn&#8217;t be bothered with re-writing the silly parts so I just used it as is.<br />
To save you some time, what I basically did was add a function to detect objects:</p>
<pre class="brush: plain; title: ; notranslate">
int Detector::detectAndDrawObjects(int idx, image_pool* pool) {
	vector&lt;Rect&gt; objects;
	const static Scalar colors[] =  { CV_RGB(0,0,255),
        CV_RGB(0,128,255),
        CV_RGB(0,255,255),
        CV_RGB(0,255,0),
        CV_RGB(255,128,0),
        CV_RGB(255,255,0),
        CV_RGB(255,0,0),
        CV_RGB(255,0,255)} ;
	double scale = 2.0;

	Mat* _img = pool-&gt;getImage(idx);
	Mat tmp;
	resize(*_img,tmp,Size(_img-&gt;cols/2.0, _img-&gt;rows/2.0));

	double angle = -90.0;
	Point2f src_center(tmp.rows/2.0, tmp.rows/2.0);
    Mat rot_mat = getRotationMatrix2D(src_center, angle, 1.0/scale);
    Mat dst;
    warpAffine(tmp, dst, rot_mat, Size(tmp.rows,tmp.cols));
	flip(dst,dst,1);

	Mat img = dst;

	Mat gray, smallImg; //( cvRound (img.rows/scale), cvRound(img.cols/scale), CV_8UC1 );
	cvtColor( img, gray, CV_BGR2GRAY );
	smallImg = gray;
        equalizeHist( smallImg, smallImg );

	int minobjsize = 40;

	this-&gt;cascade.detectMultiScale( smallImg, objects,
							 1.1, 2, 0
							 |CV_HAAR_FIND_BIGGEST_OBJECT
							 //|CV_HAAR_DO_ROUGH_SEARCH
							 |CV_HAAR_SCALE_IMAGE
							 ,
							 Size(minobjsize, minobjsize) );

	stringstream ss; ss &lt;&lt; objects.size() &lt;&lt; &quot; objects, &quot; &lt;&lt; smallImg.cols &lt;&lt; &quot;x&quot; &lt;&lt; smallImg.rows;
	putText(img,ss.str(),Point(20,20),FONT_HERSHEY_PLAIN,1.0,Scalar(0,255,0),2);

	int i = 0; scale = 1.0;
    for( vector&lt;Rect&gt;::const_iterator r = objects.begin(); r != objects.end(); r++, i++ )
    {
        Point center;
        Scalar color = colors[i%8];
        int radius;
        center.x = cvRound((r-&gt;x + r-&gt;width*0.5)*scale);
        center.y = cvRound((r-&gt;y + r-&gt;height*0.5)*scale);
        radius = cvRound((r-&gt;width + r-&gt;height)*0.25*scale);
        circle( img, center, radius, color, 3, 8, 0 );

		stringstream ss1; ss1 &lt;&lt; r-&gt;x &lt;&lt; &quot;,&quot; &lt;&lt; r-&gt;y;
		putText(img,ss1.str(),Point(20,30),FONT_HERSHEY_PLAIN,1.0,Scalar(0,255,0),2);
	}

	//whole area
	rectangle(img,Point(0,0),Point(img.cols-1,img.rows-1),Scalar(0,255,0),3);
	//a [minobjsize]x[minobjsize] rect
	rectangle(img,Point(img.cols/2.0 - minobjsize/2.0,img.rows/2.0 - minobjsize/2.0),
			  Point(img.cols/2.0 + minobjsize/2.0,img.rows/2.0 + minobjsize/2.0),
			  Scalar(0,255,0),3);

	dst.copyTo(*_img);

	return objects.size();
}
</pre>
<p>Excuse my messy code, it&#8217;s just a modification of facedetect.cpp from OCV examples.</p>
<p>However, one move was to rotate the frame because the silly Samsung Galaxy is delivering frames in &#8220;portrait&#8221; rather than &#8220;landscape&#8221; (the warpAffine op). Or rather it&#8217;s android-opencv problem with delivering the bytes&#8230; but anyway I had to deal with it. The rest is pretty standard stuff. </p>
<p><strong>So what&#8217;s going on in the java-side?</strong> Nothing much&#8230; just a call to the JNI function</p>
<pre class="brush: plain; title: ; notranslate">
    class DetectorProcessor implements NativeProcessor.PoolCallback {

		@Override
		public void process(int idx, image_pool pool, long timestamp,
				NativeProcessor nativeProcessor) {

			Log.i(&quot;Detector&quot;,&quot;Detector process start&quot;);
  			int num = processor.detectAndDrawObjects(idx, pool);
			Log.i(&quot;Detector&quot;,&quot;Detector process end, found &quot; + num + &quot; objects&quot;);

                        //probably should do something with these objects now..
               }
     }
</pre>
<p>In a timely fashion &#8211; which means adding it to android-ocv&#8217;s &#8220;Callback Stack&#8221;:</p>
<pre class="brush: plain; title: ; notranslate">
		LinkedList&lt;PoolCallback&gt; defaultcallbackstack = new LinkedList&lt;PoolCallback&gt;();
		defaultcallbackstack.addFirst(new DetectorProcessor());
		mPreview.addCallbackStack(defaultcallbackstack);
</pre>
<p>This will run the JNI call on every frame&#8230;</p>
<p><strong>The JNI is created by SWIG following android-ocv:</strong></p>
<pre class="brush: plain; title: ; notranslate">

/*
 * include the headers required by the generated cpp code
 */
%{
#include &quot;Detector.h&quot;
#include &quot;image_pool.h&quot;
	using namespace cv;
%}

//import the android-cv.i file so that swig is aware of all that has been previous defined
//notice that it is not an include....
%import &quot;android-cv.i&quot;

//make sure to import the image_pool as it is referenced by the Processor java generated class
%typemap(javaimports) Detector &quot;
import com.opencv.jni.image_pool;// import the image_pool interface for playing nice with
// android-opencv

//this is exactly as in &quot;Detector.h&quot;
class Detector {
public:
	Detector();
	virtual ~Detector();

	bool initCascade(const char* filename);
	int detectAndDrawObjects(int idx, image_pool* pool);
};
</pre>
<p><strong>Almost forgot &#8211; loading the classifier cascade!</strong><br />
This proved a bit tricky, since just adding the XML to the &#8220;assets&#8221; doesn&#8217;t allow the native code to access it via system file interface, I did a little workaround and just made a temp copy of it and then (when I have an accessible File object) I load it in the Cascade object using absolutePath:</p>
<pre class="brush: plain; title: ; notranslate">
try {
			InputStream is = getAssets().open(&quot;cascade-haar-40.xml&quot;);

			File tempfile = File.createTempFile(&quot;detector&quot;, &quot;&quot;);
			Log.i(&quot;Detector&quot;,&quot;Tempfile:&quot; + tempfile.getAbsolutePath());
			FileOutputStream fos = new FileOutputStream(tempfile);
			byte[] b = new byte[1024];
			int read = -1;
			while((read = is.read(b,0,1024)) &gt; 0) {
				Log.i(&quot;Detector&quot;,&quot;read &quot; + read);
				fos.write(b,0,read);
			}
			fos.close(); is.close();
			boolean res = processor.initCascade(tempfile.getAbsolutePath());
			Log.i(&quot;Detector&quot;,&quot;initCascade: &quot; + res);
			tempfile.delete(); // no longer needed
		} catch (IOException e) {
			e.printStackTrace();
		}
</pre>
<p>This is some simple object detection on Android right? and it works in high FPSs too (>10 on Samsung Galaxy S)</p>
<p>I&#8217;ll try to upload video proof soon (video of a video is not so simple <img src='http://www.morethantechnical.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> , and maybe complete source.</p>
<p>Thanks for tuning in&#8230;<br />
Roy.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.morethantechnical.com%2F2010%2F10%2F07%2Fopencv2-1-on-android-quickey-with-haar-object-detection-w-code%2F&amp;title=OpenCV2.1%20on%20Android%20quickey%20with%20Haar%20object%20detection%20%5Bw%2F%20code%5D" id="wpa2a_12"><img src="http://www.morethantechnical.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.morethantechnical.com/2010/10/07/opencv2-1-on-android-quickey-with-haar-object-detection-w-code/feed/</wfw:commentRss>
		<slash:comments>30</slash:comments>
		</item>
		<item>
		<title>iPhone OS 3.x Raw data of camera frames</title>
		<link>http://www.morethantechnical.com/2010/02/27/iphone-os-3-x-raw-data-of-camera-frames/</link>
		<comments>http://www.morethantechnical.com/2010/02/27/iphone-os-3-x-raw-data-of-camera-frames/#comments</comments>
		<pubDate>Sat, 27 Feb 2010 20:44:32 +0000</pubDate>
		<dc:creator>Roy</dc:creator>
				<category><![CDATA[graphics]]></category>
		<category><![CDATA[Mobile phones]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[video]]></category>
		<category><![CDATA[vision]]></category>
		<category><![CDATA[Website]]></category>
		<category><![CDATA[frame grabbing]]></category>
		<category><![CDATA[iphone]]></category>

		<guid isPermaLink="false">http://www.morethantechnical.com/?p=599</guid>
		<description><![CDATA[Hi All It looks like it&#8217;s finally here &#8211; a way to grab the raw data of the camera frames on the iPhone OS 3.x. Update: Apple officially supports this in iOS 4.x using AVFoundation, here&#8217;s sample code from Apple developer. A gifted hacker named John DeWeese was nice enough to comment on a post [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.morethantechnical.com/wp-content/uploads/2010/02/iphone-os-3-STEWIE.png" rel="lightbox[599]"><img src="http://www.morethantechnical.com/wp-content/uploads/2010/02/iphone-os-3-STEWIE-300x212.png" alt="" title="&quot;where is my data?!&quot;" width="300" height="212" class="alignleft size-medium wp-image-601" /></a>Hi All</p>
<p>It looks like it&#8217;s finally here &#8211; a way to grab the raw data of the camera frames on the iPhone OS 3.x. </p>
<p><strong>Update</strong>: Apple officially supports this in iOS 4.x using AVFoundation, <a href="http://developer.apple.com/iphone/library/qa/qa2010/qa1702.html#TNTAG1">here&#8217;s</a> sample code from Apple developer.</p>
<p>A gifted hacker named <a href="http://deweeeese.blogspot.com/">John DeWeese</a> was nice enough to comment on <a href="http://www.morethantechnical.com/2009/05/06/iphone-camera-frame-grabbing-and-a-real-time-meanshift-tracker/">a post from May 09&#8242;</a> with <a href="http://deweeeese.blogspot.com/2010/02/processing-iphone-camera-video-on.html">his method of hacking the APIs to get the frames</a>. Though cumbersome, it looks like it should work, but I haven&#8217;t tried it yet. I promise to try it soon and share my results.</p>
<p>Way to go John!<br />
Some code would be awesome&#8230;</p>
<p>Roy.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.morethantechnical.com%2F2010%2F02%2F27%2Fiphone-os-3-x-raw-data-of-camera-frames%2F&amp;title=iPhone%20OS%203.x%20Raw%20data%20of%20camera%20frames" id="wpa2a_14"><img src="http://www.morethantechnical.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.morethantechnical.com/2010/02/27/iphone-os-3-x-raw-data-of-camera-frames/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Weekli Lynks [Links of the week]</title>
		<link>http://www.morethantechnical.com/2009/11/24/weekli-lynks-links-of-the-week/</link>
		<comments>http://www.morethantechnical.com/2009/11/24/weekli-lynks-links-of-the-week/#comments</comments>
		<pubDate>Tue, 24 Nov 2009 14:07:22 +0000</pubDate>
		<dc:creator>Roy</dc:creator>
				<category><![CDATA[Mobile phones]]></category>
		<category><![CDATA[Recommended]]></category>
		<category><![CDATA[Website]]></category>
		<category><![CDATA[weekly links]]></category>

		<guid isPermaLink="false">http://www.morethantechnical.com/?p=532</guid>
		<description><![CDATA[Hi A hefty crop this week… Stuff I picked up on the web this past week: http://www.techcrunch.com/2009/11/12/trouble-at-twitter-u-s-visitors-down-8-percent-in-october/ Finally &#8211; the Twitter bubble is starting to burst. I was asking myself how long this foolishness will last. I mean, really &#8211; only 140 chars? come on&#8230; http://gizmodo.com/5404086/10-human-functions-weve-already-handed-over-to-the-machines/gallery Robots &#8211; you like them and fear them at [...]]]></description>
			<content:encoded><![CDATA[<p>Hi</p>
<p>A hefty crop this week…</p>
<p>Stuff I picked up on the web this past week:<br />
<a href="http://www.techcrunch.com/2009/11/12/trouble-at-twitter-u-s-visitors-down-8-percent-in-october/">http://www.techcrunch.com/2009/11/12/trouble-at-twitter-u-s-visitors-down-8-percent-in-october/</a><br />
Finally &#8211; the Twitter bubble is starting to burst. I was asking myself how long this foolishness will last. I mean, really &#8211; only 140 chars? come on&#8230;</p>
<p><a href="http://gizmodo.com/5404086/10-human-functions-weve-already-handed-over-to-the-machines/gallery">http://gizmodo.com/5404086/10-human-functions-weve-already-handed-over-to-the-machines/gallery</a><br />
Robots &#8211; you like them and fear them at the same time&#8230;</p>
<p><a href="http://gizmodo.com/5403457/10-iphone-apps-to-augment-your-sad-reality/gallery">http://gizmodo.com/5403457/10-iphone-apps-to-augment-your-sad-reality/gallery</a><br />
AR recap on the iPhone.<br />
My 2 cents: this is getting old&#8230; and everyone are doing the same thing. Innovation is needed.</p>
<p><a href="http://gizmodo.com/5403646/what-is-this">http://gizmodo.com/5403646/what-is-this</a><br />
10 bucks if you guess what this is</p>
<p><a href="http://www.techcrunch.com/2009/11/16/foursquare-api/">http://www.techcrunch.com/2009/11/16/foursquare-api/</a><br />
We GOTTA do something with this. This is a hot (and interesting) buzz out there: social-location.</p>
<p><a href="http://lifehacker.com/5405684/apostropheme-explains-when-you-really-need-apostrophes">http://lifehacker.com/5405684/apostropheme-explains-when-you-really-need-apostrophes</a><br />
And let that be a lesson for you.</p>
<p><a href="http://www.techcrunch.com/2009/11/16/youtube-direct-gives-news-orgs-a-way-to-accept-user-submitted-videos/">http://www.techcrunch.com/2009/11/16/youtube-direct-gives-news-orgs-a-way-to-accept-user-submitted-videos/</a><br />
Another cool new thing to integrate with</p>
<p><a href="http://www.mobilecrunch.com/2009/11/16/samsung-announces-new-android-powered-galaxy-spica-i5700/">http://www.mobilecrunch.com/2009/11/16/samsung-announces-new-android-powered-galaxy-spica-i5700/</a><br />
More android love from Samsung!</p>
<p><a href="http://gizmodo.com/5407454/microsofts-bag+based-computer-interface-for-poking">http://gizmodo.com/5407454/microsofts-bag+based-computer-interface-for-poking</a><br />
Microsoft – not so soft… finger-press based interface</p>
<p><a href="http://gizmodo.com/5407319/nokias-n+series-will-ditch-symbian-for-maemo-by-2012">http://gizmodo.com/5407319/nokias-n+series-will-ditch-symbian-for-maemo-by-2012</a><br />
Let&#8217;s do something with Maemo!</p>
<p><a href="http://lifehacker.com/5407010/refine-your-image-search-with-google-image-swirl">http://lifehacker.com/5407010/refine-your-image-search-with-google-image-swirl</a><br />
Try it – it&#8217;s cute.</p>
<p><a href="http://gizmodo.com/5407245/the-true-google-phone-may-be-coming-soon">http://gizmodo.com/5407245/the-true-google-phone-may-be-coming-soon</a><br />
Google on the move into mobile phones, that was anticipated. But looks like the schedule is being pulled back</p>
<p>See ya&#8217;ll next week!<br />
Roy.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.morethantechnical.com%2F2009%2F11%2F24%2Fweekli-lynks-links-of-the-week%2F&amp;title=Weekli%20Lynks%20%5BLinks%20of%20the%20week%5D" id="wpa2a_16"><img src="http://www.morethantechnical.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.morethantechnical.com/2009/11/24/weekli-lynks-links-of-the-week/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Number Saver (Android application)</title>
		<link>http://www.morethantechnical.com/2009/09/01/number-saver/</link>
		<comments>http://www.morethantechnical.com/2009/09/01/number-saver/#comments</comments>
		<pubDate>Tue, 01 Sep 2009 13:22:45 +0000</pubDate>
		<dc:creator>Arnon</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Mobile phones]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[Solutions]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[application]]></category>
		<category><![CDATA[clipboard]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[free]]></category>
		<category><![CDATA[market]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[number]]></category>
		<category><![CDATA[store]]></category>

		<guid isPermaLink="false">http://www.morethantechnical.com/?p=428</guid>
		<description><![CDATA[A very basic feature that I was missing in my Android phone is the ability to save a number while I&#8217;m in a call. Sure you can go to the home screen, and open up any app with a textbox, but I decided to create a dedicated application. So, meet Number Saver! UPDATE: Number Saver [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.morethantechnical.com/wp-content/uploads/2009/09/090109_1322_NumberSaver1.jpg" alt="" align="left" />A very basic feature that I was missing in my Android phone is the ability to save a number while I&#8217;m in a call. Sure you can go to the home screen, and open up any app with a textbox, but I decided to create a dedicated application.</p>
<p>So, meet Number Saver!<br />
<span style="text-decoration: underline;"><strong>UPDATE:</strong></span> Number Saver <a href="http://www.morethantechnical.com/2011/06/14/number-saver-gets-a-new-look">got a new look</a></p>
<p><strong>Basic usage guide:<br />
</strong></p>
<p>When you open the app you will get the main screen:</p>
<p>From here you are able to enter the number, copy to the clipboard, and clear the clipboard if it is full. Also, when you open the app, if there is a text in the clipboard it will already be in the text box. So you can press Dial to instantly dial the number</p>
<p>Also, during an active call you will notice the note and pencil icon. Stretching the notification area will give you the option to launch the application.</p>
<p>This app is available for free through the Android market. Donation is always welcome &#8230;<br />
<img src="http://www.morethantechnical.com/wp-content/uploads/2009/09/090109_1322_NumberSaver2.png" alt="" /></p>
<p><img src="http://www.morethantechnical.com/wp-content/uploads/2009/09/090109_1322_NumberSaver3.png" alt="" /><img src="http://www.morethantechnical.com/wp-content/uploads/2009/09/090109_1322_NumberSaver4.png" alt="" /><img src="http://www.morethantechnical.com/wp-content/uploads/2009/09/090109_1322_NumberSaver5.png" alt="" /></p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.morethantechnical.com%2F2009%2F09%2F01%2Fnumber-saver%2F&amp;title=Number%20Saver%20%28Android%20application%29" id="wpa2a_18"><img src="http://www.morethantechnical.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.morethantechnical.com/2009/09/01/number-saver/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

