Read it loud! Premium Version 1.1 available

I just released Version 1.1 of Read it loud! Premium, my SMS reading app available on Android Market. You can now use profile managers like Llama and others that are able to communicate with other apps via Android intent system to activate and deactivate it automatically.

How to? Just configure your profile manager to send the intent

de.exesmobile.messagereaderpremium.ACTIVATE

to activate it. Or send

de.exesmobile.messagereaderpremium.DEACTIVATE

to – well I think you can guess ;-)

Thanks to Joe Kurut who sent me an email with the idea for that feature!

Finally…

Well – how big the part that software development plays in my live may be, there is something more. No, not my wife (whose part is actually a tiny fraction bigger) – I am talking about music. I play the base guitar in a band called “Sky Pilot” and we have now released our first EP called “Live from Livingroom”. It is available on iTunes, so if you like, take a listen

Tempolimit 5.9 available

A few minutes ago I released Tempolimit Speed HUD Version 5.9. New features are long requested optimizations for the apps HUD mode like a full screen view of the driven speed (YES, without the speed sign and the title bar) and a high contrast mode.

Wonder if we will hit 50.000 downloads solely on Android Market by the end of the year (right now it is roughly 39.000 and counting). If you already use the app, just update, if you don’t and want to give it a try:

https://market.android.com/details?id=net.thomasmanthey.speedwarner

Let me know what features you would like for future releases…

 

 

 

 

Problems with an App? Comments and bad ratings do not help…

Today I noticed a change in ratings of my application “Read it loud! SMS Reader Basic” – one 5 star rating had gone while a 2 star rating had appeared. Obviously a user had changed his mind after a bad experience with the app. Then I saw a accompanying comment – let me quote:

Worked great with my Evo 4G and my Evo 3D…and worked for a day on my Motorola Photon…but it stopped for some reason…love the app otherwise

I really would love to offer help, to find out what the error was and to correct it – but I can’t.

What most users do not keep in mind is that we developers cannot reply to comments and ratings, we cannot even contact the one who wrote that comment. So what can YOU as a user do instead of just writing negative comments and ratings? Well, if you like the app in general but had some negative experience – may it be an error or a function not working as expected or even a feature wish – then give us developers a chance to give you support and improve our apps. Just contact us – a suitable mail address can be found on every app’s market page. And then tell us what happened. Did you change something on your phone? Was there a software update? Did you notice anything when it stopped working?

We do lots of testing before publishing apps and invest lots of effort to produce quality software – so if you get an error or a problem then there is a good chance that we can fix it in a short time. Which means no bad ratings for us and our apps and better apps for you to use.

Agreed? Thank you!

Using OnUtteranceCompletedListener, the right way…

You know Androids TextToSpeech-Service? It enables you to enhance your Android apps with voice output in a very convenient way. What I like most is that it runs completely in the background, so that calling myTTSService.speak("Some very long text indeed...");  does not stop your main thread from continuing which is one reason less to get an “Application not responding”-error.

So far so good, but sometimes you just need to know when the TTS-Service has finished speaking a sentence. Well, the API documentation suggests the following: Just make your calling class implement OnUtteranceCompletedListener, register it with the TTS-Service and get notified whenever a sentence is finished. Let source code speak:

public class MyAwesomeActivity extends Activity implements OnInitListener, OnUtteranceCompletedListener {
    private TextToSpeech myTTS = null;
    private boolean speechInitialized = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //create the TTS-object
        myTTS = new TextToSpeech(this,this);
        //and register ourselves, as we want to be notified on finishing...
        myTTS.setOnUtteranceCompletedListener(this);
    }

    /**
    * Override für OnInitListener.onInit(), gets called when TTS is initialized and ready to speak
    */

    @Override
    public void onInit(int status) {
        speechInitialized = true;
        speak("FIRSTSENTENCE", "Hello World!");
    }

    /**
    * Gets called when TTS has finished speaking a sentence identified by utteranceID
    */

    @Override
    public void onUtteranceCompleted(String utteranceId) {
        //do something, e.g. update the GUI or something like that (beware of threading)
    }

    /**
    * Speak a sentence
    */

    private void speak(String utteranceID, String whatToSpeak) {

        HashMap params=new HashMap();
        params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID,utteranceID);

        if (myTTS!=null) myTTS.speak(whatToSpeak, TextToSpeech.QUEUE_ADD, params);
    }
}

After compiling and running this code one would expect (at least I did on first try) that the TTS-Engine would
(a) be initialized
(b) would speak “Hello world”
(c) call my method onUtteranceCompleted with “FIRSTSENTENCE” as parameter.

Well, (a) and (b) happened perfectly. Not so much (c), where not so much means not at all. What happened? After trying I lot i found out that the API documentation does not mention on thing: The call myTTS.setOnUtteranceCompletedListener(this); MUST be used AFTER onInit has been called by the TTS -Service.

So changing two methods helps:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //create the TTS-object
    myTTS = new TextToSpeech(this,this);
}

    /**
    * Override für OnInitListener.onInit(), gets called when TTS is initialized and ready to speak
    */

    @Override
    public void onInit(int status) {
        speechInitialized = true;
        //and NOW register ourselves, as we want to be notified on finishing...
        myTTS.setOnUtteranceCompletedListener(this);
        speak("FIRSTSENTENCE", "Hello World!");
    }

Nice to know…

Für wie blöd…

… hält so manch ein Phisher die User eigentlich?

Ich erhielt gerade ein Mail mit dem folgenden Text:

Dear Valued Member,

Recently, our system has detected unusual charges to a credit card linked to your PayPal account.

Access to your account was limited for the following reason:

We have established that someone tried to access your PayPal account without
your permission. To ensure greater security, we have limited access to your account. We have sent
you an attachment which contains all the necessary steps in order to restore your account access.
Please download and open it in your browser.

(The locator for this reason is PP-608-932-384)

We thank you for your prompt attention to this matter. Please understand that this
is a security measure intended to protect you and your account. We apologise for any inconvenience.

Thank you,
PayPal Account Review Department

Im Anhang ein HTML-Dokument mit einem Formular, dass sich jede Menge Links und Assets von der echten Paypal-Seite zieht, um die Eingabe sämtlicher Kreditkartendaten bittet, um diese dann schön an einen Server irgendwo in der Türkei zu senden…

Schön plump… Kriegt man fast Lust auf eine DDOS-Attacke ;-)