2017-03-24 22 views
0

これは私がBluetooth経由でデータを送信するために使用したコードです。ボタンをクリックするとうまくいきますが、sendData(String ...)関数を直接呼び出すと使用できません。ボタンをクリックすることなく。AndroidでBluetooth経由でデータを送信する

クリックボタンを音声認識を使用するように変更しようとしています。

私は

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(); 
     } 
    });} 

を使用しかし、私は外のsendDataを移動した場合、それはここで

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

機能しない場合にはうまく機能は、完全なコードは

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);  
    } 
    } 
} 

答えて

1

されていますですOnCreate()の方法でsendData("b")を実行しようとしていますか?なぜなら、他のデバイスとの接続がまだ確立されていないため、動作しないからです。接続が確立されたらonResume()で実行してみてください。接続を確立した直後に送信を開始すると、最初のデータが失われる可能性があるため、スレッドを作成して1秒待って通信を開始してください。

関連する問題