2016-10-28 3 views
0

ここでArduinoとのBluetooth接続の簡単な例が見つかりました。 http://www.instructables.com/id/Android-Bluetooth-Control-LED-Part-2/ フルプロジェクトをダウンロード: http://www.instructables.com/id/Android-Bluetooth-Control-LED-Part-2/step9/Download/ 著者Deysonに感謝します! これは、2つのAcitvitiesをHASE: 1)DeviceList.java これはペアリング装置を示し、あなたが所望のものを選択することができる:Androidスタジオのアクティビティ間でBluetooth接続を渡す

package com.led.led; 
import android.content.Intent; 
import android.support.v7.app.ActionBarActivity; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.ListView; 
import android.bluetooth.BluetoothAdapter; 
import android.bluetooth.BluetoothDevice; 
import android.widget.TextView; 
import android.widget.Toast; 

import java.util.ArrayList; 
import java.util.Set; 


public class DeviceList extends ActionBarActivity 
{ 
//widgets 
Button btnPaired; 
ListView devicelist; 
//Bluetooth 
private BluetoothAdapter myBluetooth = null; 
private Set<BluetoothDevice> pairedDevices; 
public static String EXTRA_ADDRESS = "device_address"; 

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

    //Calling widgets 
    btnPaired = (Button)findViewById(R.id.button); 
    devicelist = (ListView)findViewById(R.id.listView); 

    //if the device has bluetooth 
    myBluetooth = BluetoothAdapter.getDefaultAdapter(); 

    if(myBluetooth == null) 
    { 
     //Show a mensag. that the device has no bluetooth adapter 
     Toast.makeText(getApplicationContext(), "Bluetooth Device Not Available", Toast.LENGTH_LONG).show(); 

     //finish apk 
     finish(); 
    } 
    else if(!myBluetooth.isEnabled()) 
    { 
      //Ask to the user turn the bluetooth on 
      Intent turnBTon = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
      startActivityForResult(turnBTon,1); 
    } 

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

} 

private void pairedDevicesList() 
{ 
    pairedDevices = myBluetooth.getBondedDevices(); 
    ArrayList list = new ArrayList(); 

    if (pairedDevices.size()>0) 
    { 
     for(BluetoothDevice bt : pairedDevices) 
     { 
      list.add(bt.getName() + "\n" + bt.getAddress()); //Get the device's name and the address 
     } 
    } 
    else 
    { 
     Toast.makeText(getApplicationContext(), "No Paired Bluetooth Devices Found.", Toast.LENGTH_LONG).show(); 
    } 

    final ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1, list); 
    devicelist.setAdapter(adapter); 
    devicelist.setOnItemClickListener(myListClickListener); //Method called when the device from the list is clicked 

} 

private AdapterView.OnItemClickListener myListClickListener = new AdapterView.OnItemClickListener() 
{ 
    public void onItemClick (AdapterView<?> av, View v, int arg2, long arg3) 
    { 
     // Get the device MAC address, the last 17 chars in the View 
     String info = ((TextView) v).getText().toString(); 
     String address = info.substring(info.length() - 17); 

     // Make an intent to start next activity. 
     Intent i = new Intent(DeviceList.this, ledControl.class); 

     //Change the activity. 
     i.putExtra(EXTRA_ADDRESS, address); //this will be received at ledControl (class) Activity 
     startActivity(i); 
    } 
}; 


@Override 
public boolean onCreateOptionsMenu(Menu menu) 
{ 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_device_list, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
    } 
} 

2)ledControl.javaこれはボタンとcommuincationを有している:

package com.led.led; 

import android.support.v7.app.ActionBarActivity; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 

import android.bluetooth.BluetoothSocket; 
import android.content.Intent; 
import android.view.View; 
import android.widget.Button; 
import android.widget.SeekBar; 
import android.widget.TextView; 
import android.widget.Toast; 
import android.app.ProgressDialog; 
import android.bluetooth.BluetoothAdapter; 
import android.bluetooth.BluetoothDevice; 
import android.os.AsyncTask; 

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


public class ledControl extends ActionBarActivity { 

Button btnOn, btnOff, btnDis; 
SeekBar brightness; 
TextView lumn; 
String address = null; 
private ProgressDialog progress; 
BluetoothAdapter myBluetooth = null; 
BluetoothSocket btSocket = null; 
private boolean isBtConnected = false; 
//SPP UUID. Look for it 
static final UUID myUUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); 

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 

    Intent newint = getIntent(); 
    address = newint.getStringExtra(DeviceList.EXTRA_ADDRESS); //receive the address of the bluetooth device 

    //view of the ledControl 
    setContentView(R.layout.activity_led_control); 

    //call the widgtes 
    btnOn = (Button)findViewById(R.id.button2); 
    btnOff = (Button)findViewById(R.id.button3); 
    btnDis = (Button)findViewById(R.id.button4); 
    brightness = (SeekBar)findViewById(R.id.seekBar); 
    lumn = (TextView)findViewById(R.id.lumn); 

    new ConnectBT().execute(); //Call the class to connect 

    //commands to be sent to bluetooth 
    btnOn.setOnClickListener(new View.OnClickListener() 
    { 
     @Override 
     public void onClick(View v) 
     { 
      turnOnLed();  //method to turn on 
     } 
    }); 

    btnOff.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) 
     { 
      turnOffLed(); //method to turn off 
     } 
    }); 

    btnDis.setOnClickListener(new View.OnClickListener() 
    { 
     @Override 
     public void onClick(View v) 
     { 
      Disconnect(); //close connection 
     } 
    }); 

    brightness.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
     @Override 
     public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
      if (fromUser==true) 
      { 
       lumn.setText(String.valueOf(progress)); 
       try 
       { 
        btSocket.getOutputStream().write(String.valueOf(progress).getBytes()); 
       } 
       catch (IOException e) 
       { 

       } 
      } 
     } 

     @Override 
     public void onStartTrackingTouch(SeekBar seekBar) { 

     } 

     @Override 
     public void onStopTrackingTouch(SeekBar seekBar) { 

     } 
    }); 
} 

private void Disconnect() 
{ 
    if (btSocket!=null) //If the btSocket is busy 
    { 
     try 
     { 
      btSocket.close(); //close connection 
     } 
     catch (IOException e) 
     { msg("Error");} 
    } 
    finish(); //return to the first layout 

} 

private void turnOffLed() 
{ 
    if (btSocket!=null) 
    { 
     try 
     { 
      btSocket.getOutputStream().write("TF".toString().getBytes()); 
     } 
     catch (IOException e) 
     { 
      msg("Error"); 
     } 
    } 
} 

private void turnOnLed() 
{ 
    if (btSocket!=null) 
    { 
     try 
     { 
      btSocket.getOutputStream().write("TO".toString().getBytes()); 
     } 
     catch (IOException e) 
     { 
      msg("Error"); 
     } 
    } 
} 

// fast way to call Toast 
private void msg(String s) 
{ 
    Toast.makeText(getApplicationContext(),s,Toast.LENGTH_LONG).show(); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_led_control, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

private class ConnectBT extends AsyncTask<Void, Void, Void> // UI thread 
{ 
    private boolean ConnectSuccess = true; //if it's here, it's almost connected 

    @Override 
    protected void onPreExecute() 
    { 
     progress = ProgressDialog.show(ledControl.this, "Connecting...", "Please wait!!!"); //show a progress dialog 
    } 

    @Override 
    protected Void doInBackground(Void... devices) //while the progress dialog is shown, the connection is done in background 
    { 
     try 
     { 
      if (btSocket == null || !isBtConnected) 
      { 
      myBluetooth = BluetoothAdapter.getDefaultAdapter();//get the mobile bluetooth device 
      BluetoothDevice dispositivo = myBluetooth.getRemoteDevice(address);//connects to the device's address and checks if it's available 
      btSocket = dispositivo.createInsecureRfcommSocketToServiceRecord(myUUID);//create a RFCOMM (SPP) connection 
      BluetoothAdapter.getDefaultAdapter().cancelDiscovery(); 
      btSocket.connect();//start connection 
      } 
     } 
     catch (IOException e) 
     { 
      ConnectSuccess = false;//if the try failed, you can check the exception here 
     } 
     return null; 
    } 
    @Override 
    protected void onPostExecute(Void result) //after the doInBackground, it checks if everything went fine 
    { 
     super.onPostExecute(result); 

     if (!ConnectSuccess) 
     { 
      msg("Connection Failed. Is it a SPP Bluetooth? Try again."); 
      finish(); 
     } 
     else 
     { 
      msg("Connected."); 
      isBtConnected = true; 
     } 
     progress.dismiss(); 
    } 
    } 
} 
彼は3ページ目を開くことledControl.javaに

だから私は1つの以上のボタンを置く、と呼ばれるプログラミング:

btnProgram.setOnClickListener(new View.OnClickListener() //Open programing page 
{ 
    @Override 
    public void onClick(View v) 
    {     
    Intent i = new Intent(getApplicationContext(), Programing.class); 
    startActivity(i); 
    } 
}); 

問題は、ブルートゥース接続で「覚えていない」第3ページであるため、情報を送信できません。私はいくつかの記事が同じトピックでもここにあることを知っています。私は多くの選択肢を試しましたが、成功しませんでした。 誰かがアクティビティ間のBT接続を生き続けるための簡単なコードを提案できれば、それは私のような初心者のために非常に有益なものになるでしょう。 どのようにして簡単な方法でBT接続を行うことができますか? 私はあなたに尋ねて、あなたの提案を上記のコードに入れてください。 ご連絡ありがとうございます。

答えて

0

カスタムアプリケーションサブクラスを実装し、そこにBluetooth接続を格納することができます。それから、アクティビティはアプリケーションのライフサイクルの間にあるので、そこからそれを求めることができます。

public class MyApplication extends Application 
{ 

    private static MyApplication sInstance; 

    public static MyApplication getApplication() { 
     return sInstance; 
    } 

    BluetoothSocket btSocket = null; 

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

     sInstance = this; 
    } 

    public void setupBluetoothConnection() 
    { 
     // Either setup your connection here, or pass it in 
    } 

    public BluetoothSocket getCurrentBluetoothConnection() 
    { 
     return btSocket; 
    } 
} 

そして、あなたの活動の呼び出しで:

MyApplication.getInstance().setupBluetoothConnection(); 

以降:

MyApplication.getInstance().getCurrentBluetoothConnection(); 

あなたは、あなたのアプリが

<application android:icon="@drawable/icon" android:label="@string/app_name" 
    android:name="com.yourpackage.MyApplication"> 
あなたのAndroidManifest.xmlで、このApplicationクラスを使用するように指定する必要があります

もう1つオプションは、ブルートゥース接続を設定/保存するカスタムサービスを実装することですが、それはオーバーヘッドとメンテナンスの増加につながります。

+0

ご連絡ありがとうございます。私はあなたの解決策に取り組み始めました。これまでのところ、 'MyAppliCation.java'ファイルはエラーなしで存在します( 'import android.app.Application;'を追加しました)。 'プライベートクラスConnectBTですでに確立されているBT接続は、AsyncTask // UIスレッド'を拡張し、 'protected void onPostExecute(Void result)'プロシージャで確認されました。次のステップは、コードでこの接続を渡すために書いたものです。 'public void setupBluetoothConnection()'どうすればいいですか?プログラムのコードをどこに書かなければならないのですか?ご協力ありがとうございます。 –

1

アクティビティのライフサイクルにバインドされていない別のサービスクラスに、Bluetoothのすべてのものを保守しないでください。&

バインダー/インテントまたはEventBus経由でサービスと通信し、UIからデカップリングすることができます。

このソリューションの特典として、複数のアクティビティを持つのではなく、すべての通信(送信と受信)を1回だけ、単一の場所に実装します。

関連する問題