package com.droid.activitys; 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.util.Log; import android.view.View; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.AdapterView; import android.widget.ImageView; import android.widget.ListView; import android.widget.RelativeLayout; import android.widget.TextView; import com.droid.R; import com.droid.adapter.MyBluetoothAdapter; import com.droid.utils.Tools; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; /** * @author Droid * 蓝牙管理 */ public class Bluetooth extends BaseActivity implements View.OnClickListener { private static final String TAG = "UPDATE"; private static final boolean d = false; private RelativeLayout openRL; private RelativeLayout detectionRL; private RelativeLayout searchRL; private RelativeLayout pairRL; private RelativeLayout searchDeviceRL; private ImageView openIV; private ImageView detectionIV; private ImageView searchIV; private TextView pairTV; private TextView pairTVName; private TextView searchDeviceTV; private ListView searchDeviceLV; private Set<BluetoothDevice> bondedDevices; private BluetoothDevice pairDevice; private boolean openFlag; private boolean detectionFlag; private int pairPosition = -1; private Context context; private BluetoothAdapter bluetoothAdapter; private MyBluetoothAdapter itemAdapter; private List<Map<String, Object>> list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(R.layout.activity_bluetooth); context = this; initViews(); initData(); setListener(); } private void initData() { bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); list = new ArrayList<Map<String, Object>>(); if (bluetoothAdapter.isEnabled()) { openIV.setBackgroundResource(R.drawable.switch_on); detectionIV.setBackgroundResource(R.drawable.switch_off); searchIV.setVisibility(View.VISIBLE); pairTV.setVisibility(View.VISIBLE); pairRL.setVisibility(View.VISIBLE); searchDeviceTV.setVisibility(View.VISIBLE); searchDeviceRL.setVisibility(View.VISIBLE); bondedDevices = bluetoothAdapter.getBondedDevices(); Iterator iterator = bondedDevices.iterator(); if (iterator.hasNext()) { BluetoothDevice bond = (BluetoothDevice) iterator.next(); pairDevice = bond; pairTVName.setText(bond.getName()); pairPosition = -2; } openFlag = true; } else { openIV.setBackgroundResource(R.drawable.switch_off); detectionIV.setBackgroundResource(R.drawable.switch_off); searchIV.setVisibility(View.GONE); pairTV.setVisibility(View.GONE); pairRL.setVisibility(View.GONE); searchDeviceTV.setVisibility(View.GONE); searchDeviceRL.setVisibility(View.GONE); openFlag = false; } IntentFilter intent = new IntentFilter(); // 用BroadcastReceiver来取得搜索结果 intent.addAction(BluetoothDevice.ACTION_FOUND); //每当扫描模式变化的时候,应用程序可以为通过ACTION_SCAN_MODE_CHANGED值来监听全局的消息通知。 // 比如,当设备停止被搜寻以后,该消息可以被系统通知給应用程序。 intent.addAction(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED); //每当蓝牙模块被打开或者关闭,应用程序可以为通过ACTION_STATE_CHANGED值来监听全局的消息通知。 intent.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); intent.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); registerReceiver(searchReceiver, intent); } private void initViews() { openRL = (RelativeLayout) findViewById(R.id.bluetooth_rl_open); detectionRL = (RelativeLayout) findViewById(R.id.bluetooth_rl_detection); searchRL = (RelativeLayout) findViewById(R.id.bluetooth_rl_search); pairRL = (RelativeLayout) findViewById(R.id.bluetooth_rl_pair1); searchDeviceRL = (RelativeLayout) findViewById(R.id.bluetooth_rl_search_device); openIV = (ImageView) findViewById(R.id.bluetooth_iv_open); detectionIV = (ImageView) findViewById(R.id.bluetooth_iv_detection); searchIV = (ImageView) findViewById(R.id.bluetooth_iv_search); pairTV = (TextView) findViewById(R.id.bluetooth_tv_pair); pairTVName = (TextView) findViewById(R.id.bluetooth_tv_pair_name); searchDeviceTV = (TextView) findViewById(R.id.bluetooth_tv_search_device); searchDeviceLV = (ListView) findViewById(R.id.bluetooth_lv_search_device); } private void setListener() { openRL.setOnClickListener(this); detectionRL.setOnClickListener(this); searchRL.setOnClickListener(this); pairRL.setOnClickListener(this); searchDeviceLV.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { BluetoothDevice device = (BluetoothDevice) list.get(position).get("device"); device.createBond(); showShortToast("正在配对.."); } }); } @Override protected void onRestart() { super.onRestart(); Log.i(TAG, "============onRestart========"); } @Override protected void onPause() { super.onPause(); Log.i(TAG, "=====onPause==========="); } @Override protected void onResume() { super.onResume(); Log.i(TAG, "=========onResume======="); } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(searchReceiver); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.bluetooth_rl_open: if (!openFlag) { bluetoothAdapter.disable(); openIV.setBackgroundResource(R.drawable.switch_off); detectionIV.setBackgroundResource(R.drawable.switch_off); searchIV.setVisibility(View.GONE); pairTV.setVisibility(View.GONE); pairRL.setVisibility(View.GONE); searchDeviceTV.setVisibility(View.GONE); searchDeviceRL.setVisibility(View.GONE); openFlag = !openFlag; } else { if (bluetoothAdapter != null) { if (!bluetoothAdapter.isEnabled()) { Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivity(intent); } } else { showShortToast("蓝牙不可用!"); } openIV.setBackgroundResource(R.drawable.switch_on); searchIV.setVisibility(View.VISIBLE); pairTV.setVisibility(View.VISIBLE); pairRL.setVisibility(View.VISIBLE); searchDeviceTV.setVisibility(View.VISIBLE); searchDeviceRL.setVisibility(View.VISIBLE); openFlag = !openFlag; } break; case R.id.bluetooth_rl_detection: if (detectionFlag) { detectionIV.setBackgroundResource(R.drawable.switch_off); detectionFlag = !detectionFlag; } else { Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); startActivity(discoverableIntent); detectionIV.setBackgroundResource(R.drawable.switch_on); detectionFlag = !detectionFlag; } break; case R.id.bluetooth_rl_search: Animation rotateAnimation = AnimationUtils.loadAnimation(context, R.anim.rotate); searchIV.startAnimation(rotateAnimation); bluetoothAdapter.startDiscovery(); break; case R.id.bluetooth_rl_pair1: if (pairPosition > -1) { BluetoothDevice device = (BluetoothDevice) list.get(pairPosition).get("device"); try { boolean b = Tools.removeBond(device.getClass(), device); if (b) { Map<String, Object> map = new HashMap<String, Object>(); map.put("name", device.getName()); map.put("type", device.getBluetoothClass().getDeviceClass()); map.put("device", device); list.add(map); itemAdapter.notifyDataSetChanged(); } } catch (Exception e) { e.printStackTrace(); } } else if (pairPosition == -2) { try { showShortToast("正在取消配对.."); boolean b = Tools.removeBond(pairDevice.getClass(), pairDevice); if (b) { Map<String, Object> map = new HashMap<String, Object>(); map.put("name", pairDevice.getName()); map.put("type", pairDevice.getBluetoothClass().getDeviceClass()); map.put("device", pairDevice); pairTVName.setText("未配对"); list.add(map); itemAdapter.notifyDataSetChanged(); } else { showShortToast("取消配对失败"); } } catch (Exception e) { e.printStackTrace(); } } break; } } private BroadcastReceiver searchReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub String action = intent.getAction(); BluetoothDevice device = null; device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); if(device!=null){ } if (BluetoothDevice.ACTION_FOUND.equals(action)) { if (device.getBondState() == BluetoothDevice.BOND_NONE) { Map<String, Object> map = new HashMap<String, Object>(); map.put("name", device.getName()); map.put("type", device.getBluetoothClass().getDeviceClass()); map.put("device", device); if (list.indexOf(map) == -1) {// 防止重复添加 list.add(map); itemAdapter = new MyBluetoothAdapter(context, list); searchDeviceLV.setAdapter(itemAdapter); } } } else if (device != null && device.getBondState() == BluetoothDevice.BOND_BONDING) { showShortToast("正在配对"); } else if (device != null && device.getBondState() == BluetoothDevice.BOND_BONDED) { pairTVName.setText(device.getName()); for (int i = 0; i < list.size(); i++) { if (list.get(i).get("device").equals(device)) { pairPosition = i; list.remove(i); itemAdapter.notifyDataSetChanged(); } } showShortToast("配对完成"); } } }; }