1. Nimm jetzt an unserem Geotel Note - Gewinnspiel teil - Informationen zum Note findest Du hier!
  1. sem_thesis, 26.03.2011 #1
    sem_thesis

    sem_thesis Threadstarter Android-Hilfe.de Mitglied

    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

    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

    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

    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

    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:
     
Die Seite wird geladen...
Ähnliche Themen - Phone Service Logs Forum Datum
Kommunikation zwischen 2 Smartphones herstellen Android App Entwicklung 07.01.2017
Wenn Smartphone als Device ausgewählt - ClassNotFound Exception Android App Entwicklung 14.07.2016
Dialoge werden auf Smartphone nur gestaucht angezeigt. Android App Entwicklung 12.07.2016
[OFFEN] Service wird bei manchen Geräten nicht gestartet Android App Entwicklung 09.04.2017
Google Play Services Fehler Android App Entwicklung 19.12.2016
Location abfrage in einem Service Android App Entwicklung 13.07.2016

Besucher kamen mit folgenden Begriffen auf unsere Seite:

  1. callLog plug in Service

    ,
  2. call log provider android