| |||||||
Das Thema "Aktuelle CallLogs ausgeben" befindet sich unter Android App Entwicklung auf Android-Hilfe.de.
|
| | Themen-Optionen | Ansicht |
| | #1 (permalink) |
| Android-Hilfe.de Mitglied Modell: Nexus One Registriert seit: 06.03.2011
Beiträge: 111
Abgegebene Danke: 14
Erhielt 0 Danke für 0 Beiträge
| Ich arbeite noch immer an meinem CallLog-Service, der aktiviert wird, sobald der Telefon-Zustand (Variable PHONE_STATE) verändert wird. Dazu habe ich die folgende Listener-Klasse implementiert: Code: //////// Private Class MyPhoneStateListener /////////
private class MyPhoneStateListener extends PhoneStateListener {
// This method is a Listener on the Phone State: Whenever it changes --> a new query is made to Call Logs
public void onCallStateChanged(int state, String incomingNumber){
Log.d(TAG, "STATE HAS CHANGED!");
// Register New Phone Logs
switch(state){
case TelephonyManager.CALL_STATE_IDLE:
Log.d(TAG, "Phone is in idle state.");
CollectAndSaveLogs();
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
Log.d(TAG, "Phone-User has initiated/accepted a call");
break;
case TelephonyManager.CALL_STATE_RINGING:
Log.d(TAG, "Phone-User has received a call");
break;
}
}
}
public void CollectAndSaveLogs() {
// Declare all values, which need to be logged
String date = new String();
String time = new String();
String name = new String();
String phonenumber = new String();
String duration = new String();
String callclassification = new String();
String d = new String();
// Collect new Phone Logs //
Cursor c = getContentResolver().query(
android.provider.CallLog.Calls.CONTENT_URI,
null,
null,
null,
null);
c.moveToFirst();
date = formatDate.format(new Date());
time = formatTime.format(new Date());
name = c.getString(c.getColumnIndex(CallLog.Calls.CACHED_NAME));
phonenumber = c.getString(c.getColumnIndex(CallLog.Calls.NUMBER));
d = c.getString(c.getColumnIndex(CallLog.Calls.DURATION));
duration = formatDuration(d);
callclassification = c.getString(c.getColumnIndex(CallLog.Calls.TYPE));
Log.d(TAG, date);
Log.d(TAG, time);
Log.d(TAG, name);
Log.d(TAG, phonenumber);
Log.d(TAG, duration);
Log.d(TAG, callclassification);
c.close();
// Write new Phone Logs in Database //
db.open();
db.insertCallLogs(date, time, name, phonenumber, duration, callclassification);
db.close();
} Beim Testen habe ich jedoch gemerkt, dass einfach der erste Call (name, nummer, calltype) gespeichert wird. Der Listener wird immer wieder aufgerufen, doch die Logs geben immer noch die alten Werte an. Was soll das? Muss ich den cursor weiterbewegen mit moveToNext()? Oder muss ich eine andere Sortiermethode für den Cursor wählen (ASC und DESC - hab's probiert, aber es hat trotzdem nicht funktioniert). PS: Code ist im Attachment Geändert von sem_thesis (07.04.2011 um 16:40 Uhr) |
| | |
| | #2 (permalink) | |
| Android Experte Registriert seit: 24.01.2011
Beiträge: 637
Abgegebene Danke: 5
Erhielt 572 Danke für 228 Beiträge
| Zitat:
| |
| | |
| | #3 (permalink) |
| Android-Hilfe.de Mitglied Modell: Nexus One Registriert seit: 06.03.2011
Beiträge: 111
Abgegebene Danke: 14
Erhielt 0 Danke für 0 Beiträge
|
Ok, guter Ansatz. Hab's mit dem Thread versucht. Code: switch(state){
case TelephonyManager.CALL_STATE_IDLE:
Log.d(TAG, "Phone is in idle state.");
try {
Thread.sleep(5000);
CollectAndSaveLogs();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
Log.d(TAG, "Phone-User has initiated/accepted a call");
break;
case TelephonyManager.CALL_STATE_RINGING:
Log.d(TAG, "Phone-User has received a call");
break;
} Geändert von sem_thesis (07.04.2011 um 20:18 Uhr) |
| | |
| | #4 (permalink) | |
| Android Experte Registriert seit: 24.01.2011
Beiträge: 637
Abgegebene Danke: 5
Erhielt 572 Danke für 228 Beiträge
| Zitat:
Stichworte (du willst ja für deine Semesterarbeit auch noch was lernen ) sind AlarmManager und PendingIntent. Die eigentliche Arbeit (Datenbankabfrage, Eintragen der Daten in deine Datenbank) solltest du ohnehin mit einem (Intent-)Service abhandeln (in einem Receiver sollte man nix tun, was lange dauert), und diesen Service kannst du dann über den Intent aufrufen.
| |
| | |
| | #5 (permalink) |
| Android-Hilfe.de Mitglied Modell: Nexus One Registriert seit: 06.03.2011
Beiträge: 111
Abgegebene Danke: 14
Erhielt 0 Danke für 0 Beiträge
|
Hmm... ok ich hatte schon einen BroadcastReceiver, der den Sercice aktiviert, falls der User das so gewünscht hat. Dann muss ich also einen zweiten Receiver einabauen? Ok, ich hab's jetzt so gemacht: 1) ServiceEnabler.java: Die Klasse, die den Service aktiviert, falls dies vom User so gewünscht ist. Code: public class ServiceEnabler extends BroadcastReceiver {
private static final String TAG = ServiceEnabler.class.getSimpleName();
boolean prefPhone = true;
@Override
public void onReceive(Context context, Intent intent)
{
if (prefPhone) {
Log.d(TAG, "Service is activated!");
Intent p = new Intent();
p.setAction("com.example.mylog.PhoneServiceReceiver");
context.startService(p);
}
}
} Code: public class PhoneServiceReceiver extends Service {
// Log-Tag for debugging
private static final String TAG = PhoneService.class.getSimpleName();
// Create Telephony + Listener variables
public TelephonyManager telephony;
public MyPhoneServiceListener phoneListener;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
// Put a Listener on the Phone-State
telephony = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
phoneListener = new MyPhoneServiceListener();
telephony.listen(phoneListener,PhoneStateListener.LISTEN_CALL_STATE);
}
private class MyPhoneServiceListener extends PhoneStateListener {
// This method is a Listener on the Phone State: Whenever it changes --> a new query is made to Call Logs
public void onCallStateChanged(int state, String incomingNumber) {
Log.d(TAG, "STATE HAS CHANGED!");
// Register New Phone Logs
switch(state){
case TelephonyManager.CALL_STATE_IDLE:
Log.d(TAG, "Phone is in idle state.");
// Hier comes the actual Service-Functionality
Intent pService = new Intent();
pService.setAction("com.example.mylog.PhoneService");
int sleep = 5000; // Waiting time before Log-database is accessed
int flags = 0;
PendingIntent piSync = PendingIntent.getService(getBaseContext(), 0, pService, flags);
Log.i(TAG, "schedulePendingSync: " + piSync.toString());
AlarmManager alarm = (AlarmManager) getBaseContext().getSystemService(Activity.ALARM_SERVICE);
alarm.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + sleep, piSync);
// Endof Service-Functionality
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
Log.d(TAG, "Phone-User has initiated/accepted a call");
break;
case TelephonyManager.CALL_STATE_RINGING:
Log.d(TAG, "Phone-User has received a call");
break;
}
}
}
} Code: public class PhoneService extends Service {
private static final String TAG = PhoneService.class.getSimpleName();
public DBAdapter db;
// Specify formatting of data and time --> looks awesome :D
SimpleDateFormat formatDate = new SimpleDateFormat("dd-MM-yyyy");
SimpleDateFormat formatTime = new SimpleDateFormat("HH:mm:ss");
// Specify formatting for duration --> looks even more awesome :D
public String formatDuration(String input) {
long seconds = Long.parseLong(input);
StringBuffer buf = new StringBuffer();
Log.d(TAG, input);
int h = (int) Math.floor(seconds / 3600);
int m = (int) Math.floor((seconds - h * 3600) / 60);
int s = (int) seconds - h - m;
buf
.append(String.format("%02d", h))
.append(":")
.append(String.format("%02d", m))
.append(":")
.append(String.format("%02d", s));
return buf.toString();
}
// Specify interpretation of Calltype
public String callType(int t) {
if (t == 0) return "Outgoing Call";
else if (t == 1) return "Incoming Call";
else if (t == 2) return "Missed Call";
return null;
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
// Create Database
db = new DBAdapter(getApplicationContext());
// Declare all values, which need to be logged
String date = new String();
String time = new String();
String name = new String();
String phonenumber = new String();
String duration = new String();
String callclassification = new String();
String d = new String();
int e;
// Collect new Phone Logs //
Cursor c = getContentResolver().query(
android.provider.CallLog.Calls.CONTENT_URI,
null,
null,
null,
android.provider.CallLog.Calls.DATE + " ASC");
c.moveToFirst();
date = formatDate.format(new Date());
time = formatTime.format(new Date());
name = c.getString(c.getColumnIndex(CallLog.Calls.CACHED_NAME));
phonenumber = c.getString(c.getColumnIndex(CallLog.Calls.NUMBER));
d = c.getString(c.getColumnIndex(CallLog.Calls.DURATION));
duration = formatDuration(d);
e = c.getColumnIndex(CallLog.Calls.TYPE);
callclassification = callType(e);
Log.d(TAG, date);
Log.d(TAG, time);
Log.d(TAG, name);
Log.d(TAG, phonenumber);
Log.d(TAG, duration);
Log.d(TAG, callclassification);
c.close();
// Write new Phone Logs in Database //
db.open();
db.insertCallLogs(date, time, name, phonenumber, duration, callclassification);
db.close();
}
} Wo liegt der konzeptienelle Fehler? PS: Im AndroidManifest.xml habe ich PhoneServiceReceiver und PhoneService als Services und ServiceEnabler als Receiver eingetragen. Muss ich sonst was eintragen? Geändert von sem_thesis (08.04.2011 um 14:19 Uhr) |
| | |
| | #6 (permalink) | |||
| Android Experte Registriert seit: 24.01.2011
Beiträge: 637
Abgegebene Danke: 5
Erhielt 572 Danke für 228 Beiträge
| Zitat:
Zitat:
Code: Intent pService = new Intent(context, PhoneService.class); Zitat:
| |||
| | |
| | #7 (permalink) | |
| Android-Hilfe.de Mitglied Modell: Nexus One Registriert seit: 06.03.2011
Beiträge: 111
Abgegebene Danke: 14
Erhielt 0 Danke für 0 Beiträge
|
Jetzt habe ich die folgende Fehlermeldung bekommen Zitat:
Es werden immer noch die alte Nummer/Name/Dauer im Log angezeigt. Geändert von sem_thesis (08.04.2011 um 16:44 Uhr) | |
| | |
| | #8 (permalink) | |
| Android-Hilfe.de Mitglied Modell: Nexus One Registriert seit: 06.03.2011
Beiträge: 111
Abgegebene Danke: 14
Erhielt 0 Danke für 0 Beiträge
| Zitat:
Das Manifest-File sieht bei mir so aus: Code: ......
<!-- Service Declaration Area -->
<service android:name ="com.example.mylog.PhoneServiceReceiver">
<intent-filter>
<action android:name="com.example.mylog.PhoneServiceReceiver">
</action>
</intent-filter>
</service>
<service android:name ="com.example.mylog.PhoneService">
<intent-filter>
<action android:name="com.example.mylog.PhoneService">
</action>
</intent-filter>
</service>
<!-- Receiver Declaration Area -->
<receiver android:name=".ServiceEnabler">
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE"/>
</intent-filter>
</receiver>
</application> | |
| | |
| | #9 (permalink) |
| Android-Hilfe.de Mitglied Modell: Nexus One Registriert seit: 06.03.2011
Beiträge: 111
Abgegebene Danke: 14
Erhielt 0 Danke für 0 Beiträge
|
Hello again! Ich hab' einen ganz dummen Fehler im Code entdeckt, aus dem ich nicht schlau werden: Code: // Specify interpretation of Call-Type
public String callType(String t) {
String g = null;
if (t == "1") g = "Incoming Call";
if (t == "2") g = "Outgoing Call";
if (t == "3") g = "Missed Call";
return g;
}
public onStartCommand(Intent intent, int flags, int startId) {
// Collect new Phone Logs //
Cursor c = getContentResolver().query(
android.provider.CallLog.Calls.CONTENT_URI,
null,
null,
null,
android.provider.CallLog.Calls.DATE+ " DESC");
c.moveToFirst();
String t = c.getString(c.getColumnIndex(CallLog.Calls.TYPE));
String callclassification = callType(t);
// Log new Phone Logs
Log.d(TAG, callclassification);
return startId;
} Der Log wird nicht ausgeführt - was ist an der convertType Funktion falsch gelaufen? Referenz: http://developer.android.com/referen...Log.Calls.html Geändert von sem_thesis (09.04.2011 um 13:32 Uhr) |
| | |
| | #10 (permalink) |
| Android-Hilfe.de Mitglied Modell: Nexus One Registriert seit: 06.03.2011
Beiträge: 111
Abgegebene Danke: 14
Erhielt 0 Danke für 0 Beiträge
|
Ok, habe das Problem selber gelöst (ist ja eine Semesterarbeit, also muss ich ja selber auch was tun ![]() string == string vergleicht anscheinend Objekte, aber keine String. Ich habe die Funktion convertType folgendermassen umgeschrieben: Code: // Specify interpretation of Call-Type
public String callType(String t) {
String g = null;
if ("1".equals(t)) g = "Incoming Call";
else if ("2".equals(t)) g = "Outgoing Call";
else if ("3".equals(t)) g = "Missed Call";
return g;
} |
| | |
![]() |
|
| Themen-Optionen | |
| Ansicht | |
| |
| ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| tv per 3,5 mm klinke ausgeben? | Ratman | Samsung Galaxy Tab Forum | 15 | 07.11.2011 13:11 |
| Text ausgeben | themerx | Android App Entwicklung | 3 | 04.03.2011 12:19 |
| 2.2 als 2.1 ausgeben | abbot | Samsung Galaxy 3 (I5800) Forum | 20 | 13.12.2010 11:23 |
| nur toasti ausgeben | Sico | Android App Entwicklung | 5 | 22.05.2010 15:17 |
| Bookmarks ausgeben | SeraphimSerapis | Android App Entwicklung | 0 | 24.11.2009 15:32 |