1

私はしばらくの間、arduinoで作業していましたが、今はアンドロイドスタジオでブルーティースモジュールに接続しようとしています。私は接続するために青い歯を得ることができましたが、私はアプリケーションが閉じられても実行できるように青い歯の接続をサービスにする問題があります。私が携帯電話でサービスを実行しようとするたびに、前回と同じように青い歯のモジュールに接続しようとするとすぐにアプリケーションがクラッシュしてしまいます。私は、サービスと青い歯の使用に関する多くのリンクとガイドを見てきましたが、私の望むものとまったく同じものはありません。arduinoブルートゥースモジュールに信号を送るブルートゥースサービスを作る

以下

は、いくつかのコードスニペットですが、ここで私が動作するようになった全体GitHub project

Bluetoothの活動へのリンクです:

package edu.memphis.teamhack.smart_nightlight; 

import android.Manifest; 
import android.bluetooth.BluetoothAdapter; 
import android.bluetooth.BluetoothDevice; 
import android.bluetooth.BluetoothSocket; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.content.SharedPreferences; 
import android.content.pm.PackageManager; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.SystemClock; 
import android.support.v4.app.ActivityCompat; 
import android.support.v4.content.ContextCompat; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.CheckBox; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.Toast; 

import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.io.UnsupportedEncodingException; 
import java.lang.reflect.Method; 
import java.util.Set; 
import java.util.UUID; 



public class BluetoothActivity extends AppCompatActivity { 

    // GUI Components 
    private TextView mBluetoothStatus; 
    private TextView mReadBuffer; 
    private Button mScanBtn; 
    private Button mOffBtn; 
    private Button mListPairedDevicesBtn; 
    private Button mDiscoverBtn; 
    private BluetoothAdapter mBTAdapter; 
    private Set<BluetoothDevice> mPairedDevices; 
    private ArrayAdapter<String> mBTArrayAdapter; 
    private ListView mDevicesListView; 
    private CheckBox mLED1; 

    private final String TAG = MainActivity.class.getSimpleName(); 
    private Handler mHandler; // Our main handler that will receive callback notifications 
    private ConnectedThread mConnectedThread; // bluetooth background worker thread to send and receive data 
    private BluetoothSocket mBTSocket = null; // bi-directional client-to-client data path 

    private static final UUID BTMODULEUUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); // "random" unique identifier 


    // #defines for identifying shared types between calling functions 
    private final static int REQUEST_ENABLE_BT = 1; // used to identify adding bluetooth names 
    private final static int MESSAGE_READ = 2; // used in bluetooth handler to identify message update 
    private final static int CONNECTING_STATUS = 3; // used in bluetooth handler to identify message status 


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

     mBluetoothStatus = (TextView)findViewById(R.id.bluetoothStatus); 
     mReadBuffer = (TextView) findViewById(R.id.readBuffer); 
     mScanBtn = (Button)findViewById(R.id.scan); 
     mOffBtn = (Button)findViewById(R.id.off); 
     mDiscoverBtn = (Button)findViewById(R.id.discover); 
     mListPairedDevicesBtn = (Button)findViewById(R.id.PairedBtn); 
     mLED1 = (CheckBox)findViewById(R.id.checkboxLED1); 

     mBTArrayAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1); 
     mBTAdapter = BluetoothAdapter.getDefaultAdapter(); // get a handle on the bluetooth radio 

     mDevicesListView = (ListView)findViewById(R.id.devicesListView); 
     mDevicesListView.setAdapter(mBTArrayAdapter); // assign model to view 
     mDevicesListView.setOnItemClickListener(mDeviceClickListener); 


     // Ask for location permission if not already allowed 
     if(ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) 
      ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 1); 


     mHandler = new Handler(){ 
      public void handleMessage(android.os.Message msg){ 
       if(msg.what == MESSAGE_READ){ 
        String readMessage = null; 
        try { 
         readMessage = new String((byte[]) msg.obj, "UTF-8"); 
        } catch (UnsupportedEncodingException e) { 
         e.printStackTrace(); 
        } 
        mReadBuffer.setText(readMessage); 
       } 

       if(msg.what == CONNECTING_STATUS){ 
        if(msg.arg1 == 1) 
         mBluetoothStatus.setText("Connected to Device: " + (String)(msg.obj)); 
        else 
         mBluetoothStatus.setText("Connection Failed"); 
       } 
      } 
     }; 

     if (mBTArrayAdapter == null) { 
      // Device does not support Bluetooth 
      mBluetoothStatus.setText("Status: Bluetooth not found"); 
      Toast.makeText(getApplicationContext(),"Bluetooth device not found!",Toast.LENGTH_SHORT).show(); 
     } 
     else { 
      mLED1.setOnClickListener(new View.OnClickListener(){ 
       @Override 
       public void onClick(View v){ 
        SharedPreferences settings = getSharedPreferences("MyPref", 
          Context.MODE_PRIVATE); 
        Integer myInt = settings.getInt("colorHex", 0); 
        if(mConnectedThread != null){ //First check to make sure thread created 
         mConnectedThread.write(myInt.toString());} 
       } 
      }); 


      mScanBtn.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        bluetoothOn(v); 
       } 
      }); 

      mOffBtn.setOnClickListener(new View.OnClickListener(){ 
       @Override 
       public void onClick(View v){ 
        bluetoothOff(v); 
       } 
      }); 

      mListPairedDevicesBtn.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v){ 
        listPairedDevices(v); 
       } 
      }); 

      mDiscoverBtn.setOnClickListener(new View.OnClickListener(){ 
       @Override 
       public void onClick(View v){ 
        discover(v); 
       } 
      }); 
     } 
    } 

    private void bluetoothOn(View view){ 
     if (!mBTAdapter.isEnabled()) { 
      Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
      startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); 
      mBluetoothStatus.setText("Bluetooth enabled"); 
      Toast.makeText(getApplicationContext(),"Bluetooth turned on",Toast.LENGTH_SHORT).show(); 

     } 
     else{ 
      Toast.makeText(getApplicationContext(),"Bluetooth is already on", Toast.LENGTH_SHORT).show(); 
     } 
    } 

    // Enter here after user selects "yes" or "no" to enabling radio 
    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent Data){ 
     // Check which request we're responding to 
     if (requestCode == REQUEST_ENABLE_BT) { 
      // Make sure the request was successful 
      if (resultCode == RESULT_OK) { 
       // The user picked a contact. 
       // The Intent's data Uri identifies which contact was selected. 
       mBluetoothStatus.setText("Enabled"); 
      } 
      else 
       mBluetoothStatus.setText("Disabled"); 
     } 
    } 

    private void bluetoothOff(View view){ 
     mBTAdapter.disable(); // turn off 
     mBluetoothStatus.setText("Bluetooth disabled"); 
     Toast.makeText(getApplicationContext(),"Bluetooth turned Off", Toast.LENGTH_SHORT).show(); 
    } 

    private void discover(View view){ 
     // Check if the device is already discovering 
     if(mBTAdapter.isDiscovering()){ 
      mBTAdapter.cancelDiscovery(); 
      Toast.makeText(getApplicationContext(),"Discovery stopped",Toast.LENGTH_SHORT).show(); 
     } 
     else{ 
      if(mBTAdapter.isEnabled()) { 
       mBTArrayAdapter.clear(); // clear items 
       mBTAdapter.startDiscovery(); 
       Toast.makeText(getApplicationContext(), "Discovery started", Toast.LENGTH_SHORT).show(); 
       registerReceiver(blReceiver, new IntentFilter(BluetoothDevice.ACTION_FOUND)); 
      } 
      else{ 
       Toast.makeText(getApplicationContext(), "Bluetooth not on", Toast.LENGTH_SHORT).show(); 
      } 
     } 
    } 

    final BroadcastReceiver blReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 
      if(BluetoothDevice.ACTION_FOUND.equals(action)){ 
       BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
       // add the name to the list 
       mBTArrayAdapter.add(device.getName() + "\n" + device.getAddress()); 
       mBTArrayAdapter.notifyDataSetChanged(); 
      } 
     } 
    }; 

    private void listPairedDevices(View view){ 
     mPairedDevices = mBTAdapter.getBondedDevices(); 
     if(mBTAdapter.isEnabled()) { 
      // put it's one to the adapter 
      for (BluetoothDevice device : mPairedDevices) 
       mBTArrayAdapter.add(device.getName() + "\n" + device.getAddress()); 

      Toast.makeText(getApplicationContext(), "Show Paired Devices", Toast.LENGTH_SHORT).show(); 
     } 
     else 
      Toast.makeText(getApplicationContext(), "Bluetooth not on", Toast.LENGTH_SHORT).show(); 
    } 

    private AdapterView.OnItemClickListener mDeviceClickListener = new AdapterView.OnItemClickListener() { 
     public void onItemClick(AdapterView<?> av, View v, int arg2, long arg3) { 

      if(!mBTAdapter.isEnabled()) { 
       Toast.makeText(getBaseContext(), "Bluetooth not on", Toast.LENGTH_SHORT).show(); 
       return; 
      } 

      mBluetoothStatus.setText("Connecting..."); 
      // Get the device MAC address, which is the last 17 chars in the View 
      String info = ((TextView) v).getText().toString(); 
      final String address = info.substring(info.length() - 17); 
      final String name = info.substring(0,info.length() - 17); 

      // Spawn a new thread to avoid blocking the GUI one 
      new Thread() 
      { 
       public void run() { 
        boolean fail = false; 

        BluetoothDevice device = mBTAdapter.getRemoteDevice(address); 

        try { 
         mBTSocket = createBluetoothSocket(device); 
        } catch (IOException e) { 
         fail = true; 
         Toast.makeText(getBaseContext(), "Socket creation failed", Toast.LENGTH_SHORT).show(); 
        } 
        // Establish the Bluetooth socket connection. 
        try { 
         mBTSocket.connect(); 
        } catch (IOException e) { 
         try { 
          fail = true; 
          mBTSocket.close(); 
          mHandler.obtainMessage(CONNECTING_STATUS, -1, -1) 
            .sendToTarget(); 
         } catch (IOException e2) { 
          //insert code to deal with this 
          Toast.makeText(getBaseContext(), "Socket creation failed", Toast.LENGTH_SHORT).show(); 
         } 
        } 
        if(fail == false) { 

         mConnectedThread = new ConnectedThread(mBTSocket); 
         mConnectedThread.start(); 

         mHandler.obtainMessage(CONNECTING_STATUS, 1, -1, name) 
           .sendToTarget(); 
        } 
       } 
      }.start(); 
     } 
    }; 

    private BluetoothSocket createBluetoothSocket(BluetoothDevice device) throws IOException { 
     try { 
      final Method m = device.getClass().getMethod("createInsecureRfcommSocketToServiceRecord", UUID.class); 
      return (BluetoothSocket) m.invoke(device, BTMODULEUUID); 
     } catch (Exception e) { 
      Log.e(TAG, "Could not create Insecure RFComm Connection",e); 
     } 
     return device.createRfcommSocketToServiceRecord(BTMODULEUUID); 
    } 

    private class ConnectedThread extends Thread { 
     private final BluetoothSocket mmSocket; 
     private final InputStream mmInStream; 
     private final OutputStream mmOutStream; 

     public ConnectedThread(BluetoothSocket socket) { 
      mmSocket = socket; 
      InputStream tmpIn = null; 
      OutputStream tmpOut = null; 

      // Get the input and output streams, using temp objects because 
      // member streams are final 
      try { 
       tmpIn = socket.getInputStream(); 
       tmpOut = socket.getOutputStream(); 
      } catch (IOException e) { } 

      mmInStream = tmpIn; 
      mmOutStream = tmpOut; 
     } 

     public void run() { 
      byte[] buffer = new byte[1024]; // buffer store for the stream 
      int bytes; // bytes returned from read() 
      // Keep listening to the InputStream until an exception occurs 
      while (true) { 
       try { 
        // Read from the InputStream 
        bytes = mmInStream.available(); 
        if(bytes != 0) { 
         buffer = new byte[1024]; 
         SystemClock.sleep(100); //pause and wait for rest of data. Adjust this depending on your sending speed. 
         bytes = mmInStream.available(); // how many bytes are ready to be read? 
         bytes = mmInStream.read(buffer, 0, bytes); // record how many bytes we actually read 
         mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer) 
           .sendToTarget(); // Send the obtained bytes to the UI activity 
        } 
       } catch (IOException e) { 
        e.printStackTrace(); 

        break; 
       } 
      } 
     } 

     /* Call this from the main activity to send data to the remote device */ 
     public void write(String input) { 
      byte[] bytes = input.getBytes();   //converts entered String into bytes 
      try { 
       mmOutStream.write(bytes); 
      } catch (IOException e) { } 
     } 

     /* Call this from the main activity to shutdown the connection */ 
     public void cancel() { 
      try { 
       mmSocket.close(); 
      } catch (IOException e) { } 
     } 
    } 

ここでは、私が働いているのBluetoothサービスです:

package edu.memphis.teamhack.smart_nightlight; 

import android.app.Service; 
import android.bluetooth.BluetoothAdapter; 
import android.bluetooth.BluetoothDevice; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.os.Bundle; 
import android.os.IBinder; 
import android.support.v7.app.AppCompatActivity; 
import android.view.View; 
import android.widget.ArrayAdapter; 
import android.widget.Toast; 

public class BluetoothCommService extends Service { 


    // #defines for identifying shared types between calling functions 
    private final static int REQUEST_ENABLE_BT = 1; // used to identify adding bluetooth names 
    private BluetoothAdapter mBTAdapter; 
    private ArrayAdapter<String> mBTArrayAdapter; 

    public BluetoothCommService() { 
    } 

    public void onCreate(Bundle savedInstanceState){ 
     //super.onCreate(savedInstanceState); 
     mBTAdapter = BluetoothAdapter.getDefaultAdapter(); // get a handle on the bluetooth radio 
     mBTArrayAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1); 

    } 
    @Override 
    public IBinder onBind(Intent intent) { 
     // TODO: Return the communication channel to the service. 
     throw new UnsupportedOperationException("Not yet implemented"); 
    } 

    void bluetoothOn(View view){ 
     if (!mBTAdapter.isEnabled()) { 
      Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
      //startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); 

      //GUI 
      //mBluetoothStatus.setText("Bluetooth enabled"); 
      // Toast.makeText(getApplicationContext(),"Bluetooth turned on",Toast.LENGTH_SHORT).show(); 

     } 
     else{ 
      //Toast.makeText(getApplicationContext(),"Bluetooth is already on", Toast.LENGTH_SHORT).show(); 
     } 
    } 

    private void bluetoothOff(View view){ 
     mBTAdapter.disable(); // turn off 

     //GUI 
     //mBluetoothStatus.setText("Bluetooth disabled"); 
     //Toast.makeText(getApplicationContext(),"Bluetooth turned Off", Toast.LENGTH_SHORT).show(); 
    } 
    private void discover(View view){ 
     // Check if the device is already discovering 
     if(mBTAdapter.isDiscovering()){ 
      mBTAdapter.cancelDiscovery(); 
      Toast.makeText(getApplicationContext(),"Discovery stopped",Toast.LENGTH_SHORT).show(); 
     } 
     else{ 
      if(mBTAdapter.isEnabled()) { 
       mBTArrayAdapter.clear(); // clear items 
       mBTAdapter.startDiscovery(); 
       Toast.makeText(getApplicationContext(), "Discovery started", Toast.LENGTH_SHORT).show(); 
       registerReceiver(blReceiver, new IntentFilter(BluetoothDevice.ACTION_FOUND)); 
      } 
      else{ 
       Toast.makeText(getApplicationContext(), "Bluetooth not on", Toast.LENGTH_SHORT).show(); 
      } 
     } 
    } 
    final BroadcastReceiver blReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 
      if(BluetoothDevice.ACTION_FOUND.equals(action)){ 
       BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
       // add the name to the list 
       mBTArrayAdapter.add(device.getName() + "\n" + device.getAddress()); 
       mBTArrayAdapter.notifyDataSetChanged(); 
      } 
     } 
    }; 
} 

任意の質問をお気軽に。

+0

を参照することはあなたの何、例えば、 "それはクラッシュ" の定義しますログは言う?私たちにコードをダンプするだけでは、特にそれがたくさんある場合には、最初のアプローチとしては最適ではありません。 –

+0

現在インストールされているAPKのバージョンは、実際はBluetoothCommではサービスを拡張できません。 GUIをバックエンドから分離するのはちょっとした実験でした。従来の手段であるonClickListenerでボタンを押すと、btCom.bluetoothOn()を介してBluetoothCommオブジェクトメソッドが起動されます。 この実験はやや正統性がないかもしれません。 ただし、例外がスローされたように見えます。 https://pastebin.com/ZDQzFb1u –

+0

nullではないはずのものは何ですか? –

答えて

0

このinstructablesを試してみてください、私は、このチュートリアルにはより多くのアイデアのための

http://www.instructables.com/id/Android-Bluetooth-Control-LED-Part-2/

をrefferingことでそれをやったにも

https://www.intorobotics.com/how-to-develop-simple-bluetooth-android-application-to-control-a-robot-remote/

+0

ありがとうございます。私はこれを試して、それが動作するかどうかを見ます。 –

+0

これは非常に役に立ち、私は接続することができましたが、アプリケーションを終了するたびに、ブルートゥースはarduinoから切断されます。私はサービスにbluetoothコードを実装しようとしているので、arduinoは電話が接続されている限り接続を維持します。 –

関連する問題