找传奇、传世资源到传世资源站!

android_Samsung_BLE实例_和蓝牙4.0开发工具包_

8.5玩家评分(1人评分)
下载后可评
介绍 评论 失效链接反馈

/*
 * Copyright (C) 2013 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.samsung.ble.pxpmonitor;

import android.app.Activity;
import android.app.AlertDialog;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothProfile;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.content.res.Configuration;
import android.media.Ringtone;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;
import android.util.Log;

public class ProximityMonitorActivity extends Activity implements RadioGroup.OnCheckedChangeListener {
  private static final int REQUEST_SELECT_DEVICE = 1;
  private static final int REQUEST_ENABLE_BT = 2;
  private static final int STATE_READY = 10;
  public static final String TAG = "pxpmonitor";
  private static final int PXP_PROFILE_CONNECTED = 20;
  private static final int PXP_PROFILE_DISCONNECTED = 21;
  private static final int STATE_OFF = 10;

  TextView TxPowerValue, mRemoteRssiVal;
  private int mState = PXP_PROFILE_DISCONNECTED;
  RadioGroup mRg;

  private ProximityService mService = null;
  private BluetoothDevice mDevice = null;
  private BluetoothAdapter mBtAdapter = null;
  private static int mAlertLevel = ProximityService.HIGH_ALERT;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    mBtAdapter = BluetoothAdapter.getDefaultAdapter();
    if (mBtAdapter == null) {
      Toast.makeText(this, "Bluetooth is not available", Toast.LENGTH_LONG).show();
      finish();
      return;
    }
    TxPowerValue = ((TextView) findViewById(R.id.statusValue1));
    init();

    ((Button) findViewById(R.id.btn_select)).setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        if (!mBtAdapter.isEnabled()) {
          Log.i(TAG, "onClick - BT not enabled yet");
          Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
          startActivityForResult(enableIntent, REQUEST_ENABLE_BT);
        }
        else {
          Intent newIntent = new Intent(ProximityMonitorActivity.this, DeviceListActivity.class);
          startActivityForResult(newIntent, REQUEST_SELECT_DEVICE);
        }
      }
    });

    ((Button) findViewById(R.id.btn_remove_bond)).setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        mService.removeBond(mDevice);
      }
    });

    ((Button) findViewById(R.id.btn_connect)).setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        mService.connect(mDevice, false);
      }
    });

    ((Button) findViewById(R.id.btn_disconnect)).setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        mService.disconnect(mDevice);
      }
    });

    ((Button) findViewById(R.id.btn_ias_alert)).setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        mService.writeIasAlertLevel(mDevice, mAlertLevel);
      }
    });

    ((Button) findViewById(R.id.btn_lls_alert)).setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        mService.writeLlsAlertLevel(mDevice, mAlertLevel);
      }
    });

    ((Button) findViewById(R.id.btn_write_Tx_Noty)).setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        mService.enableTxPowerNoti(mDevice);
      }
    });

    ((Button) findViewById(R.id.btn_readrssi)).setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        mService.readRssi(mDevice);
      }
    });

    mRemoteRssiVal = (TextView) findViewById(R.id.rssival);

    ((Button) findViewById(R.id.btn_Txpower)).setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        mService.ReadTxPower(mDevice);
      }
    });

    mRg = (RadioGroup) findViewById(R.id.radioGroup1);
    mRg.setOnCheckedChangeListener(this);

    // Set initial UI state
    setUiState();
  }

  private ServiceConnection mServiceConnection = new ServiceConnection() {
    public void onServiceConnected(ComponentName className, IBinder rawBinder) {
      mService = ((ProximityService.LocalBinder) rawBinder).getService();
      Log.d(TAG, "onServiceConnected mService= "  mService);
      mService.setActivityHandler(mHandler);
    }

    public void onServiceDisconnected(ComponentName classname) {
      mService.disconnect(mDevice);
      mService = null;
    }
  };

  private Handler mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
      final Bundle data = msg.getData();
      switch (msg.what) {
      case ProximityService.PXP_CONNECT_MSG:
        runOnUiThread(new Runnable() {
          public void run() {
            if(mDevice!=null && mDevice.getAddress().equals(data.getString(BluetoothDevice.EXTRA_DEVICE))){
              Log.d(TAG, "PXP_CONNECT_MSG");
              mState = PXP_PROFILE_CONNECTED;
              setUiState();
            }
          }
        });
        break;
      case ProximityService.PXP_DISCONNECT_MSG:
        runOnUiThread(new Runnable() {
          public void run() {
            if(mDevice!=null && mDevice.getAddress().equals(data.getString(BluetoothDevice.EXTRA_DEVICE))){
              Log.d(TAG, "PXP_DISCONNECT_MSG");
              mState = PXP_PROFILE_DISCONNECTED;
              setUiState();
            }
          }
        });
        break;

      case ProximityService.PXP_READY_MSG:
        Log.d(TAG, "PXP_READY_MSG");
        runOnUiThread(new Runnable() {
          public void run() {
            mState = STATE_READY;
            setUiState();
          }
        });
        break;

      case ProximityService.PXP_VALUE_MSG:
        Log.d(TAG, "PXP_VALUE_MSG");
        final byte[] value = data.getByteArray(ProximityService.EXTRA_VALUE);
        runOnUiThread(new Runnable() {
          public void run() {
            try {
              TxPowerValue.setText(""  value[0]);
            } catch (Exception e) {
              Log.e(TAG, e.toString());
            }
          }
        });
        break;
      case ProximityService.GATT_CHARACTERISTIC_RSSI_MSG:
        Log.d(TAG, "GATT_CHARACTERISTIC_RSSI_MSG");
        final BluetoothDevice RemoteRssidevice = data.getParcelable(ProximityService.EXTRA_DEVICE);
        final int rssi = data.getInt(ProximityService.EXTRA_RSSI);
        Log.d(TAG, "rssi value is"  rssi  " and remote device is"  RemoteRssidevice);
        runOnUiThread(new Runnable() {
          public void run() {
            if (mDevice != null && RemoteRssidevice != null && mDevice.equals(RemoteRssidevice)) {
              if (rssi != 0) {
 mRemoteRssiVal.setText("Rssi Value ="  String.valueOf(rssi));
              }
            }
          }
        });
        break;
      case ProximityService.PROXIMITY_ALERT_LEVEL_CHANGED_MSG:
        final byte[] value1 = data.getByteArray(ProximityService.EXTRA_VALUE);
        final byte alertLevel = value1[0];
        Log.d(TAG, "PROXIMITY_ALERT_LEVEL_CHANGED_MSG value of alertlevel is "  value1[0]);
        runOnUiThread(new Runnable() {
          @Override
          public void run() {
            if (alertLevel != ProximityService.NO_ALERT) {
              try {
 Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
 Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
 r.play();
              } catch (Exception e) {
 Log.e(TAG, e.toString());
              }

              switch (alertLevel) {
              case ProximityService.LOW_ALERT:
 showMessage(getString(R.string.low_alert));
 break;
              case ProximityService.HIGH_ALERT:
 showMessage(getString(R.string.high_alert));
 break;
              default:
 Log.e(TAG,"wrong alert level");
 break;
              }
            }
          }
        });
        break;
      default:
        super.handleMessage(msg);
      }
    }
  };

  private final BroadcastReceiver proximityStatusChangeReceiver = new BroadcastReceiver() {

    public void onReceive(Context context, Intent intent) {
      String action = intent.getAction();

      final Intent mIntent = intent;
      if (action.equals(BluetoothDevice.ACTION_BOND_STATE_CHANGED)) {
        BluetoothDevice device = mIntent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
        Log.d(TAG, "BluetoothDevice.ACTION_BOND_STATE_CHANGED");
        if (device.equals(mDevice)) {
          runOnUiThread(new Runnable() {
            public void run() {
              setUiState();
            }
          });
        }
      }
      if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {
        final int state = mIntent.getIntExtra(BluetoothAdapter.EXTRA_STATE,BluetoothAdapter.ERROR);
        Log.d(TAG, "BluetoothAdapter.ACTION_STATE_CHANGED"  "state is"  state);
          runOnUiThread(new Runnable() {
            public void run() {
              if ( state == STATE_OFF) {
 mState = PXP_PROFILE_DISCONNECTED;
 setUiStateForBTOff();
              }
            }
          });
      }
    }
  };

  private void init() {
    Intent bindIntent = new Intent(this, ProximityService.class);
    startService(bindIntent);
    bindService(bindIntent, mServiceConnection, Context.BIND_AUTO_CREATE);

    IntentFilter filter = new IntentFilter();
    filter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
    filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
    this.registerReceiver(proximityStatusChangeReceiver, filter);
  }

  @Override
  public void onStart() {
    super.onStart();
    Log.d(TAG, "onStart() mService= "  mService);
  }

  @Override
  public void onDestroy() {
    Log.d(TAG, "onDestroy()");
    try {
      unregisterReceiver(proximityStatusChangeReceiver);
    } catch (Exception ignore) {
      Log.e(TAG, ignore.toString());
    }
    unbindService(mServiceConnection);
    stopService(new Intent(this, ProximityService.class));
    super.onDestroy();
  }

  @Override
  protected void onStop() {
    Log.d(TAG, "onStop");
    super.onStop();
  }

  @Override
  protected void onPause() {
    Log.d(TAG, "onPause");
    super.onPause();
  }

  @Override
  protected void onRestart() {
    super.onRestart();
    Log.d(TAG, "onRestart");
  }

  @Override
  public void onResume() {
    super.onResume();
    Log.d(TAG, "onResume");
    if (!mBtAdapter.isEnabled()) {
      Log.i(TAG, "onResume - BT not enabled yet");
      Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
      startActivityForResult(enableIntent, REQUEST_ENABLE_BT);
    }
    updateUi();
  }

  @Override
  public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
  }

  @Override
  public void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {

    case REQUEST_SELECT_DEVICE:
      if (resultCode == Activity.RESULT_OK && data != null) {
        String deviceAddress = data.getStringExtra(BluetoothDevice.EXTRA_DEVICE);
        mDevice = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(deviceAddress);
        Log.d(TAG, "... onActivityResultdevice.address=="  mDevice  "mserviceValue"  mService);
        setUiState();
        mService.connect(mDevice, false);
      }
      break;
    case REQUEST_ENABLE_BT:
      // When the request to enable Bluetooth returns
      if (resultCode == Activity.RESULT_OK) {
        Toast.makeText(this, "Bluetooth has turned on ", Toast.LENGTH_SHORT).show();

      } else {
        // User did not enable Bluetooth or an error occurred
        Log.d(TAG, "BT not enabled");
        Toast.makeText(this, "Problem in BT Turning ON ", Toast.LENGTH_SHORT).show();
        finish();
      }
      break;
    default:
      Log.e(TAG, "wrong request code");
      break;
    }
  }

  @Override
  public void onCheckedChanged(RadioGroup group, int checkedId) {
    if (checkedId == R.id.radio0)
      mAlertLevel = ProximityService.HIGH_ALERT;
    else if (checkedId == R.id.radio1)
      mAlertLevel = ProximityService.LOW_ALERT;
    else if (checkedId == R.id.radio2)
      mAlertLevel = ProximityService.NO_ALERT;
  }

  private void updateUi() {
    runOnUiThread(new Runnable() {
      @Override
      public void run() {
        setUiState();
      }
    });
  }

  private void setUiStateForBTOff() {
    Log.d(TAG, "... setUiStateForBTOff.mState"  mState);
    findViewById(R.id.btn_select).setEnabled(true);
    findViewById(R.id.btn_ias_alert).setEnabled(false);
    findViewById(R.id.btn_lls_alert).setEnabled(false);
    findViewById(R.id.btn_disconnect).setEnabled(false);
    findViewById(R.id.btn_connect).setEnabled(false);
    findViewById(R.id.btn_Txpower).setEnabled(false);
    findViewById(R.id.btn_write_Tx_Noty).setEnabled(false);
    findViewById(R.id.btn_readrssi).setEnabled(false);
    findViewById(R.id.btn_remove_bond).setEnabled(false);

    if (mDevice != null
        && mDevice.getBondState() != BluetoothDevice.BOND_BONDED) {
      Log.i(TAG, "in no device zone");
      ((TextView) findViewById(R.id.deviceName))
          .setText(R.string.no_device);
    }
    mRemoteRssiVal.setVisibility(View.VISIBLE);
  }

  private void setUiState() {
    findViewById(R.id.btn_select).setEnabled(mState == PXP_PROFILE_DISCONNECTED);
    Log.d(TAG, "... setUiState.mState"  mState);
    findViewById(R.id.btn_ias_alert).setEnabled(mState == STATE_READY);
    findViewById(R.id.btn_lls_alert).setEnabled(mState == STATE_READY);
    findViewById(R.id.btn_disconnect).setEnabled(mState == STATE_READY || mState == PXP_PROFILE_CONNECTED);
    if (mDevice != null) {
      findViewById(R.id.btn_connect).setEnabled(mState == PXP_PROFILE_DISCONNECTED && mDevice.getBondState() == BluetoothDevice.BOND_BONDED);
    }
    else findViewById(R.id.btn_connect).setEnabled(false);
    findViewById(R.id.btn_Txpower).setEnabled(mState == STATE_READY);
    findViewById(R.id.btn_write_Tx_Noty).setEnabled(mState == STATE_READY);
    findViewById(R.id.btn_readrssi).setEnabled(mState == STATE_READY);
    findViewById(R.id.btn_remove_bond).setEnabled(
        mDevice != null && mDevice.getBondState() == BluetoothDevice.BOND_BONDED);

    if (mDevice != null && mDevice.getBondState() != BluetoothDevice.BOND_BONDED) {
      Log.i(TAG, "in no device zone");
      ((TextView) findViewById(R.id.deviceName)).setText(R.string.no_device);
    }
    if (mDevice != null && mDevice.getBondState() == BluetoothDevice.BOND_BONDED) {
      ((TextView) findViewById(R.id.deviceName)).setText(mDevice.getName());
    }
    mRemoteRssiVal.setVisibility(View.VISIBLE);
    TextView status = ((TextView) findViewById(R.id.statusValue));

    switch (mState) {
    case PXP_PROFILE_CONNECTED:
      Log.i(TAG, "STATE_CONNECTED::device name" mDevice.getName());
      status.setText(R.string.connected);
      ((TextView) findViewById(R.id.deviceName)).setText(mDevice.getName());
      break;
    case PXP_PROFILE_DISCONNECTED:
      Log.i(TAG, "disconnected");
      status.setText(R.string.disconnected);
      mRemoteRssiVal.setText(R.string.Noupdate);
      TxPowerValue.setText(R.string.Noupdate);
      break;
    case STATE_READY:
      status.setText(R.string.ready);
      ((TextView) findViewById(R.id.deviceName)).setText(mDevice.getName());
      break;
    default:
      Log.e(TAG, "wrong mState");
      break;
    }
  }

  private void showMessage(String msg) {
    Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
  }

  @Override
  public void onBackPressed() {
    if (mState == STATE_READY) {
      Intent startMain = new Intent(Intent.ACTION_MAIN);
      startMain.addCategory(Intent.CATEGORY_HOME);
      startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
      startActivity(startMain);
    }
    else {
      new AlertDialog.Builder(this)
      .setIcon(android.R.drawable.ic_dialog_alert)
      .setTitle(R.string.popup_title)
      .setMessage(R.string.popup_message)
      .setPositiveButton(R.string.popup_yes, new DialogInterface.OnClickListener()
        {
          @Override
          public void onClick(DialogInterface dialog, int which) {
          finish();
        }
      })
      .setNegativeButton(R.string.popup_no, null)
      .show();
    }
  }
}

评论

发表评论必须先登陆, 您可以 登陆 或者 注册新账号 !


在线咨询: 问题反馈
客服QQ:174666394

有问题请留言,看到后及时答复