Slide 1

Slide 1 text

Awareness API Retty Tech Cafe #6 / @kgmyshin

Slide 2

Slide 2 text

agenda • Awareness APIͱ͸ͳʹ͔ • Awareness APIΛ࢖͏ • ಋೖ • Snapshot API • Fence API • ॴײ

Slide 3

Slide 3 text

Awareness APIͱ͸Կ͔

Slide 4

Slide 4 text

Awareness APIͱ͸Կ͔ • ༷ʑͳίϯςΩετΛऔಘͰ͖ΔAPI ը૾ࢀর: https://developers.google.com/awareness/

Slide 5

Slide 5 text

Awareness API 4OBQTIPU"1* 'FODF"1* ࣗ෼͕ཉ͍͠͞·͟·ͳঢ়ଶ Λऔಘ͢Δ΋ͷ ࣗ෼͕ཉ͍͠ঢ়ଶΛఆٛͯ͠ɺ ͦͷঢ়ଶʹͳΔͱBroadcast͕ ඈΜͰ͘Δͱ͍͏΋ͷ

Slide 6

Slide 6 text

Awareness APIΛ࢖͏

Slide 7

Slide 7 text

ಋೖ • ैདྷͷGoogle Play ServiceܥͷAPIಋೖํ๏ͱಉ༷ 1. Google Developers ConsoleͰAPIΛ༗ޮʹͯ͠ɺAPI Keyऔಘ 2. build.gradleͷdependenciesʹ௥Ճ 3. AndroidManifest.xmlʹmeta-dataΛهೖ 4. AndroidManifest.xmlʹඞཁͳPermissionΛ௥Ճ

Slide 8

Slide 8 text

[ݹ͍] 9.2.0 Google Play Services • AnalyticsͷΑ͏ʹɺSDK͕෼ׂ͞Ε͍ͯͳ͍ ͷͰؙͬͱೖΕͳ͍ͱ͍͚ͳ͍ɻ DPNHPPHMFBOESPJEHNTQMBZTFSWJDFTBOBMZUJDT DPNHPPHMFBOESPJEHNTQMBZTFSWJDFTBXBSFOFTT ͳ͍

Slide 9

Slide 9 text

ͪͳΈʹ… • Google Play ServicesΛؙͬͱೖΕͯɺ Support Library΋ೖΕΔͱMethod Count͕ 655536Λ௒͑Δ orz • ೋ͚ͭͩͳͷʹMultiDexͳͲ͕ඞཁorz

Slide 10

Slide 10 text

9.2.1 Google Play Services 9.2.1Ͱ͸awareness api༻ͷ΋ͷ͕Ͱ͖͍ͯͨɻ DPNHPPHMFBOESPJEHNTQMBZTFSWJDFTDPOUFYUNBOBHFS awarenessͰ͸ͳ͍… ϝιουΧ΢ϯτΛଌΔͱ10252ɻ Google Play Service AllͰ͸4ສ͘Β͍ͳͷͰ3ສ͘Β͍࡟ΕͯΔɻ

Slide 11

Slide 11 text

Snapshot API

Slide 12

Slide 12 text

Current Activity • ݱࡏͷϢʔβʔͷঢ়ଶ͕औΕΔ w ࣗಈंͱ͔ʹ৐ͬͯΔ w ࣗసंʹ৐ͬͯΔ w า͍ͯΔ͔૸ͬͯΔ w ૸ͬͯΔ w ࢭ·ͬͯΔ w ܏͍ͯΔ w า͍ͯΔ

Slide 13

Slide 13 text

Current Activity Awareness.SnapshotApi.getDetectedActivity(apiClient) .setResultCallback(new ResultCallback() { @Override public void onResult(@NonNull DetectedActivityResult detectedActivityResult) { if (!detectedActivityResult.getStatus().isSuccess()) { Log.e(TAG, "Could not get the current activity."); } ActivityRecognitionResult ar = detectedActivityResult.getActivityRecognitionResult(); DetectedActivity probableActivity = ar.getMostProbableActivity(); showActivity(probableActivity); } }); • SnapshotApi.getDetectedActivityΛݺͿ͚ͩ • DetectedActivityResultʹઌͷ৘ใ͕֨ೲ͞Ε͍ͯΔ

Slide 14

Slide 14 text

Nearby Beacons • ۙ͘ͷBeaconͷ৘ใΛऔಘͰ͖Δ • ͜Ε͸ࢼͯ͠ͳ͍ orz

Slide 15

Slide 15 text

Headphone State • ϔουϗϯϓϥάͷঢ়ଶ͕औΕΔ w ϓϥάΠϯঢ়ଶ w Ξϯϓϥάঢ়ଶ

Slide 16

Slide 16 text

Headphone State Awareness.SnapshotApi.getHeadphoneState(apiClient) .setResultCallback(new ResultCallback() { @Override public void onResult(@NonNull HeadphoneStateResult headphoneStateResult) { if (!headphoneStateResult.getStatus().isSuccess()) { Log.e(TAG, "Could not get headphone state."); return; } HeadphoneState headphoneState = headphoneStateResult.getHeadphoneState(); showState(headphoneState); } }); • SnapshotApi.getHeadphoneStateΛݺͿ͚ͩ • HeadphoneStateResultʹઌͷ৘ใ͕֨ೲ͞Ε͍ͯΔ

Slide 17

Slide 17 text

Location • Ң౓ܦ౓͕औΕΔ

Slide 18

Slide 18 text

Location Awareness.SnapshotApi.getLocation(apiClient) .setResultCallback(new ResultCallback() { @Override public void onResult(@NonNull LocationResult locationResult) { if (!locationResult.getStatus().isSuccess()) { Log.e(TAG, "Could not get location."); return; } Location location = locationResult.getLocation(); showLocation(location); } }); • SnapshotApi.getLocationΛݺͿ͚ͩ • LocationResultʹઌͷ৘ใ͕֨ೲ͞Ε͍ͯΔ

Slide 19

Slide 19 text

Nearby Places • ۙ͘ͷࢪઃͷ৘ใ͕औΕΔ w ۙ͘ʹ͋Δࢪઃͷ w ໊લ w ి࿩൪߸ w Ң౓ܦ౓ w XFCTJUFVSM w SBUJOH w Ձ֨Ϩϕϧ w ͳͲ Awareness APIҎ֎ʹ ผ్ Google Places APIΛ ༗ޮʹ͢Δඞཁ͕͋Δ ͷͰ஫ҙɻ

Slide 20

Slide 20 text

Nearby Places Awareness.SnapshotApi.getPlaces(apiClient) .setResultCallback(new ResultCallback() { @Override public void onResult(@NonNull PlacesResult placesResult) { if (!placesResult.getStatus().isSuccess()) { Log.e(TAG, "Could not get places."); return; } showPlaces(placesResult); } }); • SnapshotApi.getPlacesΛݺͿ͚ͩ • PlaceResultʹઌͷ৘ใ͕֨ೲ͞Ε͍ͯΔ

Slide 21

Slide 21 text

Weather • ఱؾ͕औΕΔ (Լه͕ෳ਺߹Θͬͯ͞औಘͰ͖ Δ) w ΋΍ w פ͍ w ཛྷ w շ੖ w ಶΓ w Ӎ w ઇ w ໄ w ෩͕ڧ͍

Slide 22

Slide 22 text

Weather Awareness.SnapshotApi.getWeather(apiClient) .setResultCallback(new ResultCallback() { @Override public void onResult(@NonNull WeatherResult weatherResult) { if (!weatherResult.getStatus().isSuccess()) { Log.e(TAG, "Could not get weather."); return; } Weather weather = weatherResult.getWeather(); showWeather(weather); } }); • SnapshotApi.getWeatherΛݺͿ͚ͩ • WeatherResultʹઌͷ৘ใ͕֨ೲ͞Ε͍ͯΔ

Slide 23

Slide 23 text

Fence API

Slide 24

Slide 24 text

վΊͯFence APIͱ͸ • Fence API͸ࣗ෼͕ཉ͍͠ঢ়ଶΛఆٛͯ͠ɺͦ ͷঢ়ଶʹͳΔͱBroadcast͕ඈΜͰ͘Δͱ͍͏ ΋ͷ

Slide 25

Slide 25 text

どういうFenceを作ることができるのか • Լهͷ৘ใΛऔಘͰ͖Δ w #FBDPO'FODF w %FUFDUFE"DUJWJUZ'FODF w )FBEQIPOF'FODF w -PDBUJPO'FODF w 5JNF'FODF • ·ͨ͜ΕΒͷ৘ใΛ૊Έ߹ΘͤΔ͜ͱ΋Մೳ • ྫ͑͹ʮ૸Γग़͔ͨ࣌ͭ͠ϔουϗϯϓϥά͕ϓϥάΠϯঢ়ଶͰ͋ Δʯͱ͍͏ϑΣϯεΛ࡞Δ͜ͱ͕Ͱ͖Δ

Slide 26

Slide 26 text

Fenceを実際に作る AwarenessFence pluggingIn = HeadphoneFence.pluggingIn(); Awareness.FenceApi.updateFences(mClient, new FenceUpdateRequest.Builder() .addFence(FenceKey.PLUG_IN.name(), pluggingIn, mFencePendingIntent).build()) .setResultCallback(new ResultCallback() { @Override public void onResult(@NonNull Status status) { if (status.isSuccess()) { Log.i(TAG, "fence start updateFences add fence: success"); } else { Log.i(TAG, "fence start updateFences add fence: fail" + status); } } }); • ϔουϗϯͷϓϥάΠϯঢ়ଶʹͳͬͨ࣌ͱ͍ ͏FenceΛ࡞Δ

Slide 27

Slide 27 text

Fenceを実際に作る AwarenessFence pluggingIn = HeadphoneFence.pluggingIn(); Awareness.FenceApi.updateFences(mClient, new FenceUpdateRequest.Builder() .addFence(FenceKey.PLUG_IN.name(), pluggingIn, mFencePendingIntent).build()) .setResultCallback(new ResultCallback() { @Override public void onResult(@NonNull Status status) { if (status.isSuccess()) { Log.i(TAG, "fence start updateFences add fence: success"); } else { Log.i(TAG, "fence start updateFences add fence: fail" + status); } } }); • Headphone FenceΛऔಘ

Slide 28

Slide 28 text

Fenceを実際に作る AwarenessFence pluggingIn = HeadphoneFence.pluggingIn(); Awareness.FenceApi.updateFences(mClient, new FenceUpdateRequest.Builder() .addFence(FenceKey.PLUG_IN.name(), pluggingIn, mFencePendingIntent).build()) .setResultCallback(new ResultCallback() { @Override public void onResult(@NonNull Status status) { if (status.isSuccess()) { Log.i(TAG, "fence start updateFences add fence: success"); } else { Log.i(TAG, "fence start updateFences add fence: fail" + status); } } }); • FenceAPI.updateFencesΛݺͿ • ͜Ε͚ͩ

Slide 29

Slide 29 text

Fenceを登録する • ैདྷͷBroadcast Receiverͱಉ༷ public class FenceReceiver extends BroadcastReceiver { private static final String TAG = "FENCE_RECEIVER"; @Override public void onReceive(Context context, Intent intent) { if (!TextUtils.equals("com.kgmyshin.fence.RECEIVE_FENCE", intent.getAction())) { return; } FenceState state = FenceState.extract(intent); if (TextUtils.equals(state.getFenceKey(), FenceKey.PLUG_IN.name())) { if (state.getCurrentState() == FenceState.TRUE) { Toast.makeText(context, "plug in", Toast.LENGTH_SHORT).show(); } Log.i(TAG, "FENCE_START: " + state.getCurrentState()); } } }

Slide 30

Slide 30 text

注意点1 • Snapshotʹ͋ΔΑ͏ͳWeather ͱ Nearby PlacesͰ͸FenceΛ࡞Δ͜ͱ͸Ͱ͖ͳ͍ • ʮӍ͕߱ͬͨΒ…ʯɺʮༀہͷۙ͘ʹདྷͨ Β…ʯͱ͍͏ͷ͕௚઀͸Ͱ͖ͳ͍ • ΍ΔͳΒɺ࣌ؒ΍ڑ཭ͷมಈΛఆظతʹݟ ͯSnapshotͰऔಘ͢Ε͹͍͚ͦ͏

Slide 31

Slide 31 text

注意点2 • ຊମͷిݯ͕੾ΕΔͱFence͕ͳ͘ͳΔΈ͍ͨ • BOOT_COMPLETEΛड৴ͯ͠࠶ొ࿥ͷඞཁ ͕͋Δ

Slide 32

Slide 32 text

ॴײ • ಋೖίετ͘͢͝௿ͯ͘࢖͍қ͍ • ᠘΋গͳ͍ҹ৅ • ಛʹPlaces͸໘നͦ͏ • ΞΠσΞ࣍ୈͰ͘͢͝͸·Γͦ͏