Android实时蓝牙串口数据存文件程序崩溃问题求助
Hey there! Let's dig into why your Bluetooth app is crashing. Since you mentioned no compile errors, the issue is definitely runtime-related—here are the most common culprits and actionable fixes to try:
1. Double-check Bluetooth & Storage Permissions
Android’s permission system is strict, especially for Bluetooth and file access. First, make sure you’ve added all required permissions to your AndroidManifest.xml:
<!-- Bluetooth core permissions --> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- Required for scanning on Android 6+ --> <!-- Storage permissions --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- Android 12+ specific Bluetooth permissions --> <uses-permission android:name="android.permission.BLUETOOTH_SCAN" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
And remember: for Android 6.0+, you need to request these permissions dynamically at runtime, not just rely on the manifest. Add code to check if permissions are granted before starting any Bluetooth or file operations.
2. Never Do Bluetooth/File IO on the Main Thread
Android blocks long-running operations (like Bluetooth data reading or file writing) on the UI thread—this will trigger ANRs (Application Not Responding) or straight-up crashes. Move all these tasks to a background thread. Here’s a quick example with a basic thread:
new Thread(() -> { try { // Get input stream from Bluetooth socket InputStream inputStream = bluetoothSocket.getInputStream(); // Use app's private external storage (no dynamic permission needed on Android 10+) File dataFile = new File(getExternalFilesDir(null), "bt_received_data.txt"); FileOutputStream fos = new FileOutputStream(dataFile, true); // Append mode byte[] buffer = new byte[1024]; int bytesRead; // Read and write data until connection breaks while ((bytesRead = inputStream.read(buffer)) != -1) { fos.write(buffer, 0, bytesRead); fos.flush(); } } catch (IOException e) { // Log the error instead of ignoring it! e.printStackTrace(); } }).start();
3. Add Proper Exception Handling & Resource Cleanup
Bluetooth connections are fragile—disconnections, timeouts, or IO errors can happen anytime. If you don’t catch these exceptions, your app will crash immediately. Also, always clean up resources when disconnecting:
private void cleanupBluetoothResources() { try { if (inputStream != null) inputStream.close(); if (outputStream != null) outputStream.close(); if (bluetoothSocket != null) bluetoothSocket.close(); } catch (IOException e) { e.printStackTrace(); } }
Call this method when the Bluetooth connection drops or your app is paused.
4. Use Safe File Paths
Avoid hardcoding absolute paths like /sdcard/bt_data.txt—these can trigger permission errors or break on newer Android versions. Instead, use Android’s recommended directories:
- App private internal storage (no permissions needed):
File internalFile = new File(getFilesDir(), "bt_data.txt"); - App private external storage (no dynamic permissions on Android 10+):
File externalFile = new File(getExternalFilesDir(null), "bt_data.txt");
5. Check Logcat for Exact Crash Details
The most straightforward way to pinpoint the issue is to look at Android Studio’s Logcat. Search for FATAL EXCEPTION—it will show you the exact line of code that caused the crash, along with the exception type (e.g., NullPointerException if you used an uninitialized object, SecurityException if permissions are missing).
Quick Extra Checks
- Make sure your Arduino’s Bluetooth module (like HC-05/06) uses the same baud rate as your Android app.
- Verify the Bluetooth device is paired with your phone before trying to connect.
内容的提问来源于stack exchange,提问作者Elmira

