Phone Service: Logs auslesen und in eine Datenbank schreiben

S

sem_thesis

Fortgeschrittenes Mitglied
0
Hallo zusammen! :biggrin:


Bin heute mit einem neuen Service beschäftigt: PhoneLogs zusammen mit Name, Nummer, Datum, Klassifizierung: Incoming/Outgoing lesen und in eine Datenbank schreiben :)


Ok, jetzt Schritt für Schritt:
Mein Service soll folgendermassen aufgebaut sein:

1) Aktivierung: Service wird aktiviert, sobald der CallState ändert

Code:
package com.example.mylog;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.telephony.TelephonyManager;


public class PhoneServiceReceiver extends BroadcastReceiver {
    
    
    @Override
    public void onReceive(Context context, Intent intent) 
    {
        if (intent.getAction().equals(Intent.ACTION_PHONE_STATE_CHANGED)) {
        
            SharedPreferences  prefPhone;
            prefPhone = PreferenceManager.getDefaultSharedPreferences(context);
        
            if (prefPhone.getBoolean("checkboxPhone", false)) {
                Intent p = new Intent();
                p.setAction("com.example.mylog.PhoneService");
                context.startService(p);
            }
        
        }
        
    }
    
}

Hier kommt schon der erste Fehler: "ACTION_PHONE_STATE_CHANGED" wird nicht akzeptiert.
Was soll das?
Fehlt ein Permission-Tag im AndroidManifest.xml File?
 
Ok, nach einer umfangreichen Suche, habe ich die Anweisungen auf der folgenden Seite befolgt:
Tutorial For Android: Get Phone State When Someone is calling using BroadcastReceiver Example


1) Die Receiver-Aktivierung ist bei mir recht banal geworden

AndroidManifest.xml
Code:
   <application>
        <receiver android:name="PhoneServiceReceiver">
            <intent-filter>
                <action android:name="android.intent.action.PHONE_STATE"/>
            </intent-filter>
        </receiver>
    </application>

    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
PhoneService.java
Code:
package com.example.mylog;


import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;



public class PhoneService extends Service {

    // Create Telephony + Listener variables
    
    public TelephonyManager telephony;
    public MyPhoneStateListener 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 MyPhoneStateListener();
        telephony.listen(phoneListener,PhoneStateListener.LISTEN_CALL_STATE);
    
    }


    //////// Private Class MyPhoneStateListener /////////
    
    private class MyPhoneStateListener extends PhoneStateListener {
        
          public void onCallStateChanged(int state,String incomingNumber){
              switch(state){
                  case TelephonyManager.CALL_STATE_IDLE:
                      Log.d("DEBUG", "IDLE");
                      break;
                  case TelephonyManager.CALL_STATE_OFFHOOK:
                      Log.d("DEBUG", "OFFHOOK");
                      break;
            case TelephonyManager.CALL_STATE_RINGING:
                    Log.d("DEBUG", "RINGING");
                    break;
              }
          }

    }

    
    
}
So weit, so gut.

Jetzt kommt Schritt 2) Logs auslesen aus der Phone-App und den CollLog API.

Jetzt soll die Listener-Klasse noch etwas anderes machen, als einfach zu loggen. Ich will nämlich die folgende Werte extrahieren:

1) Datum: Tag/Monat/Jahr
2) Zeit
3) Name des Anrufers/Empfängers
4) Telefonnummer
5) Klassifizierung: Incoming/Outgoing


Wie muss ich da vorgehen?
 
Na Daten abrufen, auseinander nehmen, loggen.

Was erwartest du als Antwort bei der Frage?
 
Ok, ich habe die MyPhoneListener-Klasse folgendermassen implementiert:

Code:
    //////// Private Class MyPhoneStateListener /////////
    
    private class MyPhoneStateListener extends PhoneStateListener {
        
        Calendar calendar = new GregorianCalendar();
        int i = calendar.get(Calendar.MONTH) + 1;
        
        String date = calendar.get(Calendar.DATE) + "." + i + "." + calendar.get(Calendar.YEAR);
        String time = calendar.get(Calendar.HOUR) + ":" + calendar.get(Calendar.MINUTE) + ":" + calendar.get(Calendar.SECOND);

          String name;
          String phonenumber;
          String duration;
          String callclassification;
          
          public void onCallStateChanged(int state,String incomingNumber){
              
              name = android.provider.CallLog.Calls.CACHED_NAME;
              phonenumber = android.provider.CallLog.Calls.NUMBER;
              duration = android.provider.CallLog.Calls.DURATION;
              
                  Log.d(TAG, "STATE HAS CHANGED!");

              
              switch(state){
                  case TelephonyManager.CALL_STATE_IDLE:
                      Log.d(TAG, "---booooooo-----");
                      break;
                  case TelephonyManager.CALL_STATE_OFFHOOK:
                      callclassification = "Outgoing Call";
                      Log.d(TAG, "Calling somebody");
                      Log.d(TAG, date);
                      Log.d(TAG, time);
                      break;
            case TelephonyManager.CALL_STATE_RINGING:
                    Log.d(TAG, "RINGING");
                      Log.d(TAG, date);
                      Log.d(TAG, time);
                      callclassification = "Incoming Call";
                    break;
              }
          }

    }
Ich habe den Code jetzt mit herumtelefonieren getestet.
Jetzt bin ich auf die folgenden Probleme gestossen:
1) Aus einem mir unerklärlichen Grund wird der Monat Februar angezeigt. Deshalb habe ich für den Moment mit einer + 1 Addition den Fehler vertuscht. Woher kommt der Fehler?
2) Das Zeitformat, das anzeigt wird, gefällt mir überhaupt nicht: Anstatt '2:8:25' möchte ich so etwas wie '14:08:25'. Wie kann ich das formattieren?
3) Ich habe auch versuche die Variablen 'name' und 'phonenumber' zu loggen. Doch das Resultat war einfach 'name' resp. 'phonenumber'. Was läuft da schief??


PS: Aktueller Sourcecode is wieder angehängt.
PS2: Habe die folgenden API's zu Hilfe gezogen: http://developer.android.com/reference/android/provider/CallLog.Calls.html und http://developer.android.com/reference/java/util/GregorianCalendar.html
 

Anhänge

  • MyCallLog.zip
    66,7 KB · Aufrufe: 88
Zuletzt bearbeitet:
Ok, schliesslich kommt Schritt 3) Call Logs in eine Datenbank schreiben


Dazu habe ich die Klasse DBAdapter.java erstellt.

Code:
package com.example.mylog;




import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DBAdapter {

    public static final String KEY_ROWID = "_id";

       public static final String KEY_DATE = "Date";
       public static final String KEY_TIME = "Time";
       public static final String KEY_NAME = "Name";
       public static final String KEY_PHONENUMBER = "Phonenumber";
       public static final String KEY_DURATION = "Duration";
       public static final String KEY_CALLCLASSIFICATION = "Call Classification";
       private static final String TAG = "DBAdapter";
       
       private static final String DATABASE_NAME = "userdata";
       private static final String DATABASE_TABLE = "PhoneLogs";
       private static final int DATABASE_VERSION = 2;

       private static final String DATABASE_CREATE =
           "create table PhoneLogs);";
       
       
           
           
           
       private final Context context;  

       private DatabaseHelper DBHelper;
       private SQLiteDatabase db;

       public DBAdapter(Context ctx) 
       {
           this.context = ctx;
           DBHelper = new DatabaseHelper(context);
       }
           
       private static class DatabaseHelper extends SQLiteOpenHelper 
       {
           DatabaseHelper(Context context) 
           {
               super(context, DATABASE_NAME, null, DATABASE_VERSION);
           }

           @Override
           public void onCreate(SQLiteDatabase db) 
           {
               db.execSQL(DATABASE_CREATE);
           }

           @Override
           public void onUpgrade(SQLiteDatabase db, int oldVersion, 
                                 int newVersion) 
           {
               Log.w(TAG, "Upgrading database from version " + oldVersion 
                     + " to "
                     + newVersion + ", which will destroy all old data");
               db.execSQL("DROP TABLE IF EXISTS titles");
               onCreate(db);
           }
       }    

       //---opens the database---
       public DBAdapter open() throws SQLException 
       {
           db = DBHelper.getWritableDatabase();
           return this;
       }

       //---closes the database---    
       public void close() 
       {
           DBHelper.close();
       }
       
       //---insert a new call log into the database---
       public long insertCallLogs(String date, String time, String name, String number, String duration, String classification) 
       {
           ContentValues initialValues = new ContentValues();
           initialValues.put(KEY_DATE, date);
           initialValues.put(KEY_TIME, time);
           initialValues.put(KEY_NAME, name);
           initialValues.put(KEY_PHONENUMBER, number);
           initialValues.put(KEY_DURATION, duration);
           initialValues.put(KEY_CALLCLASSIFICATION, classification);           
           
           return db.insert(DATABASE_TABLE, null, initialValues);
       }
       

       //---retrieves all the LOGS---
       public Cursor getAllLocations() 
       {
           return db.query(DATABASE_TABLE, new String[] {
                 KEY_ROWID,
                 KEY_DATE,
                 KEY_TIME,
                 KEY_NAME,
                 KEY_PHONENUMBER,
                 KEY_DURATION,
                 KEY_CALLCLASSIFICATION
                   }, 
                   null, 
                   null, 
                   null, 
                   null, 
                   null,
                   null);
       }
       


       
       
}



Und jetzt schreibe ich in der Klasse MyPhoneListener.java Logs in die Datenbank hinein.
Das sind nur noch 3 Zeilen:

Code:
public DBAdapter db;

// Write new Phone Logs in Database //
              
db.open();
db.insertCallLogs(date, time, name, phonenumber, duration, callclassification);


Kann jetzt nicht überprüfen ob alles richtig ist, da die MyPhoneListener-Klasse nicht fertig ist.

Falls jemand einen Fehler findet, bitte sagen :blink:
 

Ähnliche Themen

H
Antworten
2
Aufrufe
1.307
Hcman
H
S
Antworten
33
Aufrufe
2.655
Sempervivum
S
M
  • MikelKatzengreis
Antworten
5
Aufrufe
116
swa00
swa00
Zurück
Oben Unten