$30 off During Our Annual Pro Sale. View Details »

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
  2. Paris Android User Group Trucs & astuces pour vos applications

    Android Newsletter Android android-croissants.com Qui suis-je ? Edouard Marquez Freelance Android & Flutter edouard@marquez.cool @g123k SDK Dart & App Flutter Newsletter Flutter flutter-digest.com
  3. DevCafé Quotidienne autour de l'actualité du développement mobile Dev Café

  4. None
  5. None
  6. Photo Picker (1/10)

  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
  8. Paris Android User Group Trucs & astuces pour vos applications

    Android Lancement du picker Choix multiples
  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
  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
  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
  12. Paris Android User Group Trucs & astuces pour vos applications

    Android Project Mainline APIs déployées Via le Google Play Modulariser Bluetooth, Pubs…
  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
  14. Les tuiles / contrôles (2/10)

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

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

    Android AndroidManifest.xml <service 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> <action android:name="android.service.quicksettings.action.QS_TILE" /> </ intent-filter> </ service> Android 7.0+ API 24
  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
  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
  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
  20. Paris Android User Group Trucs & astuces pour vos applications

    Android Nouveauté Demander l'ajout d'un "bloc" Personnalisable Titre et icône
  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
  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
  23. La catégorie (3/10)

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

    Android <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http: // schemas.android.com/apk/res/android"> <application 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
  25. Raccourci vers les paramètres (4/10)

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

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

    Android AndroidManifest.xml <activity android:name=".SettingsActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.APPLICATION_PREFERENCES" / > <category android:name="android.intent.category.DEFAULT" /> </ intent-filter> </ activity> Android 7.0+ API 24
  28. Gérer le stockage (5/10)

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

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

    Android <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http: // schemas.android.com/apk/res/android"> <application 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
  31. Conserver les données utilisateur (6/10)

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

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

    Android <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http: // schemas.android.com/apk/res/android"> <application 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
  34. Expliquer les permissions (7/10)

  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
  36. Paris Android User Group Trucs & astuces pour vos applications

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

    Android AndroidManifest.xml <activity android:name=".PermissionsActivity" android:permission="android.permission.START_VIEW_PERMISSION_USAGE" android:exported="true"> <intent-filter> <action android:name="android.intent.action.VIEW_PERMISSION_USAGE" /> <category android:name="android.intent.category.DEFAULT" /> </ intent-filter> </ activity> Android 10+ API 29
  38. Paris Android User Group Trucs & astuces pour vos applications

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

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

    Android AndroidManifest.xml <activity android:name=".PermissionsActivity" android:permission="android.permission.START_VIEW_PERMISSION_USAGE" android:exported="true"> <intent-filter> <action android:name="android.intent.action.VIEW_PERMISSION_USAGE_FOR_PERIOD" /> <category android:name="android.intent.category.DEFAULT" /> </ intent-filter> </ activity> Android 12.0+ API 31
  41. Partager une URL / URI (8/10)

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

    Android Une application "classique" Partager une URI Cliquer sur l'icône
  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
  44. Tirer parti du notch (9/10)

  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 ?)
  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)
  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
  48. Paris Android User Group Trucs & astuces pour vos applications

    Android Un autre exemple
  49. Les vibrations (retours haptiques) (10/10)

  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
  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
  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
  53. Merci ! Questions ? Edouard Marquez Freelance Android & Flutter

    edouard@marquez.cool @g123k Newsletter Flutter flutter-digest.com Newsletter Android android-croissants.com DevCafé Quotidienne autour du dev. mobile