====== Dostęp do danych GPS w Androidzie ====== ===== Ambient Profile ===== Zintegruj program [[https://sbobek@bitbucket.org/sbobek/aml_gpstracker_studio|GPS Tracker]] z projektem GUI [[https://sbobek@bitbucket.org/sbobek/aml_ambientprofile|Ambient Profile]], tak aby: {{:pl:dydaktyka:aml:ambient-profile.png?300 |}} * Pierwszy fragment (**Status**) umożliwiał włączanie i wyłączanie usługi śledzenia. * Drugi fragment (**Profiles**) wyświetlał listę profili jakie użytkownik aktualnie ma. Dodaj przycisk i aktywność (FragmentDialog) umożliwiający dodanie nowego profilu. **Zaprojektuj** klasę reprezentującą profil, przechowującą różne rodzaje profilu (nazwa, co ma się dziać kiedy profil jest aktywny) * Przetestuj działanie aplikacji za pomocą DDMS * **Zadanie dodatkowe** Trzeci fragment (Map) wyświetlać powinien mapę z ikonami profili w obszarach ich aktywacji * **Zadanie dodatkowe** Do detekcji tego czy ktoś pojawił się w obszarze aktywacji danego profilu wykorzystaj //geopłoty// [[http://developer.android.com/training/location/geofencing.html|Geofences]] ===== Baza danych ===== Dodaj do projektu klasy odpowiedzialne za zapisywanie i odczyt profili użytkownika z i do bazy SQLite. Poniżej znajdują się przykłady takich klas do przechowywania danych GPS. **Zmodyfikuj** je tak aby umożliwiały przechowywanie profili zaprojektowanych w poprzednim ćwiczeniu. Przykładowe wykorzystanie klas poniżej: //W onCreate tworzymy uchwyt do źródła danych GPSDataSource datasource = new GPSDataSource(getBaseContext()); datasource.open(); //Gdzieś dalej w kodzie wrzucamy dane do bazy: if(datasource != null){ datasource.createGPSEntry( currentLocation.getLatitude(), currentLocation.getLongitude(), Long.toString(currentTime), refreshFrequency, batteryLevel ); //Zamykamy źródło danych w onStop albo onDestroy datasource.close(); ==== GPS ==== Poniżej klasa reprezentująca rekord danych. public class GPS { private long id; private double lat; private double lon; private String timestamp; private int frequency; private int battery; double getLat() { return lat;} void setLat(double lat) { this.lat = lat; } double getLon() { return lon;} void setLon(double lon) { this.lon = lon;} String getTimestamp() { return timestamp; } void setTimestamp(String timestamp) { this.timestamp = timestamp; } public long getId() { return id; } public void setId(long id) { this.id = id; } public int getBattery() { return battery; } public void setBattery(int battery) { this.battery = battery; } public int getFrequency() { return frequency; } public void setFrequency(int frequency) {this.frequency = frequency; } } ==== DataBaseHelper ==== Poniżej klasa służąca za uchwyt do bazy danych. Tworzy bazę danych i umożliwia operację na tabelach i danych. Jest wykorzystywana przez klasę //GPSDataSource//. import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; public class DataBaseHelper extends SQLiteOpenHelper { public static final String TABLE_GPS = "gps"; public static final String COLUMN_ID = "_id"; public static final String COLUMN_LAT = "lat"; public static final String COLUMN_LON = "lon"; public static final String COLUMN_TIME = "timestamp"; public static final String COLUMN_FREQUENCY = "frequency"; public static final String COLUMN_BATTERY_LEVEL = "battery"; public static final String DATABASE_NAME = "gps.db"; private static final int DATABASE_VERSION = 1; // Database creation sql statement private static final String DATABASE_CREATE = "create table " + TABLE_GPS + "(" + COLUMN_ID + " integer primary key autoincrement, " + COLUMN_LAT + " double not null, " + COLUMN_LON + " double not null, " + COLUMN_TIME + " text not null, " + COLUMN_FREQUENCY + " int not null," + COLUMN_BATTERY_LEVEL + " integer default 0);"; public DataBaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase database) { database.execSQL(DATABASE_CREATE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.w(DataBaseHelper.class.getName(), "Upgrading database from version " + oldVersion + " to " + newVersion + ", which will destroy all old data"); db.execSQL("DROP TABLE IF EXISTS " + TABLE_GPS); onCreate(db); } } ==== GPSDataSource ==== Klasa opakowuje klasę //DataBaseHelper// udostępniając interfejs dedykowany dla operacji na obiektach klasy //GPS//. import java.util.ArrayList; import java.util.List; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; public class GPSDataSource { // Database fields private SQLiteDatabase database; private DataBaseHelper dbHelper; private String[] allColumns = { DataBaseHelper.COLUMN_ID, DataBaseHelper.COLUMN_LAT, DataBaseHelper.COLUMN_LON, DataBaseHelper.COLUMN_TIME, DataBaseHelper.COLUMN_FREQUENCY, DataBaseHelper.COLUMN_BATTERY_LEVEL}; public GPSDataSource(Context context) { dbHelper = new DataBaseHelper(context); } public void open() throws SQLException { database = dbHelper.getWritableDatabase(); } public void close() { dbHelper.close(); } public GPS createGPSEntry(double lat, double lon, String timestamp, int frequency, int battery) { ContentValues values = new ContentValues(); values.put(DataBaseHelper.COLUMN_LAT, lat); values.put(DataBaseHelper.COLUMN_LON, lon); values.put(DataBaseHelper.COLUMN_TIME, timestamp); values.put(DataBaseHelper.COLUMN_LON, lon); values.put(DataBaseHelper.COLUMN_FREQUENCY, frequency); values.put(DataBaseHelper.COLUMN_BATTERY_LEVEL, battery); long insertId = database.insert(DataBaseHelper.TABLE_GPS, null, values); Cursor cursor = database.query(DataBaseHelper.TABLE_GPS, allColumns, DataBaseHelper.COLUMN_ID + " = " + insertId, null, null, null, null); cursor.moveToFirst(); GPS newGPS = cursorToGPS(cursor); cursor.close(); return newGPS; } public void deleteGPS(GPS gps) { long id = gps.getId(); database.delete(DataBaseHelper.TABLE_GPS, DataBaseHelper.COLUMN_ID + " = " + id, null); } public List getAllGPS() { List gpses = new ArrayList(); Cursor cursor = database.query(DataBaseHelper.TABLE_GPS, allColumns, null, null, null, null, null); if(cursor.moveToFirst()){ while (!cursor.isAfterLast()) { GPS gps = cursorToGPS(cursor); gpses.add(gps); cursor.moveToNext(); } } // Make sure to close the cursor cursor.close(); return gpses; } private GPS cursorToGPS(Cursor cursor) { GPS gps = null; if (cursor != null) { gps = new GPS(); gps.setId(cursor.getLong(0)); gps.setLat(cursor.getDouble(cursor.getColumnIndex(DataBaseHelper.COLUMN_LAT))); gps.setLon(cursor.getDouble(cursor.getColumnIndex(DataBaseHelper.COLUMN_LON))); gps.setTimestamp(cursor.getString(cursor.getColumnIndex(DataBaseHelper.COLUMN_TIME))); gps.setFrequency(cursor.getInt(cursor.getColumnIndex(DataBaseHelper.COLUMN_FREQUENCY))); gps.setBattery(cursor.getInt(cursor.getColumnIndex(DataBaseHelper.COLUMN_BATTERY_LEVEL))); } return gps; } }