Tuesday, September 27, 2011

Android’s Text to Speech

This is a sample activity which shows How to use Android’s Text to Speech capabilities. Text to Speech was introduced in Android 1.6, so when you create your new Android project make sure your minimum required SDK is set to Android 1.6 (or API level 4).

Underlying Algorithm:
Basic description of algorithm in step by step form:
1.) Create a Project MyTextToSpeech.
2.) Put the following code snippet in res/layout/main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="vertical"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   >
    
<EditText android:id="@+id/input_text" 
        android:text=""
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
/>
<Button android:id="@+id/speak_button" 
        android:text="Speak to me"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
/>
</LinearLayout>
3.) You just need to import the following packages and create a TextToSpeech object.
import android.speech.tts.TextToSpeech;
import android.speech.tts.TextToSpeech.OnInitListener;
4.) The second is an OnInitListener which you will need to implement.
5.) Run the Application.
Steps to Create:
1.) Open Eclipse. Use the New Project Wizard and select Android Project Give the respective project name i.e. MyTextToSpeech. Enter following information:
Project name: MyTextToSpeech
Build Target: Android APIs 2.1
Application name: MyTextToSpeech
Package name: com.app.MyTextToSpeech
Create Activity: MyTextToSpeech
On Clicking Finish MyTextToSpeech code structure is generated with the necessary Android Packages being imported along with MyTextToSpeech.java. MyTextToSpeech class will look like following:
package com.app.MyTextToSpeech;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.speech.tts.TextToSpeech;
import android.speech.tts.TextToSpeech.OnInitListener;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MyTextToSpeech extends Activity implements OnInitListener{
        /** Called when the activity is first created. */
        private int MY_DATA_CHECK_CODE = 0;
        private TextToSpeech tts;
        private EditText inputText;
        private Button speakButton;
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            inputText = (EditText) findViewById(R.id.input_text);
            speakButton = (Button) findViewById(R.id.speak_button);
            speakButton.setOnClickListener(new OnClickListener() {                      
                @Override
                public void onClick(View v) {
                   String text = inputText.getText().toString();
                   if (text!=null && text.length()>0) {
                        Toast.makeText(MyTextToSpeech.this, "Saying: " + text, Toast.LENGTH_LONG).show();
                        tts.speak(text, TextToSpeech.QUEUE_ADD, null);
                   }
                }
            });
            Intent checkIntent = new Intent();
            checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
            startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);
       }
       protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == MY_DATA_CHECK_CODE) {
                if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
                        // success, create the TTS instance
                        tts = new TextToSpeech(this, this);
                } 
                else {
                        // missing data, install it
                        Intent installIntent = new Intent();
                        installIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
                        startActivity(installIntent);
                }
         }
       }
        @Override
        public void onInit(int status) {                
          if (status == TextToSpeech.SUCCESS) {
                Toast.makeText(MyTextToSpeech.this, "Text-To-Speech engine is initialized", Toast.LENGTH_LONG).show();
          }
          else if (status == TextToSpeech.ERROR) {
                Toast.makeText(MyTextToSpeech.this, "Error occurred while initializing Text-To-Speech engine", Toast.LENGTH_LONG).show();
          }
        }
}
Output –The final output:

Rating Bar


This example shows how to crating rating bar in android.
Algorithm:
1.) Create a new project by File-> New -> Android Project name it RatingBarExample.
2.) Write following code into your main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="vertical"
   android:paddingLeft="10dip"
   android:layout_width="match_parent"
   android:layout_height="match_parent">
    <RatingBar android:id="@+id/ratingbar1"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:numStars="3"
       android:rating="2.5" />
    <RatingBar android:id="@+id/ratingbar2"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:numStars="5"
       android:rating="2.25" />
    <LinearLayout
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_marginTop="10dip">
       
        <TextView android:id="@+id/rating"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content" />
           
        <RatingBar android:id="@+id/small_ratingbar"
           style="?android:attr/ratingBarStyleSmall"
           android:layout_marginLeft="5dip"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:layout_gravity="center_vertical" />
           
    </LinearLayout>
    <RatingBar android:id="@+id/indicator_ratingbar"
       style="?android:attr/ratingBarStyleIndicator"
       android:layout_marginLeft="5dip"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_gravity="center_vertical" />
           
</LinearLayout>
3.) Write following code into your strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello World, RatingBarExample!</string>
    <string name="app_name">RatingBarExample</string>
     <string name="ratingbar_rating">Rating:</string>
</resources>
4.) Build and run your code and check the output given below in the doc.
Steps:
1.) Create a project named RatingBarExample and set the information as stated in the image.
Build Target: Android 3.0
Application Name: RatingBarExample
Package Name: com.org. RatingBarExample
Activity Name: RatingBarExample
Min SDK Version: 11
2.) Open RatingBarExample.java file and write following code there:
package com.org.RatingBarExample;
import android.app.Activity;
import android.os.Bundle;
import android.widget.RatingBar;
import android.widget.TextView;
public class RatingBarExample extends Activity implementsRatingBar.OnRatingBarChangeListener {
    RatingBar mSmallRatingBar;
    RatingBar mIndicatorRatingBar;
    TextView mRatingText;
   
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        mRatingText = (TextView) findViewById(R.id.rating);
        // We copy the most recently changed rating on to these indicator-only
        // rating bars
        mIndicatorRatingBar = (RatingBar) findViewById(R.id.indicator_ratingbar);
        mSmallRatingBar = (RatingBar) findViewById(R.id.small_ratingbar);
       
        // The different rating bars in the layout. Assign the listener to us.
        ((RatingBar)findViewById(R.id.ratingbar1)).setOnRatingBarChangeListener(this);
        ((RatingBar)findViewById(R.id.ratingbar2)).setOnRatingBarChangeListener(this);
    }
    public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromTouch){
        final int numStars = ratingBar.getNumStars();
        mRatingText.setText(
                getString(R.string.ratingbar_rating) + " " + rating + "/" + numStars);
        // Since this rating bar is updated to reflect any of the other rating
        // bars, we should update it to the current values.
        if (mIndicatorRatingBar.getNumStars() != numStars) {
            mIndicatorRatingBar.setNumStars(numStars);
            mSmallRatingBar.setNumStars(numStars);
        }
        if (mIndicatorRatingBar.getRating() != rating) {
            mIndicatorRatingBar.setRating(rating);
            mSmallRatingBar.setRating(rating);
        }
        final float ratingBarStepSize = ratingBar.getStepSize();
        if (mIndicatorRatingBar.getStepSize() != ratingBarStepSize) {
            mIndicatorRatingBar.setStepSize(ratingBarStepSize);
            mSmallRatingBar.setStepSize(ratingBarStepSize);
        }
    }
}
3.) Compile and build the project.
4.) Run on 3.0 simulator for the output.
Output