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

  1. Finds the Map fragment
     
  2. Loads the map
     
  3. Creates a LatLng object
     
  4. Adds a Marker
    (MarkerOptions)
     
  5. 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
       
  • SensorEvent
    • 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);

// ...
  1. Connect
  2. Read(/write)
  3. 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