Journal Une boite à meuh qui fait pas "meuh"

Posté par  . Licence CC By‑SA.
Étiquettes :
40
9
déc.
2021

Sommaire

Hello

TLDR

J'ai fait une application android qui n'a pas besoin d'Android Studio, c'est là: https://framagit.org/mabu/noisebox. Attention, il vous faudra le compiler vous même.

L'idée

Quand je suis en manque de mauvaise fois, je vais lire d'OC.

Dans ses chroniques, il développe l'idée d'une boite à "Ça alors" quand dans les films, les coïncidences coïncident trop.

Je me suis dis, je veux faire ça.

Le concept

Je vais profiter de cette idée pour apprendre une nouvelle chose. Là ça sera la programmation pour android, mais avec une contrainte : ma machine principale est un vieux micro portable qu'une vieil Atom de 8-10 ans fait tourner péniblement.

Je vais donc chercher à éviter d'utiliser android studio.

Ça tombe bien, il y a tout ce qu'il faut sur debian, il m'a fallu un peu de temps pour trouver, mais un mec y a déjà pensé ici.

En gros, on a juste besoin de make, d'android-sdk et d'android-sdk-platform-23. L'API android est un peu vieille, (android 6.0, 2015) mais ça fait le job.

De mon côté, j'ai besoin de :

  • Un son à jouer
  • Jouer un son
  • Détecter l'orientation du téléphone, et jouer le son à ce moment là.

Son

Pour créer le son à jouer "Ah bah ça alors", je pourrais m'enregistrer, je peux aussi utiliser espeak et ffmpeg pour créer un son au format .mp3 que je range dans les ressources de mon paquet : res/raw/sound.mp3

espeak -w sound.wav "Sa alor"
ffmpeg -i sound.wav res/raw/sound.mp3
rm sound.wav

On peut aussi sampler la salle de cinéma qui scande "Oh bah ça, ça tombe bien alors !" dans le film La Cité de la peur.

Jouer du son

Pour jouer un son court, le plus simple est d'utiliser SoundPool qui permet d'enregistrer plein de petits sons, genre des sons d'interface, à jouer assez vite.

import android.media.SoundPool;
import android.content.Context;

public class NoiseBox extends Activity {

    SoundPool sp;
    int snd;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        /* création du pool */
        sp = new SoundPool.Builder().setMaxStreams(1).build();
        /* remplissage du pool*/
        snd = sp.load(this, R.raw.sound, 1);

        /* à partir d'ici, le son peut être joué avec
             sp.play(snd, 1, 1, 0, 0, 1);
        */
    }
}

Détection de l'orientation.

Lors de mon premier test, j'utilisais onConfigurationChanged de la classe Activity, pour attraper quand le téléphone passe de mode paysage à portrait :

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        int orientation = newConfig.orientation;

        switch(orientation)
        {
            case Configuration.ORIENTATION_PORTRAIT:
                /* l'orientation vient de passer à portrait */
                /* jouer le son ici */
                sp.play(snd, 1, 1, 0, 0, 1);
                break;
        }
     }
 }

Mais cela implique :

  • que la rotation automatique soit activée
  • que l'application soit au premier plan

Du coup, j'ai préféré utiliser le senseur d'orientaion.

Pour cela, on implémente l'interface SensorEventListener. Dans cette interface, la fonction onSensorChanged est appelée dès qu'un senseur qu'on suit évolue.

L'algorithme est simple : on regarde de quel côté on pointe, si on pointe vers le bas, puis vers le haut, on joue le son.

import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;

import java.lang.Math;

public class NoiseBox extends Activity implements SensorEventListener {

    SensorManager sm;
    Sensor s;

    boolean pointing_up;
    boolean pointing_down;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        /* récupération des senseurs */
        sm = (SensorManager)getSystemService(Context.SENSOR_SERVICE);

        /* récupération du capteur d'orientation */
        s = sm.getDefaultSensor(Sensor.TYPE_ORIENTATION);

        /* enregistrement aux évenements du capteur */
        sm.registerListener(this, s, sm.SENSOR_DELAY_NORMAL);

        /* initialisation des positions */
        pointing_up = false;
        pointing_down = false;
    }

    @Override
    public void onSensorChanged(SensorEvent event) {

        float v[] = event.values;

        float y = v[1];
        float z = Math.abs(v[2]);

        if (y > 70 && z < 10) {
            /* tiens, on pointe vers le bas */
            pointing_down = true;
            pointing_up = false;
        } else if ( y < -70 && z < 10) {
            /* tiens, maintenant, on pointe vers le haut*/
            pointing_up = true;
        }
        if (pointing_up && pointing_down) {
            /* si on a pointé vers le bas puis vers le haut, on joue le son */
            /* jouer le son la*/
            sp.play(snd, 1, 1, 0, 0, 1);

            /* reinitialisation des booléens */
            pointing_down = false;
            pointing_up = false;
        }
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    }
}

test

Voilà, il n'y a plus qu'à tester le tout, pour cela, il construire le paquet et l'autosigner (fait automatiquement avec make) et à le télécharger sur le téléphone.

Des bisous

  • # TapTapMeuh ?

    Posté par  (site web personnel) . Évalué à 10. Dernière modification le 09 décembre 2021 à 08:06.

    J'ai pas compris où on lisait les BPM, il manque donc la fonctionnalité principale ;-)

    • [^] # Re: TapTapMeuh ?

      Posté par  . Évalué à 2.

      Je pense qu'en fournissant un fichier pour chaque syllabe et les faire jouer sur le bon tempo on doit pouvoir ajouter la fonctionnalité. Le résultat devrait être plutôt sympa en plus.

  • # J'adore !

    Posté par  . Évalué à 10.

    Je me perds un peu dans tous les IDE, les prises en main diverses, qui font qu'on s'éloigne souvent des fondamentaux, au point qu'on peut les oublier et se noyer dans des bugs d'interfaces qui sont censées t'aider (voire ne plus savoir faire sans).

    Je n'avais jamais vraiment réfléchi à ça coté développement mobile, et j'aime beaucoup le fait de revenir à une solution élégante, maitrisée.

    Merci pour ton thread !

    • [^] # Re: J'adore !

      Posté par  . Évalué à 3.

      Android Studio n'est pas tout léger c'est clair mais ça fonctionne très bien. Hormis du matériel limité c'est un gros apport.

  • # Génial

    Posté par  (site web personnel, Mastodon) . Évalué à 7.

    Merci !

    Je cherche depuis longtemps à me mettre aux «appli android» mais je me suis toujours perdu dans la lourdeur des différents logiciels qu'il faut télécharger. Sans compter sur la nécessité de se créer des comptes gafam un peu partout pour pouvoir arriver à ses fin.

    L'idée de pouvoir faire une appli simple avec juste les packages de sa distribution Linux est très enthousiasmant :)

    Bon par contre j'ai pas testé.

    J'ai plus qu'une balle

    • [^] # Re: Génial

      Posté par  . Évalué à 4.

      À vrai dire, le seul logiciel à télécharger est Android Studio. C'est lui qui s'occupe de manager les SDKs, l'émulateur, etc. Ce n'est pas tout léger, j'en conviens. Mais c'est à mon sens un outil efficace, et même plutôt agréable une fois qu'on a pris le temps de le connaître un peu.

      Et non, pas besoin du moindre compte Google (ni de quelque compte que ce soit) pour développer une application, encore heureux. Par contre, si tu veux qu'elle soit disponible sur le Play Store, il te faudra effectivement un compte développeur Google. Mais rien n'empêche de fournir ton logiciel sur un store alternatif, ou encore directement sous forme d'apk.

  • # Ma version

    Posté par  . Évalué à 8.

    Sympa,

    Dans le même genre, ya le bruit du coup de fouet comme dans "Big Bang theory" (l'appli existe)
    mais je dois avoir qq part un mp3 avec le ricanement de Diabolo (de Satanas et Diabolo) je vais en faire une version avec ce son.

  • # Framework Ionic

    Posté par  . Évalué à 7.

    Il est possible d'utiliser des frameworks basés sur le WEB. Personnellement j'utilise ionic avec Angular.

    Je fait donc mon application sans Android Studio et sans xcode. En fait je fait un site WEB.

    Par contre ensuite j'utilise Android studio (et xcode) pour compiler et déployer la version mobile dans le store qui va bien. Je fait des tests de simulations avec ces outils également.

    95% du dev se fait avec un éditeur de texte + navigateur WEB et j'obtiens une application qui fonctionne en web / Android / IPhone / MacOS / tablette.

    CaniGPS

    CaniGPS

  • # Et pour Kotlin ?

    Posté par  . Évalué à 1.

    Est-ce que quelqu'un a déjà fait la même chose pour compiler des applis Android en Kotlin en ligne de commande ? Comme il y a plein de choses qui passent deprecated en Java (AsyncTasks notamment) on sent bien que ça pousse au basculement vers Kotlin.
    Mon principal problème est pas forcément Android Studio mais surtout Gradle qui passe son temps à télécharger des trucs dans tous les sens et passe énormément de temps à faire je sais pas quoi avant de compiler…

    • [^] # Re: Et pour Kotlin ?

      Posté par  (site web personnel) . Évalué à 2. Dernière modification le 10 décembre 2021 à 13:22.

      En théorie, sans IDE, il suffit de faire un :
      ./gradlew build

      Et le tour est joué non ? Ça dépendra juste de Java. Et il faudra au préalable avoir créé le projet (pour avoir le Wrapper Gradle).

      Pour exécuter, créer le binaire ou autres, on peut lister les tâches Gradle avec la tâche 'tasks' : ./gradlew tasks

      Édit : j'avais pas lu l'intégralité de ta question. Gradle télécharge automatiquement les dépendances car c'est exactement ce qu'on lui demande. Si tu ne veux pas télécharger de dépendances, tu peux soit ne pas les utiliser, soit les recoder. C'est un peu comme si tu reprochais à apt-get de télécharger des programmes… Bonne chance.

      • [^] # Re: Et pour Kotlin ?

        Posté par  . Évalué à 1.

        En fait, je souhaiterais supprimer gradle de l'équation et pouvoir utiliser un truc simple comme make par exemple.

        • [^] # Re: Et pour Kotlin ?

          Posté par  . Évalué à 3. Dernière modification le 11 décembre 2021 à 06:20.

          Il suffit d'utiliser maven !

          C'est comme make, sauf à la fin.

          Matricule 23415

        • [^] # Re: Et pour Kotlin ?

          Posté par  (site web personnel) . Évalué à 0.

          Parce que make, c'est simple ??? Ce que tu veux ressemble à vouloir utiliser les autotools à la place de CMake.

          Ne pas vouloir utiliser gradle, c'est comme utiliser Debian sans apt-get et consort. On peut très bien faire un script shell qui va d/l les dépendances. Maven va aussi d/l les dépendances, ça n'est pas tellement plus simple que Gradle.

          Tu as aussi la possibilité d'utiliser javac directement, un peu comme tu utiliserai gcc. Tu dois même pouvoir faire un makefile utilisant Javac. Pour gérer les dépendances, tu pourras utiliser Ivy, Maven ou Grape. Tu utiliseras 2 outils au lieu d'un.

          Je ne sais pas si Kotlin supporte Grape/Yvi dans le code source comme Groovy…

          Il y a plein de raisons de ne pas apprécier Gradle :
          - il impose un formalisme qui parfois est irritant ;
          - la syntaxe est parfois incohérente (ça c'est améliorer avec la version 7.2) ;
          - Ils ont fait les DSL de sorte qu'il n'y a pas d'autocompletion vraiment efficace ;
          - Les messages d'erreur sont parfois complexe, ou tombe à coté.

          Malgré ces défauts, si tu te conforme au formalisme, c'est juste un outils incontournable, et finalement très efficace, surtout sur de gros projets modulaires. Si tu développes ton plugin pour ajouter un truc au build pour faire fonctionner ton code, tu pourras partager ce que tu fais bien plus aisément, puisqu'il y a de grande chance que les intéressés utilisent aussi Gradle.

          • [^] # Re: Et pour Kotlin ?

            Posté par  . Évalué à 2. Dernière modification le 11 décembre 2021 à 16:35.

            En plus "make like", on peut aussi citer ant.

            Il est plus ancien que gradle/maven, a ses propres forces, comme permettre de tout faire sans "contournement" comparé à maven qui impose sa philosophie, mais du coup on fait aussi facilement n'importe quoi.

            Je n'ai jamais réellement utilisé gradle donc je ne peux pas m'exprimer dessus, mais pour ce qui est de maven, c'est un outil de build dédié java là ou make est généraliste : il offre donc des facilités pour java, et comme tout outil spécifique, il faut l'apprendre en effet.

            Mais la base, ça reste quand même très abordable, d'autant qu'il fonctionne beaucoup par convention (donc "non spécifié" = "fonctionnement classique").

            Matricule 23415

    • [^] # Re: Et pour Kotlin ?

      Posté par  . Évalué à 3. Dernière modification le 11 décembre 2021 à 01:46.

      Il n'y a aucun rapport entre des API taggés obsolètes et une soit-disant envie de pousser Kotlin puisque c'est la même API Android et que Kotlin est 100% compatible avec Java.
      Franchement AsyncTask plus personne n'utilise cette horreur depuis des années

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.