onReceive - TextToSpeech Init

  • 0 Antworten
  • Letztes Antwortdatum
S

SchauerM24

Gast
Hallo,

wollte es einem Freund nachmachen und auch mal eine Android - App entwickeln.

Besonders gut gefällt mir "Sprechender Klingelton", aus diesem Grund wollte ich eine ähnliche App entwickeln:

Das Programm funktioniert, wenn als erstes die Anwendung gestartet wird.
Wenn ich das Programm beende und dann anrufe, gibt es einen Fehler, da direkt die Klasse "ClassReceiver" aufgerufen wird und dort keine Initialisierung der Klasse "ClassSpeak" erfolgt.

Die Initialisierung der Klasse "ClassSpeak" direkt in "onReceive" einzubauen wäre möglich, leider ist es aber so, das die init - Dauer dieser Klasse sehr lang ist.

Gibt es eine Möglichkeit die TextToSpeech - Ausgabe schneller anzusteuern?

Hier meine Dateien:

AndroidManifest.xml
Code:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="de.schauer.finca"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="15" />
    
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.READ_CONTACTS"/>
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" 
        >
        <activity
            android:name=".ActivityMain"
            android:label="@string/title_activity_activity_main"
             >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver android:name=".ClassReceiver">
                <intent-filter>
                        <action android:name="android.intent.action.PHONE_STATE" />
                </intent-filter>
        </receiver>
    </application>

</manifest>

ActivityMain.java
Code:
package de.schauer.finca;

import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;

public class ActivityMain extends Activity {
    public static ClassSpeak classSpeak;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        Log.d("Activity","onCreate");
        classSpeak = new ClassSpeak(this);
        
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
    
    @Override
    protected void onDestroy() {
        Log.d("Activity","onDestroy");
        classSpeak.fDestroy();
        
        // TODO Auto-generated method stub
        super.onDestroy();
    }
}

ClassReceiver.java
Code:
package de.schauer.finca;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.media.AudioManager;
import android.provider.ContactsContract;
import android.speech.tts.TextToSpeech.OnInitListener;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.widget.Toast;

public class ClassReceiver extends BroadcastReceiver {
    
    @Override
    public void onReceive(Context context, Intent intent) {
        try {        
            Log.d("OnReceiver","true");
            
            AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
            am.setRingerMode(AudioManager.RINGER_MODE_SILENT);
            Log.d("RingerMode","Silent");
            
            String message="";
            
            // KLINGELT DAS TELEFON 
            if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_RINGING)) {
                Log.d("TelephoneState","Ringing");
                
                
                // NUMMER AUSLESEN
                String number = intent.getExtras().getString(TelephonyManager.EXTRA_INCOMING_NUMBER);     
                                
                // NICHT UNTERDRUCKT
                if(number != null)    {            
                    Log.d("IncomingNumber",number);
                    
                    // TELEFONBUCH DURCHSUCHEN
                    Cursor cursor = context.getContentResolver().query(ContactsContract.Data.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.NUMBER +" = '"+  number +"'", null, null);
                    
                    // GIBT ES TREFFER
                    if(cursor.getCount() >= 1) {
                        Log.d("TelephoneNumber","Found(" + String.valueOf(cursor.getCount()) + ")");
                        
                        if(cursor.getCount() > 1) {
                            message = "Mehrere Kontakte gefunden. ";
                        }
                        
                        // LESE NACHEINANDER
                        while (cursor.moveToNext()) {
                            
                            // KONTAKT - ID
                            String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Data.CONTACT_ID));
                            Log.d("ContactId", contactId);
                            
                            // KONTAKT - NAME
                            String displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                            Log.d("DisplayName",displayName);
                            
                            message += displayName;
                            
                            // LIEST TELEFONNNUMMERN AUS
                            Cursor phones = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ contactId, null, null);                    
                            while (phones.moveToNext()) {
                                
                                // TELEEFONNUMMER
                                String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                                Log.d("phoneNumber", phoneNumber);
                                
                                // TYP VON TELEFONNUMMER
                                try {
                                    
                                } catch (Exception e) {
                                    // TODO: handle exception
                                }
                                
                                int type = phones.getInt(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
                                String customLabel = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.LABEL));
                                CharSequence phoneType = ContactsContract.CommonDataKinds.Phone.getTypeLabel(context.getResources(), type, customLabel);
                                
                                Log.d("Type", String.valueOf(phoneType));
                                
                            } 
                            phones.close();            
                            
                            /*
                            // LIEST EMAILS AUS
                            Cursor emails = context.getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = " + contactId, null, null); 
                            while (emails.moveToNext()) {  
                                String emailAddress = emails.getString(emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); 
                                Log.d("Email", emailAddress);
                            } 
                            emails.close();
                            //*/
                        }
                        cursor.close();
                    } else {
                        Log.d("TelephoneNumber","NotFound");
                        
                        message += fNumber(number);        
                    }
                }    else {
                    Log.d("IncomingNumber","Unknown");
                    message +="Unbekannt";                
                }
                
                ActivityMain.classSpeak.fSpeak(message + " ruft an");
            } else {
                Log.d("TelephoneState","Idle");
            }
            
        } catch (Exception e) {
            Toast a = Toast.makeText(context, e.getMessage(), 50000);
            a.show();
        }

    }
    
    public static String fNumber(String number) {
        StringBuffer sb = new StringBuffer(number);
        
        for (int i = sb.length() - 1; i >= 0; i--) {
            if (sb.charAt(i) != ' ') {
                sb.insert(i, ' ');
            }
        }
        
        return sb.toString();
    }
}

ClassSpeak.java
Code:
package de.schauer.finca;

import android.content.Context;
import android.speech.tts.TextToSpeech;
import android.util.Log;
import java.util.Locale;

public class ClassSpeak implements TextToSpeech.OnInitListener {
    
    private TextToSpeech tts;
        
    public ClassSpeak(Context context) {
        tts = new TextToSpeech(context,this);
    }
    
    public void onInit(int state) {
        if (state == TextToSpeech.SUCCESS) {
            int result = tts.setLanguage(Locale.GERMANY);
    
            if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) {
                Log.e("LangError", "true");
            } else {
                Log.e("LangError", "false");
            }
        } else {
            Log.e("LangErrorInit", "true");
        }
    }
    
    @Override
    protected void finalize() throws Throwable {
        super.finalize();
    }
    
    public void fDestroy() {
        if (tts != null) {
            tts.stop();
            tts.shutdown();
            Log.d("LangDest","true");
            }
        }
        
        public void fSpeak(String text) {        
            tts.speak(text,TextToSpeech.QUEUE_FLUSH,null);
        }
    }
 
Zurück
Oben Unten