F10: Sensors! Og litt DB
Android, sensors, SQLite DB
Google Maps!

https://developers.google.com/maps/documentation/android-api/
En del features
- Markers
- GPS location
- Kart!

MapsActivity

- Finds the Map fragment
- Loads the map
- Creates a LatLng object
- Adds a Marker
(MarkerOptions)
- Moves the camera (CameraUpdateFactory)
ConstraintLayout!
https://events.google.com/io2016/

https://codelabs.developers.google.com/codelabs/constraint-layout/index.html#0
Sensorer
SQLite DB
X-platform!
Sensorer!
https://d.android.com/guide/topics/sensors/sensors_overview.html

https://www.element14.com/community/servlet/JiveServlet/showImage/2-99301-190768/GrovePi-Grove+for+the+Raspberry+Pi+-+Grove+Sensors+(5).JPG
Vi bruker allerede en: GPS!
- "Unikt" for apps
- Lar deg se brukerens lokasjon (innenfor en viss radius)
- Special treatment: krever ikke hardware (COARSE)
… men husk å sjekke permission

Sensorer…
- Kommer i flere varianter
- Accelerometer
- Ambient temperature
- Light
- Proximity
- Alle finnes ikke på alle devices!
- Eller API-er!
Sensor-rammeverket
- SensorManager
- Aksesser sensorer
- Registrer lyttere
- Sensor
- Få tak i en bestemt sensor for evaluering
- Få tak i en bestemt sensor for evaluering
- SensorEvent
- Data, generator (sensor), presisjon, tid
- Data, generator (sensor), presisjon, tid
- SensorEventListener
- Duh
Runtime sensor detection
private SensorManager mSensorManager;
// ...
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
if (mSensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE) != null){
// Success! There's a pressure sensor.
} else {
// Failure! No pressure sensor.
}https://d.android.com/guide/topics/sensors/sensors_overview.html
Sensor events
public class SensorActivity extends Activity implements SensorEventListener {
private SensorManager mSensorManager;
private Sensor mLight;
@Override
public void onCreate(Bundle state) {
// ...
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mLight = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
@Override
public void onSensorChanged(SensorEvent e) {
// access e.values, float array
}
}Hva gjør en sensor?
Sensor listeners
public class SensorActivity extends Activity implements SensorEventListener {
private SensorManager mSensorManager;
private Sensor mLight;
// ...
@Override
protected void onResume() {
super.onResume();
mSensorManager.registerListener(this, mLight, SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
protected void onPause() {
super.onPause();
mSensorManager.unregisterListener(this);
}
}Filtrer ut app i Play
<uses-feature android:name="android.hardware.sensor.accelerometer"
android:required="true" />Hvis appen er helt avhengig av en sensor
List alle sensorer uansett, men med android:required="false"
Eksempel
(Pass opp for AndroidAnnotations)
NFC
https://developer.android.com/guide/topics/connectivity/nfc/nfc.html
- Near Field Communication
- En liten mikrokontroller
- Sender ut en ID og/eller payload
- To viktige use cases
- Les data (fra en device eller tag)
- Skriv ("beam") data til en annen device
NFC access
Begynnelsen på IoT!
- Transport (containers)
- Reisekort
- Inngangskort (sikkerhet)
- Aktiv vs. passiv
- Aktiv = powered av batteri (ranged)
- Passiv = powered av NFC-leseren
Intent filter
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/plain" />
</intent-filter>
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="http"
android:host="developer.android.com"
android:pathPrefix="/index.html" />
</intent-filter>
- Filtrer på mimeType eller noe annet
- Ikke trigg chooser-dialogen hvis mulig
Starter Activity-en med et intent
Tag/NDEF discovery
<intent-filter>
<action android:name="android.nfc.action.TECH_DISCOVERED"/>
<action android:name="android.nfc.action.NDEF_DISCOVERED"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/plain"/>
</intent-filter>- Vær spesifikk
- Alt som trengs til innlevering 2
Tag encoding

https://developer.android.com/guide/topics/connectivity/nfc/nfc.html
Tag vendor


Hent ut data om tag
String action = getIntent().getAction();
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)
|| NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)) {
Tag tag = getIntent().getParcelableExtra(NfcAdapter.EXTRA_TAG);
MifareUltralight ultralight = MifareUltralight.get(tag);
// ...- Connect
- Read(/write)
- Close
ultralight.connect();
byte[] payload = ultralight.readPages(8);
payloadTextView.setText(new String(payload));
NFC Tools
https://play.google.com/store/apps/details?id=com.wakdev.wdnfc&hl=en
- Android-app
- Nyttig for NFC
- Leser fra/skriver til tags!

SQLite DB
DBs for everyone!
- Alle Android-apper får en SQLite DB
- Trenger ikke be om permission en gang!
- Lokal lagring!
- Spill?
Data types

https://www.sqlite.org/datatype3.html
Set up DB
https://www.sqlite.org/datatype3.html
public class DbHelper extends SQLiteOpenHelper {
public static final String DB_NAME = "measurements";
private static final int DB_VERSION = 1;
public DbHelper(final Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(final SQLiteDatabase db) {
String createTablesSQL =
"create table light ("
+ "id integer primary key autoincrement,"
+ "value real,"
+ "accuracy integer);";
db.execSQL(createTablesSQL);
}
@Override
public void onUpgrade(final SQLiteDatabase db, final int oldVersion, final int newVersion) {
// do nothing
}
}Matching class
public class Light {
private int id;
private float light;
private int accuracy;
// java stuff
}Data source: DB comm

public class LightDataSource {
private SQLiteDatabase db;
private DbHelper dbHelper;
public LightDataSource(Context context) {
dbHelper = new DbHelper(context);
}Data source (2)
public void saveLight(Light light) {
ContentValues contentValues = new ContentValues();
// table -> value
contentValues.put("value", light.getValue());
contentValues.put("accuracy", light.getAccuracy());
long id = db.insert("light", null, contentValues);
}Data source (3)
public List<Light> getLightMeasurements() {
List<Light> lights = new ArrayList<>();
String[] columns = { "id", "value", "accuracy" };
Cursor cursor = db.query("light", columns, null, null, null, null, null);
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
lights.add(lightFromCursor(cursor));
cursor.moveToNext();
}
return lights;
}
private Light lightFromCursor(final Cursor cursor) {
Light light = new Light();
light.setId(cursor.getInt(0));
light.setValue(cursor.getFloat(1));
light.setAccuracy(cursor.getInt(2));
return light;
}PG4600-15-10: Sensors! og litt DB
By theneva
PG4600-15-10: Sensors! og litt DB
Android, Sensors, SQLite DB
- 807