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

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

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

    Android Project Mainline APIs déployées Via le Google Play Modulariser Bluetooth, Pubs…
  9. 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
  10. Paris Android User Group Trucs & astuces pour vos applications

    Android Android 7 -> Android 10 Depuis Android 11
  11. 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
  12. 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
  13. 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
  14. 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
  15. Paris Android User Group Trucs & astuces pour vos applications

    Android Nouveauté Demander l'ajout d'un "bloc" Personnalisable Titre et icône
  16. 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
  17. 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
  18. 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
  19. Paris Android User Group Trucs & astuces pour vos applications

    Android Une application "classique" Raccourci vers les paramètres
  20. 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
  21. Paris Android User Group Trucs & astuces pour vos applications

    Android Une application "classique" "Gérer l'espace" Les Play Services
  22. 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
  23. 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
  24. 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
  25. Paris Android User Group Trucs & astuces pour vos applications

    Android Une application "classique" Expliquer les permissions
  26. 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
  27. Paris Android User Group Trucs & astuces pour vos applications

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

    Android Une application "classique" Expliquer les permissions
  29. 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
  30. Paris Android User Group Trucs & astuces pour vos applications

    Android Une application "classique" Partager une URI Cliquer sur l'icône
  31. 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
  32. 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 ?)
  33. 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)
  34. 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
  35. 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
  36. 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
  37. 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
  38. 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