마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

분량 초과로 코드/로그캣 따로 보냅니다. 정말 죄송합니다.

0 추천
        Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices();
        ArrayList<String> deviceNames = new ArrayList<>();
        final ArrayList<BluetoothDevice> devices = new ArrayList<>();

        if (pairedDevices.size() > 0) {
            for (BluetoothDevice device : pairedDevices) {
                deviceNames.add(device.getName() + "\n" + device.getAddress());
                devices.add(device);
            }
        } else {
            Toast.makeText(this, "No paired devices found", Toast.LENGTH_SHORT).show();
            return;
        }

        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("Select Bluetooth Device");
        builder.setItems(deviceNames.toArray(new CharSequence[deviceNames.size()]), new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                BluetoothDevice device = devices.get(which);
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
                    if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) {
                        ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN}, REQUEST_PERMISSIONS);
                        return;
                    }
                }
                ConnectThread connectThread = new ConnectThread(device);
                connectThread.start();
            }
        });
        builder.show();
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_ENABLE_BT) {
            if (resultCode == RESULT_OK) {
                showPairedDevices();
            } else {
                Toast.makeText(this, "Bluetooth is required to run this application", Toast.LENGTH_LONG).show();
                finish();
            }
        }
        super.onActivityResult(requestCode, resultCode, data);
    }

    private class ConnectThread extends Thread {
        private final BluetoothDevice device;

        public ConnectThread(BluetoothDevice device) {
            BluetoothSocket tmp = null;
            this.device = device;

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
                if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) {
                    ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN}, REQUEST_PERMISSIONS);
                    return;
                }
            }

            try {
                tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
            } catch (IOException e) {
                Log.e(TAG, "Socket's create() method failed", e);
            }
            bluetoothSocket = tmp;
        }

        public void run() {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
                if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) {
                    ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN}, REQUEST_PERMISSIONS);
                    return;
                }
            }

            bluetoothAdapter.cancelDiscovery();

            try {
                bluetoothSocket.connect();
                manageConnectedSocket();
            } catch (IOException e) {
                try {
                    bluetoothSocket.close();
                } catch (IOException closeException) {
                    Log.e(TAG, "Could not close the client socket", closeException);
                }
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(MainActivity.this, "Unable to connect to device. Please try again.", Toast.LENGTH_LONG).show();
                    }
                });
            }
        }
    }

    private void manageConnectedSocket() {
        try {
            inputStream = bluetoothSocket.getInputStream();
            final byte[] buffer = new byte[1024];
            int bytes;
            while (true) {
                try {
                    bytes = inputStream.read(buffer);
                    String readMessage = new String(buffer, 0, bytes).trim();
                    if (readMessage.isEmpty()) {
                        continue;
                    }
                    Log.d(TAG, "Received message: " + readMessage);
                    Message msg = handler.obtainMessage();
                    Bundle bundle = new Bundle();
                    bundle.putString("posture", readMessage);
                    msg.setData(bundle);
                    handler.sendMessage(msg);
                } catch (IOException e) {
                    Log.e(TAG, "Error occurred when reading input stream", e);
                    runOnUiThread(() ->
                            Toast.makeText(MainActivity.this, "Error occurred during communication. Please try again.", Toast.LENGTH_LONG).show());
                    break;
                }
            }
        } catch (IOException e) {
            Log.e(TAG, "Error occurred when creating input stream", e);
            runOnUiThread(() ->
                    Toast.makeText(MainActivity.this, "Error occurred during communication setup. Please try again.", Toast.LENGTH_LONG).show());
        }
    }

    private void showStretchingImages(String posture) {
        int[] stretchImages = getStretchImagesForPosture(posture);
        if (stretchImages == null) {
            return;
        }
        new CountDownTimer(270000, 30000) {
            int index = 0;
            @Override
            public void onTick(long millisUntilFinished) {
                if (index < stretchImages.length) {
                    stretchImageView.setImageResource(stretchImages[index]);
                    index++;
                }
            }
            @Override
            public void onFinish() {
            }
        }.start();
    }

    private int[] getStretchImagesForPosture(String posture) {
        int[] images = null;
        switch (posture) {
            case "GOOD":
                images = new int[]{R.drawable.p1, R.drawable.w1, R.drawable.w2, R.drawable.w3, R.drawable.w4,
                        R.drawable.w5, R.drawable.w6, R.drawable.w7, R.drawable.w8};
                break;
            case "SLIGHT":
                images = new int[]{R.drawable.p2, R.drawable.w9, R.drawable.w10, R.drawable.w11, R.drawable.w12,
                        R.drawable.w13, R.drawable.w14, R.drawable.w15, R.drawable.w16};
                break;
            case "BAD":
                images = new int[]{R.drawable.p3, R.drawable.w17, R.drawable.w18, R.drawable.w19, R.drawable.w20,
                        R.drawable.w21, R.drawable.w22, R.drawable.w23, R.drawable.w24};
                break;
        }
        return images;
    }
}

신수호 (220 포인트) 님이 2024년 7월 11일 질문

1개의 답변

+1 추천
퍼미션 처리가 제대로 되고 있는지 확인이 필요해 보이구요. 퍼미션이 처리되진 않으면 다음 코드가 진행이 안될 것 같구요. (chat gpt 요약으로 보면 문제는 없어 보이긴 합니다)
혹시 전송 받은 문자열이 빈 문자열은 아닌지도 확인을 해보셔야 할 것 같구요.
데이터가 안받아는지는 경우는 manageConnectedSocket 함수 쪽이 제대로 동작을 하지 않을 가능성이 커보이구요.

디버깅하는 방법을 찾아보셔서, 브레이크 포인트를 설정하셔서 설제로 어느 부분에서 막히는지 확인해 보시는게 제일 좋은 문제 찾는 방법 중의 하나입니다.
spark (230,170 포인트) 님이 2024년 7월 12일 답변
답변 정말 감사합니다. 답변 토대로 수정 해보겠습니다.
...