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
ActivityMain.java
ClassReceiver.java
ClassSpeak.java
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);
}
}