[JAVA] Applications de contrôle et de communication UDP basées sur Android utilisant des valeurs de capteur d'accélération

Changements depuis la dernière fois

Jusqu'à la dernière fois, le capteur d'accélération était contrôlé en affichant une image imitant une LED, mais cette fois, il a été modifié pour que le capteur d'accélération puisse être contrôlé à l'aide d'un bouton radio et d'un spinner.

Interface utilisateur graphique de l'application

Dans cette application, les valeurs du capteur d'accélération à trois axes (X, Y, Z) sont envoyées par communication UDP. Le contrôle à l'aide d'un capteur d'accélération dans le terminal peut désormais être effectué à l'aide des boutons radio et des curseurs. Puisque les éléments de contrôle sont définis avec les boutons radio, vous ne pouvez contrôler qu'un seul axe à la fois.

Interface utilisateur graphique de l'application

Pour ASUS Tab K013

Code source

Puisque la communication par socket est effectuée, ajoutez ce qui suit à Androidmanifest.xml.

Androidmanifest.xml


<uses-permission android:name="android.permission.INTERNET"></uses-permission>

Ensuite, afin de gérer les fichiers image et audio, créez des images dessinables et brutes dans l'application, et mettez-y les données d'image et les données audio. Après cela, puisqu'un spinner est utilisé, Spinner.xml est créé dans les valeurs de res.

app
 └res
   ├drawable
   │ ├en.jpg
   │ ├en_gleen.jpg
   │ └en_red.jpg
   ├raw
   │ ├xjikum.mp3
   │ ├xjikup.mp3
   │ ├yjikum.mp3
   │ ├yjikup.mp3
   │ ├zjikum.mp3
   │ └zjikup.mp3
   └values
     └Spinner.xml

Le code source de Spinner.xml est le suivant

Spinner.xml


<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="items">
        <item>c'est tout</item>
        <item>Moins que</item>
    </string-array>
</resources>

activity_main.xml


<Spinner
        android:id="@+id/spinner2"
        android:layout_width="67dp"
        android:layout_height="32dp"
        android:layout_marginStart="8dp"
        android:layout_marginBottom="180dp"
        android:entries="@array/items"
        android:textSize="24sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toEndOf="@+id/y_if" />

    <Spinner
        android:id="@+id/spinner3"
        android:layout_width="67dp"
        android:layout_height="32dp"
        android:layout_marginStart="8dp"
        android:layout_marginBottom="128dp"
        android:entries="@array/items"
        android:textSize="24sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toEndOf="@+id/z_if" />

    <EditText
        android:id="@+id/IP_Address"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="52dp"
        android:layout_marginEnd="16dp"
        android:ems="10"
        android:inputType="textPersonName"
        android:text="127.0.0.1"
        android:textSize="24sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <EditText
        android:id="@+id/Port"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="48dp"
        android:layout_marginEnd="16dp"
        android:ems="10"
        android:inputType="textPersonName"
        android:text="8080"
        android:textSize="24sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/IP_Address" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="280dp"
        android:text="X:"
        android:textSize="24sp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="24dp"
        android:text="Y:"
        android:textSize="24sp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView" />

    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="24dp"
        android:text="Z:"
        android:textSize="24sp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView2" />

    <TextView
        android:id="@+id/X_Data"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="280dp"
        android:text="TextView"
        android:textSize="24sp"
        app:layout_constraintStart_toEndOf="@+id/textView"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/Y_Data"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="24dp"
        android:text="TextView"
        android:textSize="24sp"
        app:layout_constraintStart_toEndOf="@+id/textView2"
        app:layout_constraintTop_toBottomOf="@+id/X_Data" />

    <TextView
        android:id="@+id/Z_Data"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="24dp"
        android:text="TextView"
        android:textSize="24sp"
        app:layout_constraintStart_toEndOf="@+id/textView3"
        app:layout_constraintTop_toBottomOf="@+id/Y_Data" />

    <TextView
        android:id="@+id/textView7"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="230dp"
        android:text="Valeur du capteur d'accélération"
        android:textSize="24sp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/Ran"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="87dp"
        android:layout_marginLeft="87dp"
        android:layout_marginBottom="70dp"
        android:text="Commencer la communication"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

    <TextView
        android:id="@+id/textView4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginBottom="8dp"
        android:text="adresse IP"
        android:textSize="24sp"
        app:layout_constraintBottom_toTopOf="@+id/IP_Address"
        app:layout_constraintStart_toStartOf="parent" />

    <TextView
        android:id="@+id/textView5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginBottom="8dp"
        android:text="numéro de port"
        android:textSize="24sp"
        app:layout_constraintBottom_toTopOf="@+id/Port"
        app:layout_constraintStart_toStartOf="parent" />

    <Button
        android:id="@+id/End"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="87dp"
        android:layout_marginRight="87dp"
        android:layout_marginBottom="70dp"
        android:text="Annulation de la communication"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent" />

    <TextView
        android:id="@+id/textView6"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="300dp"
        android:layout_marginEnd="124dp"
        android:text="Delay"
        android:textSize="24sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <EditText
        android:id="@+id/Delay"
        android:layout_width="159dp"
        android:layout_height="49dp"
        android:layout_marginTop="16dp"
        android:layout_marginEnd="40dp"
        android:ems="10"
        android:inputType="textPersonName"
        android:text="100"
        android:textSize="24sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView6" />

    <Spinner
        android:id="@+id/spinner1"
        android:layout_width="67dp"
        android:layout_height="32dp"
        android:layout_marginStart="8dp"
        android:layout_marginBottom="248dp"
        android:entries="@array/items"
        android:textSize="24sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toEndOf="@+id/x_if" />

    <EditText
        android:id="@+id/y_if"
        android:layout_width="66dp"
        android:layout_height="49dp"
        android:layout_marginStart="8dp"
        android:layout_marginBottom="183dp"
        android:ems="10"
        android:inputType="textPersonName"
        android:text="500"
        android:textSize="24sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toEndOf="@+id/RBGroup" />

    <EditText
        android:id="@+id/x_if"
        android:layout_width="66dp"
        android:layout_height="49dp"
        android:layout_marginStart="8dp"
        android:layout_marginBottom="243dp"
        android:ems="10"
        android:inputType="textPersonName"
        android:text="500"
        android:textSize="24sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toEndOf="@+id/RBGroup" />

    <EditText
        android:id="@+id/z_if"
        android:layout_width="66dp"
        android:layout_height="49dp"
        android:layout_marginStart="8dp"
        android:layout_marginBottom="123dp"
        android:ems="10"
        android:inputType="textPersonName"
        android:text="500"
        android:textSize="24sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toEndOf="@+id/RBGroup" />


    <RadioGroup
        android:id="@+id/RBGroup"
        android:layout_width="125dp"
        android:layout_height="180dp"
        android:layout_marginStart="40dp"
        android:layout_marginBottom="113dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent">


        <RadioButton
            android:id="@+id/x_button"
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:layout_weight="1"
            android:text="La valeur de X est"
            android:textSize="24sp" />

        <RadioButton
            android:id="@+id/y_button"
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:layout_weight="1"
            android:text="La valeur de Y est"
            android:textSize="24sp" />

        <RadioButton
            android:id="@+id/z_button"
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:layout_weight="1"
            android:text="La valeur de Z est"
            android:textSize="24sp" />
    </RadioGroup>

MainActivity.java


import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.media.AudioAttributes;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Spinner;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
import java.util.Timer;
import java.util.TimerTask;

public class MainActivity extends AppCompatActivity implements SensorEventListener {

    private SensorManager sensorManager;
    private TextView X_Data_TextView,Y_Data_TextView,Z_Data_TextView;
    private float data_X,data_Y,data_Z;
    private int data_x,data_y,data_z;
    private String Data;
    private Timer timer1,timer2;
    private mTimerTask1 timerTask1;
    private mTimerTask2 timerTask2;
    private Handler handler = new Handler();
    private long Delay;
    private Spinner spinner1,spinner2,spinner3;
    private int spn1,spn2,spn3;
    private int X,Y,Z;
    private String x,y,z;
    SoundPool soundPool;
    int mp3_xp,mp3_xm,mp3_yp,mp3_ym,mp3_zp,mp3_zm;
    private int xp,yp,zp,xm,ym,zm;
    private RadioGroup rg ;
    private RadioButton RBid;

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

        //Paramètres du capteur d'accélération
        sensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);

        //Définition du texte pour afficher l'accélération
        X_Data_TextView = findViewById(R.id.X_Data);
        Y_Data_TextView = findViewById(R.id.Y_Data);
        Z_Data_TextView = findViewById(R.id.Z_Data);

        //Celui dont vous avez besoin pour ajouter du son
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
            soundPool = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
        } else {
            AudioAttributes attr = new AudioAttributes.Builder()
                    .setUsage(AudioAttributes.USAGE_MEDIA)
                    .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
                    .build();
            soundPool = new SoundPool.Builder()
                    .setAudioAttributes(attr)
                    .setMaxStreams(5)
                    .build();
        }

        //Réglage des effets sonores
        mp3_xp = soundPool.load(this, R.raw.xjikup, 1);
        mp3_xm = soundPool.load(this,R.raw.xjikum,1 );
        mp3_yp = soundPool.load(this, R.raw.yjikup, 1);
        mp3_ym = soundPool.load(this,R.raw.yjikum,1 );
        mp3_zp = soundPool.load(this, R.raw.zjikup, 1);
        mp3_zm = soundPool.load(this,R.raw.zjikum,1 );

        //Paramètres du spinner
        spinner1=findViewById(R.id.spinner1);
        spinner2=findViewById(R.id.spinner2);
        spinner3=findViewById(R.id.spinner3);

        //Paramètres de groupe de boutons radio et acquisition de valeur
        rg =findViewById(R.id.RBGroup);
        rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                RBid = findViewById(checkedId);
            }
        });

        //Réglage des boutons de démarrage et de déconnexion
        Button ran = findViewById(R.id.Ran);
        Button end = findViewById(R.id.End);

        //Traitement lorsque le bouton de démarrage de la connexion est enfoncé
        ran.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(null != timer1){
                    timer1.cancel();
                    timer1 = null;
                }

                xp=yp=zp=xm=ym=zm=0;

                //Réglage du retard
                String delay = ((EditText)findViewById(R.id.Delay)).getText().toString();
                Delay = Long.parseLong(delay);

                //Communication UDP démarrée
                timer1 = new Timer();
                timerTask1 = new mTimerTask1();
                timer1.schedule(timerTask1,0, Delay);

                //Contrôle à l'aide d'un capteur d'accélération
                timer2 = new Timer();
                timerTask2 = new mTimerTask2();
                timer2.schedule(timerTask2,0,Delay);
            }
        });

        end.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                if(null != timer1){
                    timer1.cancel();
                    timer1 = null;
                }

                //Paramètres d'adresse IP et de numéro de port
                final String address = ((EditText) findViewById(R.id.IP_Address)).getText().toString();
                String port = ((EditText) findViewById(R.id.Port)).getText().toString();
                int Port = Integer.parseInt(port);

                //Paramètres d'envoi de "sortie"
                String exit = "exit";
                byte buf[] = new byte[exit.length()];
                try {
                    buf = exit.getBytes("SHIFT_JIS");
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }

                //Début de la communication UDP
                InetSocketAddress inetSocketAddress = new InetSocketAddress(address, Port);
                final DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length, inetSocketAddress);
                AsyncTask<DatagramPacket, Void, Void> task = new AsyncTask<DatagramPacket, Void, Void>() {
                    @Override
                    protected Void doInBackground(DatagramPacket... datagramPackets) {
                        DatagramSocket datagramSocket = null;
                        try {
                            datagramSocket = new DatagramSocket();
                            datagramSocket.send(datagramPackets[0]);
                            datagramSocket.close();
                        } catch (SocketException e) {
                            e.printStackTrace();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        return null;
                    }

                };
                task.execute(datagramPacket);

            }
        });

    }



    @Override
    protected void onResume(){
        super.onResume();
        //Inscription à l'écouteur d'événements
        Sensor accel = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        sensorManager.registerListener((SensorEventListener) this,accel,SensorManager.SENSOR_DELAY_NORMAL);
    }

    @Override
    protected void onPause(){
        super.onPause();
        //Écouteur d'événement non enregistré
        sensorManager.unregisterListener((SensorEventListener) this);
    }

    //Paramètres d'affichage de la valeur du capteur d'accélération et de transmission via la communication UDP
    @Override
    public void onSensorChanged(SensorEvent event){
        if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){

            data_X= (500+event.values[0]*25);
            data_Y= (500+event.values[1]*25);
            data_Z= (500+event.values[2]*25);

            data_x = (int)data_X;
            data_y = (int)data_Y;
            data_z = (int)data_Z;
            Data = data_x + " " +
                    data_y + " " +
                    data_z;
            X_Data_TextView.setText(String.valueOf(data_x));
            Y_Data_TextView.setText(String.valueOf(data_y));
            Z_Data_TextView.setText(String.valueOf(data_z));
        }
    }

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

    }

    //Contrôle à l'aide de la valeur du capteur d'accélération
    private class mTimerTask2 extends TimerTask{
        @Override
        public void run() {
            handler.post(new Runnable() {
                @Override
                public void run() {

                    spn1=spinner1.getSelectedItemPosition();
                    spn2=spinner2.getSelectedItemPosition();
                    spn3=spinner3.getSelectedItemPosition();

                    x=((EditText)findViewById(R.id.x_if)).getText().toString();
                    y=((EditText)findViewById(R.id.y_if)).getText().toString();
                    z=((EditText)findViewById(R.id.z_if)).getText().toString();
                    X=Integer.parseInt(x);
                    Y=Integer.parseInt(y);
                    Z=Integer.parseInt(z);

                    if(RBid==(findViewById(R.id.x_button))&&spn1==0&&data_x>=X){
                        xp += 1;
                        if (xp == 1) {
                            yp=zp=xm=ym=zm=0;
                            soundPool.play(mp3_xp, 2, 2, 0, 0, 1f);
                        }
                    }
                    else if(RBid==(findViewById(R.id.x_button))&&spn1==1&&data_x<=X){
                        xm += 1;
                        if (xm == 1) {
                            xp=yp=zp=ym=zm=0;
                            soundPool.play(mp3_xm, 2, 2, 0, 0, 1f);
                        }
                    }
                    else if(RBid==(findViewById(R.id.y_button))&&spn2==0&&data_y>=Y){
                        yp += 1;
                        if (yp == 1) {
                            xp=zp=xm=ym=zm=0;
                            soundPool.play(mp3_yp, 2, 2, 0, 0, 1f);
                        }
                    }
                    else if(RBid==(findViewById(R.id.y_button))&&spn2==1&&data_y<=Y){
                        ym += 1;
                        if (ym == 1) {
                            xp=yp=zp=xm=zm=0;
                            soundPool.play(mp3_ym, 2, 2, 0, 0, 1f);
                        }
                    }
                    else if(RBid==(findViewById(R.id.z_button))&&spn3==0&&data_z>=Z){
                        zp += 1;
                        if (zp == 1) {
                            xp=yp=xm=ym=zm=0;
                            soundPool.play(mp3_zp, 2, 2, 0, 0, 1f);
                        }
                    }
                    else if(RBid==(findViewById(R.id.z_button))&&spn3==1&&data_z<=Z){
                        zm += 1;
                        if (zm == 1) {
                            xp=yp=zp=xm=ym=0;
                            soundPool.play(mp3_zm, 2, 2, 0, 0, 1f);
                        }
                    }
                    else{
                        xp=xm=yp=ym=zp=zm=0;
                    }
                }
            });
        }

    }

    //Communication UDP
    private class mTimerTask1 extends TimerTask{
        @Override
        public void run(){

            handler.post(new Runnable() {
                @Override
                public void run() {
                    final String address = ((EditText) findViewById(R.id.IP_Address)).getText().toString();
                    String port = ((EditText) findViewById(R.id.Port)).getText().toString();
                    int Port = Integer.parseInt(port);
                    byte buf[] = new byte[Data.length()];

                    try {
                        buf = Data.getBytes("SHIFT_JIS");
                    } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();
                    }

                    InetSocketAddress inetSocketAddress = new InetSocketAddress(address, Port);
                    final DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length, inetSocketAddress);


                    AsyncTask<DatagramPacket, Void, Void> task = new AsyncTask<DatagramPacket, Void, Void>() {
                        @Override
                        protected Void doInBackground(DatagramPacket... datagramPackets) {
                            DatagramSocket datagramSocket = null;

                            try {
                                datagramSocket = new DatagramSocket();
                                datagramSocket.send(datagramPackets[0]);
                                datagramSocket.close();
                            } catch (SocketException e) {
                                e.printStackTrace();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }

                            return null;
                        }

                    };
                    task.execute(datagramPacket);
                }
            });

        }
    }
}

Recommended Posts

Applications de contrôle et de communication UDP basées sur Android utilisant des valeurs de capteur d'accélération
Une application qui acquiert la valeur du capteur d'accélération par communication UDP entre C # et Android
Construction d'un serveur d'autorisation utilisant Authlete et communication depuis le client OAuth (application Web)