监听手机来电与手机短信往蓝牙发送协议实现通讯

因为公司主要做蓝牙手环这块。这阵子负责来电提醒和短信提醒。其实原理比较简单。就是开启一个Service监听手机的来电和短信。然后判断手机跟蓝牙的连接服务是是否连接,已连接的话则根据协议完手环发送来电、短信所需要的协议。不多说了。上代码。首先是Service类中的onCreate方法中注册手机来电和短信监听。监听我是用了TelephonyManager。短信我是用了SmsObserver。
tm  = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
        //创建一个监听器,监听电话呼叫状态的变化。
        myPhoneListener = new MyPhoneListener();
        //开始监听用户的通话状态
        tm.listen(myPhoneListener, PhoneStateListener.LISTEN_CALL_STATE);
        smsObserver = new SmsObserver(this, smsHandler);
        //注册一个内容观察者监听短信的变化
       getContentResolver().registerContentObserver(SMS_INBOX, true,
                smsObserver);

然后短信监听的话需要系统的一个Uri

 private Uri SMS_INBOX = Uri.parse("content://sms");

下面是一个电话监听类
private class MyPhoneListener extends PhoneStateListener{

        //当手机呼叫状态变化的时候 执行下面代码。
        //state 电话的状态
        //incomingnumber 来电号码
        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
            try {
                //判断我们当前手机的通话状态
                switch (state) {
                    //手机处于空闲状态,没有人打电话 没有零响
                    case TelephonyManager.CALL_STATE_IDLE:

                        if (!"".equals(incomingNumber)) {
                           
                            if (BLEServiceHelper.getInstance().getService() == null) {

                                BLEServiceHelper.getInstance().getService().connect(EBLEService.BLEType.CLOSE_PHONE_NOTIFT, BaseApplication.getInstance().getUserInfo().getMacAddress());

                                new Handler().postDelayed(new Runnable() {
                                    @Override
                                    public void run() {
                                        BLEServiceHelper.getInstance().getService().writeData(true, GattAttributes.TO_GET_PHONE_NOTIFT, EBLEService.BLEType.CLOSE_PHONE_NOTIFT, BlueToothInstruction.setNotifyData(false, null));
                                    }
                                },2000);
                            } else {

                                if (BLEServiceHelper.getInstance().getService() != null) {

                                    BLEServiceHelper.getInstance().getService().disconnectAndClose();
                                    BLEServiceHelper.getInstance().getService().connect(EBLEService.BLEType.CLOSE_PHONE_NOTIFT, BaseApplication.getInstance().getUserInfo().getMacAddress());

                                    new Handler().postDelayed(new Runnable() {
                                        @Override
                                        public void run() {
                                            BLEServiceHelper.getInstance().getService().writeData(true, GattAttributes.TO_GET_PHONE_NOTIFT, EBLEService.BLEType.CLOSE_PHONE_NOTIFT, BlueToothInstruction.setNotifyData(false, null));
                                        }
                                    }, 2000);

                                    // BLEServiceHelper.getInstance().getService().writeData(true, GattAttributes.TO_GET_PHONE_NOTIFT, EBLEService.BLEType.PHONE_NOTIFT, BlueToothInstruction.setNotifyData(false, null));
                                }else{
                                    Log.e(TAG,"2222");
                                }
                            }

                        }


                        break;
                    //手机零响状态
                    case TelephonyManager.CALL_STATE_RINGING:
                        Log.e(TAG,"服务服务监听到响铃。。。");
                        BoundDeviceActivity.phoneNumber = incomingNumber;
                        //获得来电号码的名字

                        BoundDeviceActivity.contactName = getName(incomingNumber);
                        //判断改号码有没有保存到手机联系人
                        parseContactName(BoundDeviceActivity.contactName);
                        if(BLEServiceHelper.getInstance().getService()!=null) {
                            BLEServiceHelper.getInstance().getService().disconnectAndClose();
                            String macAddress = BaseApplication.getInstance().getUserInfo().getMacAddress();
                        
                            if (macAddress == null || "".equals(macAddress)) {

                            } else {

                                BLEServiceHelper.getInstance().getService().connect(EBLEService.BLEType.PHONE_NOTIFT, macAddress);

                                new Handler().postDelayed(new Runnable() {
                                    @Override
                                    public void run() {
                                        // BLEServiceHelper.getInstance().getService().writeData(true, GattAttributes.TO_GET_PHONE_NOTIFT, EBLEService.BLEType.PHONE_NOTIFT, BlueToothInstruction.setNotifyData(true, null));
                                    }
                                }, 3000);

                                BLEServiceHelper.getInstance().getService().writeData(true, GattAttributes.TO_GET_PHONE_NOTIFT, EBLEService.BLEType.PHONE_NOTIFT, BlueToothInstruction.setNotifyData(true, null));

                            }


                        }else{
                            Log.e(TAG,"蓝牙服务为空时");
                            String macAddress = BaseApplication.getInstance().getUserInfo().getMacAddress();
                            if (macAddress == null || "".equals(macAddress)) {

                            } else {
                                BLEServiceHelper.getInstance().getService().connect(EBLEService.BLEType.PHONE_NOTIFT, macAddress);

                                new Handler().postDelayed(new Runnable() {
                                    @Override
                                    public void run() {
                         BLEServiceHelper.getInstance().getService().writeData(true, GattAttributes.TO_GET_PHONE_NOTIFT,
                                                                         EBLEService.BLEType.PHONE_NOTIFT, BlueToothInstruction.setNotifyData(true, null));
                                    }
                                }, 3000);
                                
                            }

                        }
                        break;
                    //电话接通状态,用户正在打电话
                    case TelephonyManager.CALL_STATE_OFFHOOK:

                        if(BLEServiceHelper.getInstance().getService()==null){

                            BLEServiceHelper.getInstance().getService().connect(EBLEService.BLEType.CLOSE_PHONE_NOTIFT, BaseApplication.getInstance().getUserInfo().getMacAddress());
                        }else{
                            if (BLEServiceHelper.getInstance().getService() != null) {

                                BLEServiceHelper.getInstance().getService().writeData(true, GattAttributes.TO_GET_PHONE_NOTIFT, EBLEService.BLEType.PHONE_NOTIFT, BlueToothInstruction.setNotifyData(false,null));
                            }
                        }

                        break;
                }
                super.onCallStateChanged(state, incomingNumber);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }
其实我这边是项目中的需求。大家需用的话只要在case中根据需求自己改即可。下面是上面getName(String address)的方法。也就是根据电话号码得到存在手机联系人中的名字。觉得有些人应该会用到
<pre name="code" class="java">public String getName(String number){
        String phonename = null;
        Cursor c = getApplicationContext().getContentResolver().query(Uri.withAppendedPath(
                ContactsContract.PhoneLookup.CONTENT_FILTER_URI, number), new String[]{
                ContactsContract.PhoneLookup._ID,
                ContactsContract.PhoneLookup.NUMBER,
                ContactsContract.PhoneLookup.DISPLAY_NAME,
                ContactsContract.PhoneLookup.TYPE, ContactsContract.PhoneLookup.LABEL}, null, null,   null );

        if(c.getCount() == 0)
        {
            //没找到电话号码
            return null;
        } else if (c.getCount() > 0) {

            c.moveToFirst();
            phonename = c.getString(2); //获取姓名
            return phonename;
        }
        return null;
    }

 好了。电话监听Service就到这里。下面是短信的 
public static boolean flag = true;
    class SmsObserver extends ContentObserver {
        private Context mContext;
        String[] projection = new String[] { "address", "body", "date", "type", "read" };
        public SmsObserver(Context context, Handler handler) {
            super(handler);
            mContext = context;

        }


        @Override
        public void onChange(boolean selfChange) {
            super.onChange(selfChange);
            //每当有新短信到来时,使用我们获取短消息的方法



           if (flag){
                Uri uri = Uri.parse("content://sms/inbox");
                Cursor c = mContext.getContentResolver().query(uri, projection, null, null, "date desc");//"date desc"



                if (c != null) {

                    if (c.moveToNext()) {
						//得到接收到短信的电话号码
                        String address = c.getString(c.getColumnIndex("address"));
						//得到接收到短信的内容
                        String body = c.getString(c.getColumnIndex("body"));
						
                        

                    }
                    c.close();
                    flag = false;
 }


            }


        }

    }
需用注意的是。不知道是为什么。每收到一条短信时,onChange()方法会调用两次。而我项目中是需要监听到短信变化后往手环发数据。这样的话他就会发两次,这样是不符合需求的,所以我是用了flag判断。在蓝牙发送数据之后回调改变了这个标记。

好了。就这些 了。第一次发博客。代码没整理有点乱。请见谅。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
以下是Android平台上使用蓝牙通信的基本代码示例: 1. 首先,需要在AndroidManifest.xml文件中添加蓝牙相关的权限和特性: ```xml <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <uses-feature android:name="android.hardware.bluetooth" /> ``` 2. 在Activity或Service中,需要获取BluetoothAdapter实例并进行初始化: ```java private BluetoothAdapter mBluetoothAdapter; ... // 获取BluetoothAdapter实例 mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); // 启用蓝牙 if (mBluetoothAdapter == null) { // 设备不支持蓝牙 } else { if (!mBluetoothAdapter.isEnabled()) { mBluetoothAdapter.enable(); } } ``` 3. 扫描其他蓝牙设备: ```java // 开始扫描 mBluetoothAdapter.startDiscovery(); // 注册广播接收器,监听扫描结果 IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); registerReceiver(mReceiver, filter); ... // 广播接收器,用于接收扫描结果 private final BroadcastReceiver mReceiver = 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); if (device != null) { // 处理扫描结果 } } } }; ``` 4. 连接其他蓝牙设备: ```java // 获取要连接的设备 BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address); // 创建Socket并连接 BluetoothSocket socket = device.createRfcommSocketToServiceRecord(MY_UUID); socket.connect(); // 获取输入输出流,进行数据传输 InputStream in = socket.getInputStream(); OutputStream out = socket.getOutputStream(); ... ``` 以上是基本的蓝牙通信代码示例,具体实现可能会因需求不同而有所差别。另外,需要注意蓝牙通信需要在UI线程以外的线程中进行,以避免阻塞UI线程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值