1
votes

Existe-t-il un moyen de corriger l'interaction de l'écran de démarrage avec le code et d'éviter de planter?

Je configure cette application Bluetooth Android à l'aide du studio Android et j'ai du mal à afficher correctement l'écran de démarrage, puis à effectuer la transition avec le programme. Que dois-je faire pour que mon écran principal et mon écran de démarrage fonctionnent ensemble sans que le programme ne plante?

J'ai essayé de manipuler le manifeste pour que l'interface graphique principale et l'écran de démarrage fonctionnent ensemble, mais en général, un seul d'entre eux fonctionne , suivi d'un crash de l'application. J'utilise actuellement la dernière version d'Android Studio et j'ai révisé l'écran de démarrage plusieurs fois, mais je pense que le problème principal est lié au manifeste.

AndroidManifest

package com.example.harbit;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.os.Handler;

import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.UUID;

public class BTGU extends AppCompatActivity {

    //1)
    ImageButton IdListen, IdRecord,IdFiles,IdDisconect;
    TextView IdBPM;
    //-------------------------------------------
    Handler bluetoothIn;
    final int handlerState = 0;
    private BluetoothAdapter btAdapter = null;
    private BluetoothSocket btSocket = null;
    private StringBuilder DataStringIN = new StringBuilder();
    private ConnectedThread MyConexionBT;
    // Unique identifier of service - SPP UUID
    private static final UUID BTMODULEUUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
    // String for MAC address
    private static String address = null;
    //-------------------------------------------

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_btgu);
        //Link buttons to on click listeners
        IdListen = (ImageButton) findViewById(R.id.IdListen);
        IdRecord = (ImageButton) findViewById(R.id.IdRecord);
        IdFiles = (ImageButton) findViewById(R.id.IdFiles);
        IdDisconect = (ImageButton) findViewById(R.id.IdDisconect);
        IdBPM = (TextView) findViewById(R.id.IdBPM);

        bluetoothIn = new Handler() {
            public void handleMessage(android.os.Message msg) {
                if (msg.what == handlerState) {
                    String readMessage = (String) msg.obj;
                    DataStringIN.append(readMessage);

                    int endOfLineIndex = DataStringIN.indexOf("#");

                    if (endOfLineIndex > 0) {
                        String dataInPrint = DataStringIN.substring(0, endOfLineIndex);
                        IdBPM.setText("BPM: " + dataInPrint);
                        DataStringIN.delete(0, DataStringIN.length());
                    }
                }
            }
        };

        btAdapter = BluetoothAdapter.getDefaultAdapter(); // get Bluetooth adapter
        VerifyBT();

        // setup onClick listeners for the buttons
        // to indicate the following active after activation
        // of the onclick event
        // as an RXTX event
        IdListen.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v)
            {
                MyConexionBT.write("1");
            }
        });

        IdRecord.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                MyConexionBT.write("2");
            }
        });

        IdFiles.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v)
            {
              //----------------------------------------------------------------------------------------------------->>>>>>
            }
        });

        IdDisconect.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                if (btSocket!=null)
                {
                    try {btSocket.close();}
                    catch (IOException e)
                    { Toast.makeText(getBaseContext(), "Error", Toast.LENGTH_SHORT).show();;}
                }
                finish();
            }
        });
    }

    private BluetoothSocket createBluetoothSocket(BluetoothDevice device) throws IOException
    {
        //Safe exit removal of the device
        //using service UUID
        return device.createRfcommSocketToServiceRecord(BTMODULEUUID);
    }

    @Override
    public void onResume()
    {
        super.onResume();
        //get the MAC address from DeviceListActivity via intent
        Intent intent = getIntent();
        //get the MAC address from DeviceListActivity via EXTRA
        address = intent.getStringExtra(BT.EXTRA_DEVICE_ADDRESS);
        //Set the MAC address
        BluetoothDevice device = btAdapter.getRemoteDevice(address);

        try
        {
            btSocket = createBluetoothSocket(device);
        } catch (IOException e) {
            Toast.makeText(getBaseContext(), "Socket creation failed", Toast.LENGTH_LONG).show();
        }
        // establish connection with Bluetooth socket.
        try
        {
            btSocket.connect();
        } catch (IOException e) {
            try {
                btSocket.close();
            } catch (IOException e2) {}
        }
        MyConexionBT = new ConnectedThread(btSocket);
        MyConexionBT.start();
    }

    @Override
    public void onPause()
    {
        super.onPause();
        try
        { // when out of the app this allows for the closing of the socket
            btSocket.close();
        } catch (IOException e2) {}
    }

    //check the device bluetooth and if off pop a message to turn it on
    private void VerifyBT() {

        if(btAdapter==null) {
            Toast.makeText(getBaseContext(), "Device does not support Bluetooth", Toast.LENGTH_LONG).show();
        } else {
            if (btAdapter.isEnabled()) {
            } else {
                Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                startActivityForResult(enableBtIntent, 1);
            }
        }
    }

    //Create the class that enables the event of connectivity
    private class ConnectedThread extends Thread
    {
        private final InputStream mmInStream;
        private final OutputStream mmOutStream;

        public ConnectedThread(BluetoothSocket socket)
        {
            InputStream tmpIn = null;
            OutputStream tmpOut = null;
            try
            {
                tmpIn = socket.getInputStream();
                tmpOut = socket.getOutputStream();
            } catch (IOException e) { }
            mmInStream = tmpIn;
            mmOutStream = tmpOut;
        }
// set up Rx for incoming data
        public void run()
        {
            byte[] buffer = new byte[256];
            int bytes;

            // Begin listen mode to determine the incoming data
            while (true) {
                try {
                    bytes = mmInStream.read(buffer);
                    String readMessage = new String(buffer, 0, bytes);
                    // Send the obtained data to the event via handler
                    bluetoothIn.obtainMessage(handlerState, bytes, -1, readMessage).sendToTarget();
                } catch (IOException e) {
                    break;
                }
            }
        }
        //String TX to the receiving device
        public void write(String input)
        {
            try {
                mmOutStream.write(input.getBytes());
            }
            catch (IOException e)
            {
                //If TX not available close connectivity
                Toast.makeText(getBaseContext(), "Connection failed", Toast.LENGTH_LONG).show();
                finish();
            }
        }
    }
}


2 commentaires

pouvez-vous mettre un journal ici lorsque l'application plante? Nous devons comprendre pourquoi votre application plante. et en essayant de le réparer.


vous devriez également mettre finish () dans le splashActivity. Mais pour que nous le comprenions mieux, mettez les journaux d'erreurs dans votre question


3 Réponses :


0
votes

Je pense que vous devriez corriger le fichier AndroidManifest de votre application. Cela peut être le suivant:

package com.example.harbit;

import android.content.Intent;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class Splash extends AppCompatActivity {

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

    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            Intent intent = new Intent(Splash.this, BTGU.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP 
                  | Intent.FLAG_ACTIVITY_CLEAR_TASK 
                  | Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(intent);
        }
    },4000);

  }
}

Et votre activité de démarrage peut être:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.harbit">

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

 <application
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme">

    <activity
        android:name=".Splash"
        android:theme="@style/Theme.AppCompat.Light.NoActionBar">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".BTGU"/>
    <activity android:name=".BTGU"/>
    <activity android:name=".REC"/>

  </application>
</manifest> 


4 commentaires

la partie du code que vous avez ajoutée dans l'activité de démarrage semble contenir des erreurs | Intent.FLAG_ACTIVITY_CLEAR_TASK cette partie a besoin d'un point-virgule mais ne fonctionne toujours pas | Intent.FLAG_ACTIVITY_NEW_TASK); bien que cela semble la même syntaxe que l'indicateur d'intention ci-dessus, ils ne sont pas les mêmes et même lorsqu'ils correspondent, le programme ne les reconnaît pas comme des fonctions


Il n'a pas besoin de point-virgule. Veuillez exécuter le code sans mettre de point-virgule. Et ajoutez votre erreur ici.


Veuillez partager le code de l'activité BTGU. Le problème est dans l'activité BTGU en fait.


J'ai ajouté le code pour BTGU (interface utilisateur générale Bluetooth)



0
votes
Intent Intent = new Intent(Splash.this, BTGU.class);
//I dont know how you plan to obatained the address
intent.putExtra(BT.EXTRA_DEVICE_ADDRESS, "A VALID ADDRESS");
startActivity(Intent);

0 commentaires

0
votes

Vous essayez de récupérer des intentions supplémentaires via une activité BTGU, mais vous ne les avez pas envoyées à partir de l'activité SplashActivity. Vous devez ajouter le code suivant dans SplashActivity.

private String getMacAddress(){
    BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    String bluetoothMacAddress = "";
    try {
        Field mServiceField = bluetoothAdapter.getClass().getDeclaredField("mService");
        mServiceField.setAccessible(true);

        Object btManagerService = mServiceField.get(bluetoothAdapter);

        if (btManagerService != null) {
            bluetoothMacAddress = (String) btManagerService.getClass().getMethod("getAddress").invoke(btManagerService);
        }
    } catch (NoSuchFieldException | NoSuchMethodException | IllegalAccessException | InvocationTargetException ignore) {

    }
    return bluetoothMacAddress;
}

Vous pouvez obtenir l'adresse MAC via la méthode suivante ou essayer votre propre méthode pour obtenir l'adresse mac:

Intent intent = new Intent(Splash.this, BTGU.class);
intent.putExtra(BT.EXTRA_DEVICE_ADDRESS, getMacAddress());
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP 
              | Intent.FLAG_ACTIVITY_CLEAR_TASK 
              | Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);


4 commentaires

L'obtention de l'adresse MAC via votre méthode s'appliquerait même si je n'utilise pas le WIFI et que l'appareil que j'essaie de me connecter n'utilise pas le wifi


Édité. Vous pouvez essayer maintenant.


maintenant, il ignore l'une des activités de sélection des appareils Bluetooth couplés, au lieu de vous permettre de sélectionner un appareil, un écran blanc saute cette étape et va directement dans l'écran de contrôle.


avec la méthode d'adresse MAC wifi, il s'est écrasé après avoir appuyé sur l'un des boutons, et avec cette nouvelle méthode, il se bloque après l'écran de démarrage, comme avant