为什么未调用mConnection.onServiceConnected方法

时间:2018-06-27 16:21:27

标签: android service bluetooth-lowenergy android-service

public class DeviceScanActivity extends AppCompatActivity/*ListActivity*/ {
 @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);


        mHandler = new Handler();

        //mSend=new BluetoothSendRecv(cntxt);
        mActvty= this.getParent();
        visible = this.getIntent();
        requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSION_REQUEST_COARSE_LOCATION);
        // Use this check to determine whether BLE is supported on the device.  Then you can
        // selectively disable BLE-related features.
        if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
            Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_SHORT).show();
            finish();
        }
        // Initializes a Bluetooth adapter.  For API level 18 and above, get a reference to
        // BluetoothAdapter through BluetoothManager.
        mBluetoothManager =(BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
        mBluetoothAdapter = mBluetoothManager.getAdapter();
        // Checks if Bluetooth is supported on the device.
        if (mBluetoothAdapter == null ) {
            Toast.makeText(this, R.string.error_bluetooth_not_supported, Toast.LENGTH_SHORT).show();
            finish();
            return;
        }
        if( !mBluetoothAdapter.isEnabled())
        {
            Intent enableBluetooth = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(enableBluetooth, 1);
        }
        if( !mBluetoothAdapter.isDiscovering()) {
            Intent discoverableIntent =
                    new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
            discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
            startActivity(discoverableIntent);
        }
        // Construct the data source

        ArrayList<ViewHolder> arrayOfUsers = new ArrayList<ViewHolder>();

       // Create the adapter to convert the array to views

         adapter = new UsersAdapter(this, arrayOfUsers);
         cntxt=this.getApplicationContext();
        ListView listView = (ListView) findViewById(R.id.mobile_list);
        listView.setAdapter(adapter);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position,
                                    long id) {
                ViewHolder entry= (ViewHolder) parent.getAdapter().getItem(position);
                mAddress = entry.deviceAddress;
                Toast.makeText(cntxt, mAddress, Toast.LENGTH_SHORT).show();
                Intent i = new Intent(cntxt, BluetoothLeService.class);
                cntxt.startService(i);
                bindService(visible, mConnection, BIND_AUTO_CREATE);; //if checked, start service
                //final BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
                //mBluetoothService.mBluetoothDeviceAddress=address;
                //mBluetoothService.mBluetoothManager=mBluetoothManager;
                //mBluetoothService.mBluetoothAdapter = mBluetoothAdapter;
                //mBluetoothService.mBluetoothGatt.connect();
                /*mBluetoothService.mBluetoothGatt = */
                //mSend.mBluetoothGatt=device.connectGatt(mActvty/*cntxt*/, false, mSend.mGattCallback);
                //mSend.mBluetoothDeviceAddress=address;
                //mSend.mBluetoothManager=mBluetoothManager;
                //mSend.mBluetoothAdapter = mBluetoothAdapter;
                //mSend.mBluetoothGatt.connect();
                //mBluetoothService.mBluetoothGatt=mBluetoothGatt;
                //Toast.makeText(this, R.string.error_bluetooth_not_supported, Toast.LENGTH_SHORT).show();
            }});
        ViewHolder newUser2 = new ViewHolder("adtv2","vvg2");
         adapter.add(newUser2);

    }
    ServiceConnection mConnection = new ServiceConnection() {
        @Override
        public void onServiceDisconnected(ComponentName name) {
            //Toast.makeText(Client.this, "Service is disconnected", 1000).show();
            mBounded = false;
            mBluetoothService = null;
        }
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            //Toast.makeText(Client.this, "Service is connected", 1000).show();
            mBounded = true;
            BluetoothLeService.LocalBinder mLocalBinder = (BluetoothLeService.LocalBinder)service;
            Toast.makeText(cntxt, "Mithun", Toast.LENGTH_SHORT).show();
            mBluetoothService = mLocalBinder.getService();
            if (!mBluetoothService.initialize()) {
                //Log.e(TAG, "Unable to initialize Bluetooth");
                finish();
            }
            // Automatically connects to the device upon successful start-up
            // initialization.
            mBluetoothService.connect(mAddress);
        }
    };

创建第一个蓝牙管理器。从该蓝牙适配器创建。然后调用RequestPermission。然后调用scanLeDevice。蓝牙扫描完成了“时间”秒。结果存储在ArrayList中。为ArrayList和view创建适配器。结果显示在列表视图中。单击列表中的每个项目时,将调用onItemClick方法。我们通过适配器获取发现的设备特征。为服务创建了Intent。向该服务创建了mConnection方法。但是onServiceConnected方法未调用,因为未打印“ Mithun”。

1 个答案:

答案 0 :(得分:2)

您对Intent感到困惑。应该是。

 Intent i = new Intent(cntxt, BluetoothLeService.class);
 cntxt.startService(i);
 bindService(i, mConnection, BIND_AUTO_CREATE);

如果此Service仅用于Activity,那么您不必使用startService()。绑定服务和启动服务是不同的。阅读Bound services ,然后决定是否只需要启动服务或绑定服务。可以同时启动和绑定服务。您可以在上面的链接中了解更多信息。