Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Trucs & astuces Android

Trucs & astuces Android

Découvrez une dizaine d'astuces pour rendre votre application Android totalement unique.

Edouard Marquez

September 24, 2022
Tweet

More Decks by Edouard Marquez

Other Decks in Programming

Transcript

  1. Paris Android User Group Trucs & astuces pour vos applications Android
    https://upload.w
    ikim
    edia.org/w
    ikipedia/com
    m
    ons/thum
    b/6/64/
    Android_logo_2019_%
    28stacked%
    29.svg/1000px-
    Android_logo_2019_%
    28stacked%
    29.svg.png
    Trucs & astuces
    Pour rendre votre

    application Android unique

    View Slide

  2. Paris Android User Group Trucs & astuces pour vos applications Android
    Newsletter Android

    android-croissants.com
    Qui suis-je ?
    Edouard Marquez
    Freelance Android & Flutter
    [email protected]
    @g123k
    SDK Dart & App Flutter
    Newsletter Flutter

    flutter-digest.com

    View Slide

  3. DevCafé
    Quotidienne autour de
    l'actualité du
    développement mobile
    Dev Café

    View Slide

  4. View Slide

  5. View Slide

  6. Photo Picker (1/10)

    View Slide

  7. Paris Android User Group Trucs & astuces pour vos applications Android
    Quels avantages pour le photo picker ?
    Aucune permission Plus de lib externe Interface commune

    View Slide

  8. Paris Android User Group Trucs & astuces pour vos applications Android
    Lancement du picker Choix multiples

    View Slide

  9. Paris Android User Group Trucs & astuces pour vos applications Android
    MaSuperActivity.kt
    //
    Récupérer une image ou une vidéo

    val singlePickMedia = registerForActivityResult(ActivityResultContracts.PickVisualMedia())
    { uri
    -> //
    TODO Faire quelque chose de l'image }

    singlePickMedia.launch(

    PickVisualMediaRequest(

    ActivityResultContracts.PickVisualMedia.ImageAndVideo

    )

    )

    Android 13+

    API 33

    View Slide

  10. Paris Android User Group Trucs & astuces pour vos applications Android
    MaSuperActivity.kt
    //
    Récupérer plusieurs images

    val multiplePickMedia =
    registerForActivityResult(ActivityResultContracts.PickMultipleVisualMedia()) { uri
    ->


    //
    TODO Faire quelque chose des images et / ou vidéos

    }

    //
    Démarrer le picker avec uniquement des images

    multiplePickMedia.launch(PickVisualMediaRequest(

    ActivityResultContracts.PickVisualMedia.ImageOnly))

    Android 13+

    API 33

    View Slide

  11. Paris Android User Group Trucs & astuces pour vos applications Android
    Rétro-compatibilité

    Android 4.4+
    (ACTION_OPEN_DOCUMENT)
    ACTION_OPEN_DOCUMENT
    Extensions

    Android 11 (API 30) et

    Android 12 (API 31 / 32)
    11

    View Slide

  12. Paris Android User Group Trucs & astuces pour vos applications Android
    Project Mainline
    APIs déployées

    Via le Google Play
    Modulariser

    Bluetooth, Pubs…

    View Slide

  13. Paris Android User Group Trucs & astuces pour vos applications Android
    MaSuperActivity.kt
    fun isPhotoPickerAvailable(): Boolean {

    return if (Build.VERSION.SDK_INT
    >=
    Build.VERSION_CODES.TIRAMISU) {

    true

    } else if (Build.VERSION.SDK_INT
    >=
    Build.VERSION_CODES.R) {

    getExtensionVersion(Build.VERSION_CODES.R)
    > =
    2

    } else {

    false

    }

    }

    Extensions

    Android 11 (API 30) et

    Android 12 (API 31 / 32)
    11

    View Slide

  14. Les tuiles / contrôles (2/10)

    View Slide

  15. Paris Android User Group Trucs & astuces pour vos applications Android
    Android 7 -> Android 10 Depuis Android 11

    View Slide

  16. Paris Android User Group Trucs & astuces pour vos applications Android
    AndroidManifest.xml

    android:name=".MonSuperBloc"

    android:exported="true"

    android:icon="@drawable/tile_icon"

    android:label="@string/tile_label"

    android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">



    />



    intent-filter>


    service>

    Android 7.0+

    API 24

    View Slide

  17. Paris Android User Group Trucs & astuces pour vos applications Android
    MonSuperBloc.kt
    @RequiresApi(Build.VERSION_CODES.N)

    class MonSuperBloc : TileService() {

    override fun onStartListening() {

    super.onStartListening()

    if (Build.VERSION.SDK_INT
    >=
    Build.VERSION_CODES.Q) {

    qsTile.subtitle = "Hello World"

    }

    qsTile.state = Tile.STATE_ACTIVE

    qsTile.updateTile()

    }

    Android 7.0+

    API 24

    View Slide

  18. Paris Android User Group Trucs & astuces pour vos applications Android
    MonSuperBloc.kt
    override fun onClick() {

    super.onClick()

    val intent = Intent(
    ...
    )

    startActivityAndCollapse(intent)

    }

    }

    Android 7.0+

    API 24

    View Slide

  19. Paris Android User Group Trucs & astuces pour vos applications Android
    MonSuperBloc.kt
    override fun onClick() {

    showDialog(

    AlertDialog.Builder(this)

    .setTitle("Hello World")

    .setMessage("This is a message")

    .setPositiveButton("OK") { dialog, _
    ->


    dialog.dismiss()

    }

    .create())

    }

    }
    Android 7.0+

    API 24

    View Slide

  20. Paris Android User Group Trucs & astuces pour vos applications Android
    Nouveauté

    Demander l'ajout d'un "bloc"
    Personnalisable

    Titre et icône

    View Slide

  21. Paris Android User Group Trucs & astuces pour vos applications Android
    MaSuperActivity.xml
    if (Build.VERSION.SDK_INT
    >=
    Build.VERSION_CODES.TIRAMISU) {

    (getSystemService(Context.STATUS_BAR_SERVICE) as StatusBarManager?)
    ?.
    let {

    it.requestAddTileService(

    ComponentName(this, MonSuperBloc
    ::
    class.java),

    "My Awesome Tile 123",

    Icon.createWithResource(this, R.drawable.ic_tile),

    mainExecutor,

    ) { res
    -> //
    TODO Réponse de l'utilisateur (oui / non) }

    }

    }
    Android 13+

    API 33

    View Slide

  22. Paris Android User Group Trucs & astuces pour vos applications Android
    Oui, mais non

    Réservé aux Commandes du
    domicile (API Control)
    Afficher un écran

    Avec un slider

    View Slide

  23. La catégorie (3/10)

    View Slide

  24. Paris Android User Group Trucs & astuces pour vos applications Android





    android:allowBackup="true"

    android:icon="@mipmap/ic_launcher"

    android:label="@string/app_name"

    android:supportsRtl="true"

    android:appCategory="maps"

    android:theme="@style/Theme.DevCafe"
    />



    manifest>
    AndroidManifest.xml
    Android 8+

    API 26
    Catégories

    accessibility

    audio

    game

    image

    maps

    news

    productivity

    social

    video

    View Slide

  25. Raccourci vers les paramètres (4/10)

    View Slide

  26. Paris Android User Group Trucs & astuces pour vos applications Android
    Une application "classique" Raccourci vers les paramètres

    View Slide

  27. Paris Android User Group Trucs & astuces pour vos applications Android
    AndroidManifest.xml

    android:name=".SettingsActivity"

    android:exported="true">



    / >


    />



    intent-filter>


    activity>

    Android 7.0+

    API 24

    View Slide

  28. Gérer le stockage (5/10)

    View Slide

  29. Paris Android User Group Trucs & astuces pour vos applications Android
    Une application "classique" "Gérer l'espace" Les Play Services

    View Slide

  30. Paris Android User Group Trucs & astuces pour vos applications Android





    android:allowBackup="true"

    android:icon="@mipmap/ic_launcher"

    android:label="@string/app_name"

    android:supportsRtl="true"

    android:manageSpaceActivity=".MyActivity"

    android:theme="@style/Theme.DevCafe"
    />



    manifest>
    AndroidManifest.xml
    Android 1+

    API 1

    View Slide

  31. Conserver les données utilisateur (6/10)

    View Slide

  32. Paris Android User Group Trucs & astuces pour vos applications Android

    View Slide

  33. Paris Android User Group Trucs & astuces pour vos applications Android





    android:allowBackup="true"

    android:icon="@mipmap/ic_launcher"

    android:label="@string/app_name"

    android:supportsRtl="true"

    android:hasFragileUserData="true"

    android:theme="@style/Theme.DevCafe"
    />



    manifest>
    AndroidManifest.xml
    Android 10.0+

    API 29

    View Slide

  34. Expliquer les permissions (7/10)

    View Slide

  35. Paris Android User Group Trucs & astuces pour vos applications Android
    Trois permissions "dangereuses" pour la vie privée
    Appareil photo
    android.permission.

    CAMERA
    Micro
    android.permission.

    RECORD_AUDIO
    Localisation
    android.permission.

    ACCESS_COARSE_LOCATION

    ACCESS_FINE_LOCATION

    View Slide

  36. Paris Android User Group Trucs & astuces pour vos applications Android
    Une application "classique" Expliquer les permissions

    View Slide

  37. Paris Android User Group Trucs & astuces pour vos applications Android
    AndroidManifest.xml

    android:permission="android.permission.START_VIEW_PERMISSION_USAGE"

    android:exported="true">



    />


    />



    intent-filter>


    activity>

    Android 10+

    API 29

    View Slide

  38. Paris Android User Group Trucs & astuces pour vos applications Android
    Depuis les paramètres Confidentialité

    View Slide

  39. Paris Android User Group Trucs & astuces pour vos applications Android
    Une application "classique" Expliquer les permissions

    View Slide

  40. Paris Android User Group Trucs & astuces pour vos applications Android
    AndroidManifest.xml

    android:permission="android.permission.START_VIEW_PERMISSION_USAGE"

    android:exported="true">



    />


    />



    intent-filter>


    activity>

    Android 12.0+

    API 31

    View Slide

  41. Partager une URL / URI (8/10)

    View Slide

  42. Paris Android User Group Trucs & astuces pour vos applications Android
    Une application "classique" Partager une URI Cliquer sur l'icône

    View Slide

  43. Paris Android User Group Trucs & astuces pour vos applications Android
    MaSuperActivity.kt
    override fun onProvideAssistContent(outContent: AssistContent?) {

    super.onProvideAssistContent(outContent)

    outContent
    ?.
    webUri = Uri.parse("https:
    //
    www.google.com")

    }
    Android 6+

    API 23
    Android 12.0+

    API 31
    API Visible

    View Slide

  44. Tirer parti du notch (9/10)

    View Slide

  45. Paris Android User Group Trucs & astuces pour vos applications Android
    Du côté de la concurrence
    iPhone 14 Pro

    Et avoir cassé son PEL
    Dynamic Island

    Sur iOS 16.1 (Novembre ?)

    View Slide

  46. Paris Android User Group Trucs & astuces pour vos applications Android
    Un faux départ sur Android pour le DisplayCutout
    https://cyrilmottier.com/2018/05/31/fun-with-cutouts
    Retirées

    Android 9 (P) Preview 2
    Premières APIs

    Android 9 (P) Preview 1
    De retour

    Android 12 (S)

    View Slide

  47. Paris Android User Group Trucs & astuces pour vos applications Android
    Et sur Android ?
    MaSuperView.kt
    //
    Récupérer l'emplacement du notch

    val cutout = context.display
    ?.
    cutout

    //
    API 28

    val rect = cutout
    ?
    .
    boundingRects

    //
    API 33

    val path = cutout
    ?
    .
    cutoutPath
    Android 9+

    API 28 et 33
    MaSuperActivity.kt
    //
    Récupérer l'angle de haut gauche de l'écran

    override fun onWindowFocusChanged(hasFocus: Boolean) {

    super.onWindowFocusChanged(hasFocus)

    val topLeftCornerRadius = window.decorView

    .rootWindowInsets.getRoundedCorner(

    RoundedCorner.POSITION_TOP_LEFT

    )
    ?.
    radius

    }
    Android 12.0+

    API 31

    View Slide

  48. Paris Android User Group Trucs & astuces pour vos applications Android
    Un autre exemple

    View Slide

  49. Les vibrations (retours haptiques) (10/10)

    View Slide

  50. Paris Android User Group Trucs & astuces pour vos applications Android
    Du côté de la concurrence
    Outil tiers

    Haptrix (15 €)
    Core Haptics

    Depuis iOS 13

    View Slide

  51. Paris Android User Group Trucs & astuces pour vos applications Android
    Et sur Android ?
    MaSuperActivity.kt
    VibrationEffect.startComposition()

    .addPrimitive(VibrationEffect.Composition.PRIMITIVE_LOW_TICK)

    .addOffDuration(Duration.ofMillis(10))

    .addEffect(VibrationEffect.createPredefined(VibrationEffect.EFFECT_DOUBLE_CLICK))

    .addOffDuration(Duration.ofMillis(50))

    .addEffect(VibrationEffect.createWaveform(pattern, repeatIndex))

    .compose()

    Android 11+

    API 30
    11

    View Slide

  52. Paris Android User Group Trucs & astuces pour vos applications Android
    MaSuperActivity.kt
    val player = MediaPlayer.create(applicationContext, R.raw.my_song)

    player.setVolume(0f, 0f)

    if (HapticGenerator.isAvailable()) {

    hapticGenerator = HapticGenerator.create(player.getAudioSessionId())

    hapticGenerator
    ?.
    enabled = true

    }

    player.start()

    Et sur Android ?
    Android 12.0+

    API 31

    View Slide

  53. Merci !


    Questions ?
    Edouard Marquez
    Freelance Android & Flutter [email protected]
    @g123k
    Newsletter Flutter

    flutter-digest.com
    Newsletter Android

    android-croissants.com
    DevCafé

    Quotidienne autour du dev. mobile

    View Slide