Posts mit dem Label Android werden angezeigt. Alle Posts anzeigen
Posts mit dem Label Android werden angezeigt. Alle Posts anzeigen

Donnerstag, 6. November 2014

[Android Tutorial] 3. Setting up your system

I don't know if you skipped the last part and started right here so i'd like to welcome you to my tutorial about android development. Let's welcome back Mike, our little developer who wants to develop an android application.
Let's get stuff going!

Downloading Eclipse

Use this link to the official google android developing page. Click "Download Eclipse ADT" and follow the downloading procedure.
Extract the downloaded zip folder and navigate to the "eclipse" folder.
Run "eclipse.exe".

Some basics about android projects

Before Mike starts developing he needs to know some stuff about the project structure. He starts by reading this book. Fortunately Mike speaks german fluently. If you don't you can read the head first book about android development. I haven't read it but most of the head first books are great for beginners.

Structure of android projects


The sourcecode of android applications is located in the src folder like in every other java project.
Images are svaed in the res/drawable folder. Activites and fragments are located in the res/layout folder. Android is generating files inside the gen folder. NEVER TOUCH FILES IN THE gen FOLDER.

Activities and fragments


An activity describes one user interface. The official styleguide of google states that one activity should only be there for one specific task. E.g. one for logging in, one showing the main menu and another one showing some data.
A fragment is a reusable component which can be used in activites.

AndroidManifest.xml


The AndroidManifest.xml describes the android application. It contains most of the components like activities, the used android version,  and so forth. If you need to get access to system components like the file storage or the camera you need to mention that in the AndroidManifest.xml.

Now that Mike got an idea how android projects are structured he starts by creating an android project in Eclipse.


Creating your first project

Mike didn't use Eclipse yet so he's asking the his asian coworker Co Ding how to create a new android project:

[Mike] Hey Mr. Ding, i got a question about creating a new android project in Eclipse.

[Co Ding] Greetings Mr. Mike, the answer is pretty simple. Just navigate to "File - New Project - Project..." now a popup opens where you can select what kind of project you want to create. You need to select "Android - Android Application Project". Now you can set some options for your new project.

[Mike] Woaaah, that's really simple. But i have no idea which options i should choose.

[Co Ding] Of course it is. Well, let me set something straight first: NEVER LET ECLIPSE GENERATE AN ACTIVITY FOR YOU.

[Mike] But why shouldn't i let Eclipse generate an activity for me?

[Co Ding]  If you want to know this you can look at this post which explains the problem and shows  how to solve it.

[Mike] Alright, Mr. Ding. But how should i create an activity instead?

[Co Ding]  Have a look at this todo list:
  1. Navigate to the "res/layout" folder
  2. Create a "New Android XML File
  3. Navigate to your "src" folder
  4. Create a new class extending android.app.Activity
  5. Open your "AndroidManifest.xml"
  6. Add the following lines (The part in the brackets is only needed if the activity is you lancher activity!)

        
            [
           
                

                
            
             ]
        


[Mike] I guess i got it. I'll have a look at it by myself now. Thanks for your help, Mr. Ding.

[Co Ding] No problem, Mike. If you are having troubles or you didn't understand a thing you can ask me by writing an email to loris.bachert@gmail.com.

What are we going to do next?

In the next tutorial we will face the UI design and we start writing a HelloWorld. I hope you liked it :)




Freitag, 17. Oktober 2014

[Android Tutorial] 2. Getting stuff started

A story about Mike

I want to introduce you to Mike. Mike is a 40 years old, married man. He's working as a software developer in a company called WhyYouNoWork Inc. (WYNW). His daily work includes java development but Mike isn't comfortable in his company. A short time ago Mike got an idea of an android app to earn a lot of money. To ensure you get to know him take a look at this picture of him:
The problem is Mike does not have any idea what how android is working and how he could getting started with coding. Mike asks, like every developer, google.

History of Android

1.0 - SDK Release 12. November 2007
1.5 - Input without hardware keyboard
1.6 - Supports multiple resolutions
2.0 - Better account management
2.2 - Backup functions
2.3 - Voice over IP
3.0 - Actionbar
4.0 - Optimizations for smartphones and tablets
4.1 - Performance optimization
4.2 - Miracast support

Mike got that but he's bored and wants to know something more useful. He keeps on searching and finds the following graphic about the architecture of android.

Architecture of Android



Mike wonders what the application framework is used for. He finds the following facts to get a short overview:
The application framework:
  • Simplifies the access to the device hardware
    • e.g. camera, network, sensors
  • Views
    • views are the basics of android UIs (We are going to look at this later this tutorial)
  • Content Provider
    • rights management of applications
  • Resource Manager
    • access to graphics and layoutfiles
  • Notification Manager
    • access to the statusbar
  • Activity Manager
    • controls the lifecycle of applications

What we are going to do next

Finally Mike got that and writes it, like every good programmer, down for later studying. But now he wants to start coding. First of all he will set up his system.


[Android Tutorial] 1. Introduction

Hey there,
due to a workshop i gave in my company i thought i also introduce you to android development. This will be a most practical workshop but some theory is necessary to get your things done. To give this tutorial an overall relaxed apperance i will wrap it with a tiny neat story.

What are we going to do?

First of all you will get a theoretical introduction about the most important things in the world of our tiny little green helper. Afterwards i will explain how to set up you computer so you can develop apps by yourself. If you got that far we will start doing a lot of exercises. Starting with a simple hello world we will make our way to do an organizer app which saves lists of data.

Why should i learn android?

  • Very similiar to java programming
    • If you already developed in java you will have a good time
  • Google loves every developer
    • compared to iOS where you need to pay to be able to develop
  • Uploading apps to the Play Store is really easy

What do i need to know to follow this tutorial?

You need to be familiar with Java. I will use a little bit of inheritance and maybe some generics aswell.

Let's get started. If you don't understand something or something is unclear just use the comments or email me to info@loris-bachert.de.

Have fun :)

Links to the parts:

Mittwoch, 9. April 2014

[Android] Continous Speech Recognition

This is a tutorial for implementing a continous speech recognition in Android. I am writing this because I had a lot of trouble myself developing it.

What you should know
  • The basics of Java including interfaces and inheritance
  • The basics of Android development
Preface

I got a lecture called "Software Engineering" in which all students need to develop applications for wearable devices. We got a pretty cool idea which application we want to create but I can not describe it yet because we are not sure about publishing the application. Our application should run on Smartphones with Android 4.0.4 or higher (just the speech recognition does not need such a high api level) and on Smart Glasses aswell. For this reason my university ordered a device called Vuzix M100. I am going to make an extra post about the impressions I got using this device.

Motivation

Imagine this scenario:
You are leaving the grovery store, having your pretty cool Smart Glasses on. Problem is you want to interact with the device but you can not because on each finger you carry a bag full of let's say beer. What to do now? The answer ist continuos speech recognition, meaning a speech recognition service running all the time so you do not have to press any button or touch the device. You simply say "Call my wife" and the Smart Glasses directly conects to the smartphone and call her. Motivated enough?

And now to the actual topic

The implementation we are about to use will contain 3 classes. The VoiceRecognitionListener and the ListeningActivity which implements the interface IVoiceControl. The ListeningActivity includes the main functionalities we will use but we will create our IVoiceControl and the VoiceRecognitionListener first. 

The VoiceRecognitionListener holds a list of IVoiceControl and informs all IVoiceControl that a speech command has been found.
package de.lorisbachert.continousspeechrecognizer;

/**
 * Created by Loris on 26.02.14.
 */
public interface IVoiceControl {
    public abstract void processVoiceCommands(String... voiceCommands); // This will be executed when a voice command was found
    
    public void restartListeningService(); // This will be executed after a voice command was processed to keep the recognition service activated
}
The VoiceRecognitionListener contains the following code:
package de.lorisbachert.continousspeechrecognizer;

import java.util.ArrayList;

import android.os.Bundle;
import android.speech.RecognitionListener;
import android.speech.SpeechRecognizer;

public class VoiceRecognitionListener implements RecognitionListener {
 
 private static VoiceRecognitionListener instance = null;
 
 IVoiceControl listener; // This is your running activity (we will initialize it later)
 
 public static VoiceRecognitionListener getInstance() {
  if (instance == null) {
   instance = new VoiceRecognitionListener();
  }
  return instance;
 }
 
 private VoiceRecognitionListener() { }
 
 public void setListener(IVoiceControl listener) {
        this.listener = listener;
    }
 
    public void processVoiceCommands(String... voiceCommands) {
        listener.processVoiceCommands(voiceCommands);
    }
 
    // This method will be executed when voice commands were found
 public void onResults(Bundle data) {
  ArrayList matches = data.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
  String[] commands = new String[matches.size()];
  for (String command : matches) {
   System.out.println(command);
  }
  commands = matches.toArray(commands);
  processVoiceCommands(commands);
 }
 
 // User starts speaking
 public void onBeginningOfSpeech() {
  System.out.println("Starting to listen");
 }
 
 public void onBufferReceived(byte[] buffer) { }
 
 // User finished speaking
 public void onEndOfSpeech() {
  System.out.println("Waiting for result...");
 }
 
 // If the user said nothing the service will be restarted
 public void onError(int error) {
  if (listener != null) {
   listener.restartListeningService();
  }
 }
 public void onEvent(int eventType, Bundle params) { }
 
 public void onPartialResults(Bundle partialResults) { }
 
 public void onReadyForSpeech(Bundle params) { }
 
 public void onRmsChanged(float rmsdB) { }
}
Now that we implemented the VoiceRecognitionListener we will finish the service by implementing the ListeningActivity:
package de.lorisbachert.continousspeechrecognizer;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.speech.RecognizerIntent;
import android.speech.SpeechRecognizer;
import android.util.Log;
import android.widget.Toast;

public abstract class ListeningActivity extends Activity implements IVoiceControl {

 protected SpeechRecognizer sr;
 protected Context context;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
 }
 
 // starts the service
 protected void startListening() {
  try {
   initSpeech();
   Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
   intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH);
   if (!intent.hasExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE))
      {
    intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,
                  "com.dummy");
      }
   sr.startListening(intent);
  } catch(Exception ex) {
   Log.d("SpeechRecognitionService", "Bei der Initialisierung des SpeechRecognizers ist ein Fehler aufgetreten");
  }
 }
 
 // stops the service
 protected void stopListening() {
  if (sr != null) {
   sr.stopListening();
         sr.cancel();
         sr.destroy();
        }
  sr = null;
 }
 
 protected void initSpeech() {
  if (sr == null) {
   sr = SpeechRecognizer.createSpeechRecognizer(this);
   if (!SpeechRecognizer.isRecognitionAvailable(context)) {
    Toast.makeText(context, "Speech Recognition is not available",
      Toast.LENGTH_LONG).show();
    finish();
   }
   sr.setRecognitionListener(VoiceRecognitionListener.getInstance());
  }
 }
 
 @Override
 public void finish() {
  stopListening();
  super.finish();
 }
 
 @Override
 protected void onStop() {
  stopListening();
  super.onStop();
 }
 
    @Override
 protected void onDestroy() {
     if (sr != null) {
         sr.stopListening();
         sr.cancel();
         sr.destroy();
        }
     super.onDestroy();
    }
    
    @Override
    protected void onPause() {
        if(sr!=null){
            sr.stopListening();
            sr.cancel();
            sr.destroy();              

        }
        sr = null;

        super.onPause();
    }
    
    //is abstract so the inheriting classes need to implement it. Here you put your code which should be executed once a command was found
 @Override
 public abstract void processVoiceCommands(String ... voiceCommands);
    
 @Override
 public void restartListeningService() {
  stopListening();
  startListening();
 }
}

That is all the magic. Now we just add these two permissions in our AndroidManifest.xml: 

<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
To sum everything up I wrote a short example usage:
package de.lorisbachert.continousspeechrecognizer;

import android.graphics.Color;
import android.os.Bundle;
import android.view.Gravity;
import android.widget.LinearLayout;
import android.widget.TextView;

public class MainActivity extends ListeningActivity {

 private LinearLayout content;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  
  content = (LinearLayout)findViewById(R.id.commands);
  
  // The following 3 lines are needed in every onCreate method of a ListeningActivity
  context = getApplicationContext(); // Needs to be set
  VoiceRecognitionListener.getInstance().setListener(this); // Here we set the current listener
  startListening(); // starts listening
 }

 // Here is where the magic happens
 @Override
 public void processVoiceCommands(String... voiceCommands) {
  content.removeAllViews();
  for (String command : voiceCommands) {
   TextView txt = new TextView(getApplicationContext());
   txt.setText(command);
   txt.setTextSize(20);
   txt.setTextColor(Color.BLACK);
   txt.setGravity(Gravity.CENTER);
   content.addView(txt);
  }
  restartListeningService();
 }
}
That is it. Now we can test our little speech recognizer and having fun by using it.
If you have any trouble following my tutorial or any suggestions please let me know in the comments :)

You can download a demo project which can be executed using this link.