返回列表 發帖

Android

  1. package ray.test.smarthat;

  2. import android.app.Activity;
  3. import android.bluetooth.BluetoothAdapter;
  4. import android.bluetooth.BluetoothDevice;
  5. import android.bluetooth.BluetoothSocket;
  6. import android.content.BroadcastReceiver;
  7. import android.content.Context;
  8. import android.content.Intent;
  9. import android.content.IntentFilter;
  10. import android.media.AudioManager;
  11. import android.media.ToneGenerator;
  12. import android.os.Bundle;
  13. import android.os.Handler;
  14. import android.os.Message;
  15. import android.view.Menu;
  16. import android.view.MenuItem;
  17. import android.view.View;
  18. import android.widget.Button;
  19. import android.widget.TextView;

  20. import java.io.IOException;
  21. import java.io.InputStream;
  22. import java.io.OutputStream;
  23. import java.util.Set;
  24. import java.util.UUID;


  25. public class MainActivity extends Activity {
  26.     private Button button1,button2,button3,button4,button5;
  27.     private TextView textView1 = null;
  28.     private BluetoothDevice myDevice;
  29.     private BluetoothSocket mySocket;
  30.     private OutputStream myOutputStream;
  31.     private InputStream myInputStream;
  32.     private String onStr = "a\n";
  33.     private String offStr = "b\n";
  34.     ToneGenerator toneG = new ToneGenerator(AudioManager.STREAM_ALARM, 100);

  35.     Handler mHandler = new Handler() {
  36.         @Override    public void handleMessage(Message msg) {
  37.             if(msg.what > 0)
  38.             {
  39.                 if(textView1 != null)
  40.                     textView1.setText("Got from BT:"+msg.what);
  41.             }
  42.             if(msg.what == 49)
  43.                 toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 200);
  44.             if(msg.what == 48)
  45.                 toneG.stopTone();
  46.             super.handleMessage(msg);
  47.         }
  48.     };

  49.     BluetoothAdapter myBt=BluetoothAdapter.getDefaultAdapter();
  50.     @Override
  51.     protected void onCreate(Bundle savedInstanceState) {
  52.         super.onCreate(savedInstanceState);
  53.         setContentView(R.layout.activity_main);
  54.         button1 = (Button)this.findViewById(R.id.button1);
  55.         button2 = (Button)this.findViewById(R.id.button2);
  56.         button3 = (Button)this.findViewById(R.id.button3);
  57.         button4 = (Button)this.findViewById(R.id.button4);
  58.         button5 = (Button)this.findViewById(R.id.button5);
  59.         button5.setText("ON");
  60.         textView1 = (TextView)this.findViewById(R.id.textView1);

  61.         button1.setOnClickListener(button1_click);
  62.         button2.setOnClickListener(button2_click);
  63.         button3.setOnClickListener(button3_click);
  64.         button4.setOnClickListener(button4_click);
  65.         button5.setOnClickListener(button5_click);
  66.     }

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

  73.     //開啟藍芽
  74.     Button.OnClickListener button1_click = new Button.OnClickListener(){

  75.         @Override
  76.         public void onClick(View v) {
  77.             // TODO Auto-generated method stub
  78.             if(myBt == null)
  79.             {
  80.                 textView1.setText("手機無藍芽設備");
  81.                 finish();
  82.                 return;
  83.             }

  84.             if(!myBt.enable())
  85.             {
  86.                 Intent enable = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
  87.                 startActivityForResult(enable,0);
  88.             }
  89.             Intent scanable = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
  90.             startActivityForResult(scanable,0x2);
  91.             textView1.setText("藍芽開啟成功");
  92.         }};
  93.     //配對過的藍芽
  94.     Button.OnClickListener button2_click = new Button.OnClickListener(){

  95.         @Override
  96.         public void onClick(View v) {
  97.             // TODO Auto-generated method stub

  98.             Set<BluetoothDevice> pairedDevices = myBt.getBondedDevices();
  99.             if(pairedDevices.size() > 0)
  100.             {
  101.                 String s = "";
  102.                 for(BluetoothDevice device:pairedDevices)
  103.                 {
  104.                     if(device.getName().equals("RAY_Bluetooth"))
  105.                     {
  106.                         myDevice = device;
  107.                         try{
  108.                             openBT();
  109.                         }catch(Exception e){}
  110.                         s = "RAY_BT Connected!";
  111.                         break;
  112.                     }
  113.                     //s += device.getName()+"\t"+device.getAddress()+"\n";
  114.                 }
  115.                 textView1.setText(s);
  116.             }
  117.         }};

  118.     Button.OnClickListener button4_click = new Button.OnClickListener(){

  119.         @Override
  120.         public void onClick(View v) {
  121.             // TODO Auto-generated method stub

  122.             IntentFilter intentFilter = new IntentFilter();
  123.             intentFilter.addAction(BluetoothDevice.ACTION_FOUND);
  124.             intentFilter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
  125.             intentFilter.addAction(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED);
  126.             intentFilter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
  127.             // 注册广播接收器,接收并处理搜索结果
  128.             registerReceiver(receiver, intentFilter);
  129.             // 寻找蓝牙设备,android会将查找到的设备以广播形式发出去
  130.             myBt.startDiscovery();
  131.         }};

  132.     private BroadcastReceiver receiver = new BroadcastReceiver() {
  133.         @Override
  134.         public void onReceive(Context context, Intent intent) {
  135.             String action = intent.getAction();
  136.             if (BluetoothDevice.ACTION_FOUND.equals(action)) {
  137.                 BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
  138.                 textView1.setText(textView1.getText()+"\n"+device.getName());
  139.             }
  140.         }
  141.     };
  142.     //關閉藍芽
  143.     Button.OnClickListener button3_click = new Button.OnClickListener(){

  144.         @Override
  145.         public void onClick(View v) {
  146.             // TODO Auto-generated method stub
  147.             myBt.disable();
  148.         }};
  149.     //LED開關
  150.     Button.OnClickListener button5_click = new Button.OnClickListener(){

  151.         @Override
  152.         public void onClick(View v) {
  153.             // TODO Auto-generated method stub
  154.             try {
  155.                 if(button5.getText().equals("ON"))
  156.                 {
  157.                     button5.setText("OFF");
  158.                     //myOutputStream.write(onStr.getBytes());
  159.                 }
  160.                 else {
  161.                     button5.setText("ON");
  162.                     //myOutputStream.write(offStr.getBytes());
  163.                 }
  164.             } catch (Exception e) {
  165.                 // TODO Auto-generated catch block
  166.                 e.printStackTrace();
  167.             }

  168.         }};

  169.     void openBT() throws IOException
  170.     {
  171.         UUID uuid=UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
  172.         mySocket=myDevice.createRfcommSocketToServiceRecord(uuid);
  173.         mySocket.connect();
  174.         //myOutputStream=mySocket.getOutputStream();
  175.         //myInputStream=mySocket.getInputStream();
  176.         new ConnectedThread(mySocket).start();
  177.     }
  178.     @Override
  179.     public boolean onOptionsItemSelected(MenuItem item) {
  180.         // Handle action bar item clicks here. The action bar will
  181.         // automatically handle clicks on the Home/Up button, so long
  182.         // as you specify a parent activity in AndroidManifest.xml.
  183.         int id = item.getItemId();
  184.         return super.onOptionsItemSelected(item);
  185.     }

  186.     private class ConnectedThread extends Thread {
  187.         private final BluetoothSocket mmSocket;
  188.         private final InputStream mmInStream;
  189.         private final OutputStream mmOutStream;

  190.         public ConnectedThread(BluetoothSocket socket) {
  191.             mmSocket = socket;
  192.             InputStream tmpIn = null;
  193.             OutputStream tmpOut = null;

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

  200.             mmInStream = tmpIn;
  201.             mmOutStream = tmpOut;
  202.         }

  203.         public void run() {
  204.             byte[] buffer = new byte[1024];  // buffer store for the stream
  205.             int bytes; // bytes returned from read()

  206.             // Keep listening to the InputStream until an exception occurs
  207.             while (true) {
  208.                 try {
  209.                     // Read from the InputStream
  210.                     bytes = mmInStream.read(buffer);
  211.                     // Send the obtained bytes to the UI Activity
  212.                     mHandler.obtainMessage(buffer[0])
  213.                             .sendToTarget();
  214.                 } catch (IOException e) {
  215.                     break;
  216.                 }
  217.             }
  218.         }

  219.         /* Call this from the main Activity to send data to the remote device */
  220.         public void write(byte[] bytes) {
  221.             try {
  222.                 mmOutStream.write(bytes);
  223.             } catch (IOException e) { }
  224.         }

  225.         /* Call this from the main Activity to shutdown the connection */
  226.         public void cancel() {
  227.             try {
  228.                 mmSocket.close();
  229.             } catch (IOException e) { }
  230.         }
  231.     }
  232. }
複製代碼

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
  4.     android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
  5.     android:paddingRight="@dimen/activity_horizontal_margin"
  6.     android:paddingTop="@dimen/activity_vertical_margin"
  7.     android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"
  8.     android:orientation="vertical">
  9. <!--
  10.     <Button
  11.         android:layout_width="match_parent"
  12.         android:layout_height="wrap_content"
  13.         android:text="openBT"
  14.         android:onClick="openBTClick"
  15.         android:id="@+id/openBT" />

  16.     <Button
  17.         android:layout_width="match_parent"
  18.         android:layout_height="wrap_content"
  19.         android:text="findBT"
  20.         android:onClick="findBTClick"
  21.         android:id="@+id/findBT" />
  22. -->

  23.     <Button
  24.         android:layout_width="match_parent"
  25.         android:layout_height="wrap_content"
  26.         android:text="連接美姿皇冠"
  27.         android:onClick="connectBTClick"
  28.         android:id="@+id/connectBT" />

  29.     <Button
  30.         android:layout_width="match_parent"
  31.         android:layout_height="wrap_content"
  32.         android:text="斷開美姿皇冠"
  33.         android:onClick="disconnectBTClick"
  34.         android:id="@+id/disconnecBT" />
  35.     <TextView android:id="@+id/deviceName" android:text="" android:layout_width="wrap_content"
  36.         android:layout_height="wrap_content" />
  37.     <TextView android:id="@+id/status" android:text="" android:layout_width="wrap_content"
  38.         android:layout_height="wrap_content" />
  39. </LinearLayout>
複製代碼

TOP

  1. package ray.test.smarthat;

  2. import android.bluetooth.BluetoothAdapter;
  3. import android.bluetooth.BluetoothDevice;
  4. import android.bluetooth.BluetoothSocket;
  5. import android.content.Intent;
  6. import android.media.AudioManager;
  7. import android.media.ToneGenerator;
  8. import android.os.Bundle;
  9. import android.os.Handler;
  10. import android.os.Message;
  11. import android.support.v7.app.AppCompatActivity;
  12. import android.util.Log;
  13. import android.view.Menu;
  14. import android.view.MenuItem;
  15. import android.view.View;
  16. import android.widget.TextView;

  17. import java.io.IOException;
  18. import java.io.InputStream;
  19. import java.io.OutputStream;
  20. import java.net.URL;
  21. import java.util.Set;
  22. import java.util.UUID;

  23. public class MainActivity extends AppCompatActivity {
  24.     //private Button openBT,findBT,connectBT,disconnectBT;
  25.     private TextView status;
  26.     private TextView deviceName;
  27.     private BluetoothDevice myDevice;
  28.     private String deviceStatus = "";
  29.     private BluetoothSocket mySocket;
  30.     private OutputStream myOutputStream;
  31.     private InputStream myInputStream;
  32.     private BluetoothAdapter myBT = BluetoothAdapter.getDefaultAdapter();

  33.     ToneGenerator toneG = new ToneGenerator(AudioManager.STREAM_ALARM, 100);

  34.     Handler mHandler = new Handler() {
  35.         @Override    public void handleMessage(Message msg) {
  36.             switch(msg.what)
  37.             {
  38.                 case 49:
  39.                 case -2:
  40.                     toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 200);
  41.                     status.setText("你是不是低頭了呢!");
  42.                     deviceStatus = "1";
  43.                     break;
  44.                 case 48:
  45.                 case -1:
  46.                     toneG.stopTone();
  47.                     status.setText("你的姿勢很正確哦!");
  48.                     deviceStatus = "0";
  49.             }
  50.             logToServer();
  51.             super.handleMessage(msg);
  52.         }
  53.     };


  54.     @Override
  55.     protected void onCreate(Bundle savedInstanceState) {
  56.         super.onCreate(savedInstanceState);
  57.         setContentView(R.layout.activity_main);
  58.         status = (TextView)this.findViewById(R.id.status);
  59.         deviceName = (TextView)this.findViewById(R.id.deviceName);
  60.     }
  61.     /*
  62.     public void openBTClick(View v)
  63.     {
  64.         if(myBT == null)
  65.         {
  66.             status.setText("手機無藍芽設備");
  67.             finish();
  68.             return;
  69.         }

  70.         if(!myBT.enable())
  71.         {
  72.             Intent enable = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
  73.             startActivityForResult(enable, 0);
  74.         }
  75.         Intent scanable = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
  76.         startActivityForResult(scanable, 0x2);
  77.         status.setText("藍芽開啟成功");

  78.     }

  79.     private BroadcastReceiver receiver = new BroadcastReceiver() {
  80.         @Override
  81.         public void onReceive(Context context, Intent intent) {
  82.             String action = intent.getAction();
  83.             if (BluetoothDevice.ACTION_FOUND.equals(action)) {
  84.                 BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
  85.                 status.setText(status.getText()+"\n"+device.getName());
  86.             }
  87.         }
  88.     };
  89.     */
  90.     /*
  91.     public void findBTClick(View v)
  92.     {
  93.         IntentFilter intentFilter = new IntentFilter();
  94.         intentFilter.addAction(BluetoothDevice.ACTION_FOUND);
  95.         intentFilter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
  96.         intentFilter.addAction(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED);
  97.         intentFilter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
  98.         // 注册广播接收器,接收并处理搜索结果
  99.         registerReceiver(receiver, intentFilter);
  100.         // 寻找蓝牙设备,android会将查找到的设备以广播形式发出去
  101.         myBT.startDiscovery();
  102.     }
  103.     */
  104.     public void connectBTClick(View v)
  105.     {
  106.         Set<BluetoothDevice> pairedDevices = myBT.getBondedDevices();
  107.         Log.d("debug","BTConnect paired size:"+pairedDevices.size());
  108.         if(pairedDevices.size() > 0)
  109.         {
  110.             String s = "找不到任何正確連結的美姿皇冠";
  111.             for(BluetoothDevice device:pairedDevices)
  112.             {
  113.                 boolean success = false;
  114.                 Log.d("debug","BTConnect paired name:"+device.getName());
  115.                 if(device.getName().substring(0,8).equals("SmartCap"))
  116.                 {
  117.                     myDevice = device;
  118.                     deviceName.setText(device.getName());
  119.                     try{
  120.                         openBT();
  121.                         success = true;
  122.                         s = "配對到的美姿皇冠:"+deviceName.getText();
  123.                         Log.d("debug","BTConnect paired success:"+device.getName());
  124.                     }catch(Exception e){
  125.                         s = "藍牙錯誤,請重開美姿皇冠及設定手機的藍牙連接";
  126.                         Log.d("debug","BTConnect paired fail:"+device.getName());
  127.                     }
  128.                 }
  129.                 if(success)
  130.                     break;
  131.             }
  132.             status.setText(s);
  133.         }
  134.     }

  135.     public void disconnectBTClick(View v)
  136.     {
  137.         closeBT();
  138.     }

  139.     void closeBT()
  140.     {
  141.         try {
  142.             mySocket.close();
  143.             mySocket = null;
  144.             myDevice = null;
  145.             status.setText("");
  146.             deviceName.setText("");
  147.         }catch(Exception e)
  148.         {
  149.             status.setText("關閉失敗!");
  150.         }
  151.     }

  152.     void openBT() throws Exception
  153.     {
  154.         UUID uuid=UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
  155.         Log.d("debug","BTConnect uuid ok");
  156.         Log.d("debug","BTConnect myDevice:"+myDevice.getName());
  157.         mySocket=myDevice.createRfcommSocketToServiceRecord(uuid);

  158.         Log.d("debug","BTConnect create socket ok");
  159.         Log.d("debug","BTConnect connect:"+mySocket.isConnected());
  160.         mySocket.connect();
  161.         Log.d("debug","BTConnect connect ok");
  162.         //myOutputStream=mySocket.getOutputStream();
  163.         //myInputStream=mySocket.getInputStream();
  164.         new ConnectedThread(mySocket).start();
  165.         Log.d("debug","BTConnect thread start ok");
  166.     }

  167.     private class ConnectedThread extends Thread {
  168.         private final BluetoothSocket mmSocket;
  169.         private final InputStream mmInStream;
  170.         private final OutputStream mmOutStream;

  171.         public ConnectedThread(BluetoothSocket socket) {
  172.             mmSocket = socket;
  173.             InputStream tmpIn = null;
  174.             OutputStream tmpOut = null;

  175.             // Get the input and output streams, using temp objects because
  176.             // member streams are final
  177.             try {
  178.                 tmpIn = socket.getInputStream();
  179.                 tmpOut = socket.getOutputStream();
  180.             } catch (IOException e) {
  181.                 status.setText("藍芽通訊失敗");
  182.             }

  183.             mmInStream = tmpIn;
  184.             mmOutStream = tmpOut;
  185.         }

  186.         public void run() {
  187.             byte[] buffer = new byte[1024];  // buffer store for the stream
  188.             int bytes; // bytes returned from read()

  189.             // Keep listening to the InputStream until an exception occurs
  190.             Log.d("debug","BTThread run:"+mySocket.toString());
  191.             while (mySocket != null) {
  192.                 try {
  193.                     // Read from the InputStream
  194.                     bytes = mmInStream.read(buffer);
  195.                     // Send the obtained bytes to the UI Activity
  196.                     Log.d("debug","BTThread:"+buffer[0]);
  197.                     mHandler.obtainMessage(buffer[0])
  198.                             .sendToTarget();

  199.                     Thread.sleep(200);
  200.                 } catch (Exception e) {
  201.                     Log.d("error","BTThread:"+e.toString());
  202.                 }
  203.             }
  204.             Log.d("debug","BTThread end");
  205.         }

  206.         /* Call this from the main Activity to send data to the remote device */
  207.         public void write(byte[] bytes) {
  208.             try {
  209.                 mmOutStream.write(bytes);
  210.             } catch (IOException e) { }
  211.         }

  212.         /* Call this from the main Activity to shutdown the connection */
  213.         public void cancel() {
  214.             try {
  215.                 mmSocket.close();
  216.             } catch (IOException e) { }
  217.         }
  218.     }

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

  225.     @Override
  226.     public boolean onOptionsItemSelected(MenuItem item)
  227.     {
  228.         switch(item.getItemId())
  229.         {
  230.             case R.id.settings:
  231.                 startActivity(new Intent(this,PrefsActivity.class));
  232.                 return true;
  233.             case R.id.exit:
  234.                 closeBT();
  235.                 finish();
  236.         }
  237.         return false;
  238.     }

  239.     void logToServer(){
  240.         new Thread()
  241.         {
  242.             public void run()
  243.             {
  244.                 try
  245.                 {

  246.                     URL url = new URL("http://"+PrefsActivity.getServer(MainActivity.this)+"/smartcap/log.php?device="+deviceName+"&status="+deviceStatus);
  247.                     url.openStream();
  248.                 }
  249.                 catch(Exception e)
  250.                 {
  251.                 }
  252.             }
  253.         }.start();

  254.     }
  255. }
複製代碼

TOP

返回列表