2017-03-24 6 views
0

Hier ist der Code, den ich verwendet, um Daten über Bluetooth zu senden, funktioniert es gut, wenn ich auf die Schaltfläche klicken, aber ich kann es nicht verwenden, wenn ich direkt die Funktion sendData (String ...) ohne auf den Button zu klicken.Senden von Daten über Bluetooth in Android

Ich versuche, das Klicken zu ändern, um Spracherkennung zu verwenden.

Es funktioniert gut, wenn ich

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    Log.d(TAG, "In onCreate()"); 

    setContentView(R.layout.main); 

    btnOn = (Button) findViewById(R.id.btnOn); 
    btnOff = (Button) findViewById(R.id.btnOff); 

    btAdapter = BluetoothAdapter.getDefaultAdapter(); 
    checkBTState(); 

    btnOn.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
     sendData("a"); 
     Toast msg = Toast.makeText(getBaseContext(), 
      "You have clicked On", Toast.LENGTH_SHORT); 
     msg.show(); 
     } 
    }); 

    btnOff.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
     sendData("b"); 
     Toast msg = Toast.makeText(getBaseContext(), 
      "You have clicked Off", Toast.LENGTH_SHORT); 
     msg.show(); 
     } 
    });} 

verwenden, aber wenn ich die senddata außen bewegen, es funktioniert nicht

btnOff.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
     } 
    }); 
sendData("b"); 

Hier ist der vollständige Code

import java.io.IOException; 
import java.io.OutputStream; 
import java.util.UUID; 
import java.util.concurrent.TimeUnit; 
import com.example.ledonoff.R; 

import android.app.Activity; 
import android.bluetooth.BluetoothAdapter; 
import android.bluetooth.BluetoothDevice; 
import android.bluetooth.BluetoothSocket; 
import android.content.Intent; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 

import android.widget.Toast; 
import android.speech.RecognizerIntent; 

import java.util.ArrayList; 
import java.util.Locale; 
import android.content.ActivityNotFoundException; 

public class LEDOnOff extends Activity { 
    private static final String TAG = "LEDOnOff"; 

    Button btnOn, btnOff, btnSpeak; 
    public String cmd = "none"; 
    private final int SPEECH_RECOGNITION_CODE = 1; 
    private static final int REQUEST_ENABLE_BT = 1; 
    private BluetoothAdapter btAdapter = null; 
    private BluetoothSocket btSocket = null; 
    private OutputStream outStream = null; 
    private TextView textout; 
    // Well known SPP UUID 
    private static final UUID MY_UUID = 
     UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); 

    // Insert your bluetooth devices MAC address 
    private static String address = "98:D3:32:10:91:1F"; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    Log.d(TAG, "In onCreate()"); 

    setContentView(R.layout.main); 

    btnOn = (Button) findViewById(R.id.btnOn); 
    btnOff = (Button) findViewById(R.id.btnOff); 
    btnSpeak = (Button) findViewById(R.id.btnSpeak); 
    textout = (TextView) findViewById(R.id.textout); 

    btAdapter = BluetoothAdapter.getDefaultAdapter(); 
    checkBTState(); 

    btnOn.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
     sendData("a"); 
     Toast msg = Toast.makeText(getBaseContext(), 
      "You have clicked On", Toast.LENGTH_SHORT); 
     msg.show(); 
     } 
    }); 

    btnOff.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
     sendData("b"); 
     Toast msg = Toast.makeText(getBaseContext(), 
      "You have clicked Off", Toast.LENGTH_SHORT); 
     msg.show(); 
     } 
    }); 

     btnSpeak.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
      startSpeechToText(); 

      } 
     }); 

    } 




    /** 
    * Start speech to text intent. This opens up Google Speech Recognition API dialog box to listen the speech input. 
    * */ 
    private void startSpeechToText() { 
     Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
     intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault()); 
     intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, 
       RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 
     intent.putExtra(RecognizerIntent.EXTRA_PROMPT, 
       "Speak something..."); 
     try { 
      startActivityForResult(intent, SPEECH_RECOGNITION_CODE); 
     } catch (ActivityNotFoundException a) { 
      Toast.makeText(getApplicationContext(), 
        "Sorry! Speech recognition is not supported in this device.", 
        Toast.LENGTH_SHORT).show(); 
     } 
    } 
    /** 
    * Callback for speech recognition activity 
    * */ 
    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     switch (requestCode) { 
      case SPEECH_RECOGNITION_CODE: { 
       if (resultCode == RESULT_OK && null != data) { 
        ArrayList<String> result = data 
          .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); 
        String text = result.get(0); 
        textout.setText(text); 

       } 


       break; 


      } 
     } 
    } 

    public String VoiceFilter(String str_voice_input){ 


     if(str_voice_input.contains("on")){sendData("a"); //TEST SENDING DATA 
      return "a" ; 
     } 

     if(str_voice_input.contains("off")){sendData("b"); //TEST SENDING DATA 
      return "b" ; 
     } 

     return "c"; 


    } 

    @Override 
    public void onResume() { 
    super.onResume(); 

    Log.d(TAG, "...In onResume - Attempting client connect..."); 

    // Set up a pointer to the remote node using it's address. 
    BluetoothDevice device = btAdapter.getRemoteDevice(address); 

    // Two things are needed to make a connection: 
    // A MAC address, which we got above. 
    // A Service ID or UUID. In this case we are using the 
    //  UUID for SPP. 
    try { 
     btSocket = device.createRfcommSocketToServiceRecord(MY_UUID); 
    } catch (IOException e) { 
     errorExit("Fatal Error", "In onResume() and socket create failed: " + e.getMessage() + "."); 
    } 

    // Discovery is resource intensive. Make sure it isn't going on 
    // when you attempt to connect and pass your message. 
    btAdapter.cancelDiscovery(); 

    // Establish the connection. This will block until it connects. 
    Log.d(TAG, "...Connecting to Remote..."); 
    try { 
     btSocket.connect(); 
     Log.d(TAG, "...Connection established and data link opened..."); 
    } catch (IOException e) { 
     try { 
     btSocket.close(); 
     } catch (IOException e2) { 
     errorExit("Fatal Error", "In onResume() and unable to close socket during connection failure" + e2.getMessage() + "."); 
     } 
    } 

    // Create a data stream so we can talk to server. 
    Log.d(TAG, "...Creating Socket..."); 

    try { 
     outStream = btSocket.getOutputStream(); 
    } catch (IOException e) { 
     errorExit("Fatal Error", "In onResume() and output stream creation failed:" + e.getMessage() + "."); 
    } 
    } 

    @Override 
    public void onPause() { 
    super.onPause(); 

    Log.d(TAG, "...In onPause()..."); 

    if (outStream != null) { 
     try { 
     outStream.flush(); 
     } catch (IOException e) { 
     errorExit("Fatal Error", "In onPause() and failed to flush output stream: " + e.getMessage() + "."); 
     } 
    } 

    try  { 
     btSocket.close(); 
    } catch (IOException e2) { 
     errorExit("Fatal Error", "In onPause() and failed to close socket." + e2.getMessage() + "."); 
    } 
    } 

    private void checkBTState() { 
    // Check for Bluetooth support and then check to make sure it is turned on 

    // Emulator doesn't support Bluetooth and will return null 
    if(btAdapter==null) { 
     errorExit("Fatal Error", "Bluetooth Not supported. Aborting."); 
    } else { 
     if (btAdapter.isEnabled()) { 
     Log.d(TAG, "...Bluetooth is enabled..."); 
     } else { 
     //Prompt user to turn on Bluetooth 
     Intent enableBtIntent = new Intent(btAdapter.ACTION_REQUEST_ENABLE); 
     startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); 
     } 
    } 
    } 

    private void errorExit(String title, String message){ 
    Toast msg = Toast.makeText(getBaseContext(), 
     title + " - " + message, Toast.LENGTH_SHORT); 
    msg.show(); 
    finish(); 
    } 

    private void sendData(String message) { 
    byte[] msgBuffer = message.getBytes(); 

    Log.d(TAG, "...Sending data: " + message + "..."); 

    try { 
     outStream.write(msgBuffer); 
    } catch (IOException e) { 
     String msg = "In onResume() and an exception occurred during write: " + e.getMessage(); 
     if (address.equals("00:00:00:00:00:00")) 
     msg = msg + ".\n\nUpdate your server address from 00:00:00:00:00:00 to the correct address on line 37 in the java code"; 
     msg = msg + ".\n\nCheck that the SPP UUID: " + MY_UUID.toString() + " exists on server.\n\n"; 

     errorExit("Fatal Error", msg);  
    } 
    } 
} 

Antwort

1

Sind Sie versuchen, sendData("b") in OnCreate() Methode auszuführen? Denn dann wird es nicht funktionieren, da die Verbindung noch nicht mit anderen Geräten hergestellt wurde. Versuchen Sie es in onResume() auszuführen, nachdem die Verbindung hergestellt wurde. Das Starten der Übertragung unmittelbar nach dem Herstellen der Verbindung kann zu einem anfänglichen Datenverlust führen. Erstellen Sie daher einen Thread, warten Sie eine Sekunde und beginnen Sie mit der Kommunikation.

Verwandte Themen