1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Phone Service: Logs auslesen und in eine Datenbank schreiben

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von sem_thesis, 26.03.2011.

  1. sem_thesis, 26.03.2011 #1
    sem_thesis

    sem_thesis Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    111
    Erhaltene Danke:
    0
    Registriert seit:
    06.03.2011
    Phone:
    Nexus One
    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?
     
  2. sem_thesis, 26.03.2011 #2
    sem_thesis

    sem_thesis Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    111
    Erhaltene Danke:
    0
    Registriert seit:
    06.03.2011
    Phone:
    Nexus One
    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?
     
  3. FelixL, 27.03.2011 #3
    FelixL

    FelixL Ehrenmitglied

    Beiträge:
    4,855
    Erhaltene Danke:
    754
    Registriert seit:
    26.11.2009
    Phone:
    Wileyfox Swift, HTC One M8
    Na Daten abrufen, auseinander nehmen, loggen.

    Was erwartest du als Antwort bei der Frage?
     
  4. sem_thesis, 27.03.2011 #4
    sem_thesis

    sem_thesis Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    111
    Erhaltene Danke:
    0
    Registriert seit:
    06.03.2011
    Phone:
    Nexus One
    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:

    Zuletzt bearbeitet: 27.03.2011
  5. sem_thesis, 27.03.2011 #5
    sem_thesis

    sem_thesis Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    111
    Erhaltene Danke:
    0
    Registriert seit:
    06.03.2011
    Phone:
    Nexus One
    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:
     

Diese Seite empfehlen