18

I am completely new to android programming and this is technically my first big project working on Android Studio. I am trying to create an android app that connects to my Arduino device via Bluetooth and eventually processes a .txt file.

Currently, I cant seem to be able to enable Bluetooth. When I click the button which should ask for users' permission to activate Bluetooth, the app freezes and eventually crashes.

I have included java and logcat. Any help on this matter?

java file:

package com.example.a0111601.testsplash;

import android.app.Activity;
import android.bluetooth.BluetoothSocket;
import android.bluetooth.BluetoothServerSocket;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.Context;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Set;
import java.util.UUID;

import android.content.Intent;
import android.content.IntentFilter;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class ConnectingScreen extends Activity {

    private TextView text;
    private ArrayAdapter<String> BTArrayAdapter;
    private ListView listView;
    public BluetoothAdapter bluetoothAdapter;
    private final static UUID uuid = UUID.fromString("fc5ffc49-00e3-4c8b-9cf1-6b72aad1001a");
    private Button btn_refresh;
    private Button btn_proceed;
    private ArrayAdapter adapter;
    private static final int ENABLE_BT_REQUEST_CODE = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.connecting_screen);

        // Initialize items on the screen from the layout in order //

        // Get bluetooth status //
        text = (TextView) findViewById(R.id.status_BT);
        bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        if (!bluetoothAdapter.isEnabled()) { // if bluetooth has not been enabled //
            text.setText("Disabled");
        } else { // bluetooth has already been enabled //
            text.setText("Enabled");
        }

        // Set up list for selection of available devices //
        listView = (ListView) findViewById(R.id.Connecting_devices);
        // Click listener on list //
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
                // Cancel discovery because it's costly and we're about to connect
                bluetoothAdapter.cancelDiscovery();

                // Get the device MAC address, which is the last 17 chars in the View
                String info = ((TextView) v).getText().toString();
                String address = info.substring(info.length() - 17);
                BluetoothDevice bluetoothDevice = bluetoothAdapter.getRemoteDevice(address);
                // Initiate a connection request in a separate thread
                ConnectingThread t = new ConnectingThread(bluetoothDevice);
                t.start();
            }
        });

        BTArrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);
        listView.setAdapter(BTArrayAdapter);

        // Register for broadcasts when a device is discovered
        IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
        this.registerReceiver(mReceiver, filter);

        // Register for broadcasts when discovery has finished
        filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
        this.registerReceiver(mReceiver, filter);

        // Initialize Refresh button //
        btn_refresh = (Button) findViewById(R.id.refresh);
        btn_refresh.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                BTArrayAdapter.clear();
                while (!bluetoothAdapter.isEnabled()) { // if bluetooth has not been enabled //
                    // Dialog to request user permission to enable BT //
                    Intent enableBluetoothIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                    startActivityForResult(enableBluetoothIntent, ENABLE_BT_REQUEST_CODE);
                }
                if (bluetoothAdapter.isEnabled()) { // bluetooth has already been enabled //
                    text.setText("Enabled");
                    // To discover devices //
                    discoverDevices();
                    Toast.makeText(getApplicationContext(), "Scanning for devices...", Toast.LENGTH_LONG).show();
                }
            }
        });

        btn_proceed = (Button) findViewById(R.id.proceed_footer);
        // Source: http://stackoverflow.com/questions/24610527/how-do-i-get-a-button-to-open-another-activity-in-android-studio //
        // Proceed button to continue on to next activity //
        btn_proceed.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick (View v) {
                startActivity(new Intent(ConnectingScreen.this, MainActivity.class));
            }
        });

        // Disable "proceed" button by default to prevent user from going to next activity //
        // Source: //
        // http://stackoverflow.com/questions/4384890/how-to-disable-an-android-button //
        btn_proceed.setEnabled(false);

    }

    // ConnectingThread method to connect to device selected from list //
    private class ConnectingThread extends Thread {
        private final BluetoothSocket bluetoothSocket;
        private final BluetoothDevice bluetoothDevice;

        public ConnectingThread(BluetoothDevice device) {
            BluetoothSocket temp = null;
            bluetoothDevice = device;

            // Get a BluetoothSocket to connect with the selected BluetoothDevice
            try {
                temp = bluetoothDevice.createRfcommSocketToServiceRecord(uuid);
            } catch (IOException e) {
                e.printStackTrace();
            }
            bluetoothSocket = temp;
        }

        public void run() {
            // Cancel discovery first to not slow down connection speed //
            bluetoothAdapter.cancelDiscovery();

            try {
                // bluetoothSocket.connect() to initiate connection request //
                // This will block until it succeeds in connecting to the device through the bluetoothSocket or throws an exception //
                bluetoothSocket.connect();
            } catch (IOException connectException) {
                connectException.printStackTrace();
                try {
                    bluetoothSocket.close();
                } catch (IOException closeException) {
                    closeException.printStackTrace();
                }
            }
            if (bluetoothSocket.isConnected()) {
                btn_proceed.setEnabled(true);
            }
        }
    }

    // discoverDevices() method //
    // To scan for other devices //
    protected void discoverDevices() {
        // If we're already discovering, stop it
        if (bluetoothAdapter.isDiscovering()) {
            bluetoothAdapter.cancelDiscovery();
        }
        bluetoothAdapter.startDiscovery();
        // to change the bluetooth status accordingly //
        if (bluetoothAdapter.startDiscovery()) {
            text.setText("Scanning");
            Toast.makeText(getApplicationContext(), "Scanning for devices...", Toast.LENGTH_LONG).show();
        } else {
            text.setText("Error scanning");
            Toast.makeText(getApplicationContext(), "Discovery failed to start!", Toast.LENGTH_LONG).show();
        }
    }

    /**
     * The BroadcastReceiver that listens for discovered devices and changes the title when
     * discovery is finished
     */
    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();

            // When discovery finds a device //
            if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                // Get the BluetoothDevice object from the Intent //
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                // If it's already paired, skip it, because it's been listed already //
                if (device.getBondState() != BluetoothDevice.BOND_BONDED) {
                    BTArrayAdapter.add(device.getName() + "\n" + device.getAddress());
                }

                // When discovery is finished, change the Activity title //
            } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
                Toast.makeText(getApplicationContext(), "Select device to pair with", Toast.LENGTH_LONG).show();
                text.setText("Select device from list");
                if (BTArrayAdapter.getCount() == 0) {
                    text.setText("No devices found");
                    String noDevices = getResources().getText(R.string.none_found).toString();
                    BTArrayAdapter.add(noDevices);
                }
            }
        }
    };

    @Override
    protected void onDestroy() {
        super.onDestroy();

        // Make sure we're not doing discovery anymore
        if (bluetoothAdapter != null) {
            bluetoothAdapter.cancelDiscovery();
        }
        // Unregister broadcast listeners
        this.unregisterReceiver(mReceiver);
    }
}

logcat:

10-20 14:52:23.693 6976-6976/? E/Zygote: MountEmulatedStorage()
10-20 14:52:23.693 6976-6976/? E/Zygote: v2
10-20 14:52:23.693 6976-6976/? I/libpersona: KNOX_SDCARD checking this for 10065
10-20 14:52:23.693 6976-6976/? I/libpersona: KNOX_SDCARD not a persona
10-20 14:52:23.693 6976-6976/? I/SELinux: Function: selinux_compare_spd_ram, SPD-policy is existed. and_ver=SEPF_GT-I9505_5.0.1 ver=27
10-20 14:52:23.693 6976-6976/? I/SELinux: Function: selinux_compare_spd_ram , priority [2] , priority version is VE=SEPF_GT-I9505_5.0.1-1_0032
10-20 14:52:23.703 6976-6976/? E/SELinux: [DEBUG] get_category: variable seinfo: default sensitivity: NULL, cateogry: NULL
10-20 14:52:23.703 6976-6976/? I/art: Late-enabling -Xcheck:jni
10-20 14:52:23.723 6976-6983/? E/art: Failed sending reply to debugger: Broken pipe
10-20 14:52:23.723 6976-6983/? I/art: Debugger is no longer active
10-20 14:52:23.753 6976-6976/? D/ResourcesManager: creating new AssetManager and set to /data/app/com.example.a0111601.testsplash-2/base.apk
10-20 14:52:23.943 6976-6976/? D/Activity: performCreate Call secproduct feature valuefalse
10-20 14:52:23.943 6976-6976/? D/Activity: performCreate Call debug elastic valuetrue
10-20 14:52:23.953 6976-7015/? D/OpenGLRenderer: Render dirty regions requested: true
10-20 14:52:23.983 6976-7015/? I/Adreno-EGL: <qeglDrvAPI_eglInitialize:410>: EGL 1.4 QUALCOMM build:  ()
10-20 14:52:23.983 6976-7015/? I/Adreno-EGL: OpenGL ES Shader Compiler Version: E031.25.03.06
10-20 14:52:23.983 6976-7015/? I/Adreno-EGL: Build Date: 01/24/15 Sat
10-20 14:52:23.983 6976-7015/? I/Adreno-EGL: Local Branch: AF11_RB1_AU15
10-20 14:52:23.983 6976-7015/? I/Adreno-EGL: Remote Branch: 
10-20 14:52:23.983 6976-7015/? I/Adreno-EGL: Local Patches: 
10-20 14:52:23.983 6976-7015/? I/Adreno-EGL: Reconstruct Branch: 
10-20 14:52:23.983 6976-7015/? I/OpenGLRenderer: Initialized EGL, version 1.4
10-20 14:52:24.013 6976-7015/? D/OpenGLRenderer: Enabling debug mode 0
10-20 14:52:24.674 6976-6976/? I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@29f66b0b time:6733391
10-20 14:52:25.735 6976-6983/com.example.a0111601.testsplash I/art: Ignoring second debugger -- accepting and dropping
10-20 14:52:26.736 6976-7014/? I/Timeline: Timeline: Activity_launch_request id:com.example.a0111601.testsplash time:6735467
10-20 14:52:26.816 6976-6976/? D/AbsListView: Get MotionRecognitionManager
10-20 14:52:26.836 6976-6976/? D/Activity: performCreate Call secproduct feature valuefalse
10-20 14:52:26.836 6976-6976/? D/Activity: performCreate Call debug elastic valuetrue
10-20 14:52:27.066 6976-6976/? I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@21202ee1 time:6735796
10-20 14:53:00.079 6976-6976/? I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@21202ee1 time:6768804
10-20 14:54:12.720 6976-6976/? D/ViewRootImpl: ViewPostImeInputStage ACTION_DOWN
10-20 14:54:14.441 6976-6976/? D/ViewRootImpl: ViewPostImeInputStage ACTION_DOWN
10-20 14:54:14.952 6976-6976/? D/ViewRootImpl: ViewPostImeInputStage ACTION_DOWN
10-20 14:54:17.514 6976-6976/? D/ViewRootImpl: ViewPostImeInputStage ACTION_DOWN
10-20 15:04:08.991 6976-6976/? D/AndroidRuntime: Shutting down VM
10-20 15:04:09.021 6976-6976/? E/AndroidRuntime: FATAL EXCEPTION: main
10-20 15:04:09.021 6976-6976/? E/AndroidRuntime: Process: com.example.a0111601.testsplash, PID: 6976
10-20 15:04:09.021 6976-6976/? E/AndroidRuntime: java.lang.SecurityException: Need BLUETOOTH permission: Neither user 10065 nor current process has android.permission.BLUETOOTH.
10-20 15:04:09.021 6976-6976/? E/AndroidRuntime:     at android.os.Parcel.readException(Parcel.java:1540)
10-20 15:04:09.021 6976-6976/? E/AndroidRuntime:     at android.os.Parcel.readException(Parcel.java:1493)
10-20 15:04:09.021 6976-6976/? E/AndroidRuntime:     at android.bluetooth.IBluetooth$Stub$Proxy.isEnabled(IBluetooth.java:1156)
10-20 15:04:09.021 6976-6976/? E/AndroidRuntime:     at android.bluetooth.BluetoothAdapter.isEnabled(BluetoothAdapter.java:695)
10-20 15:04:09.021 6976-6976/? E/AndroidRuntime:     at com.example.a0111601.testsplash.ConnectingScreen$2.onClick(ConnectingScreen.java:93)
10-20 15:04:09.021 6976-6976/? E/AndroidRuntime:     at android.view.View.performClick(View.java:5197)
10-20 15:04:09.021 6976-6976/? E/AndroidRuntime:     at android.view.View$PerformClick.run(View.java:20926)
10-20 15:04:09.021 6976-6976/? E/AndroidRuntime:     at android.os.Handler.handleCallback(Handler.java:739)
10-20 15:04:09.021 6976-6976/? E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:95)
10-20 15:04:09.021 6976-6976/? E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:145)
10-20 15:04:09.021 6976-6976/? E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5942)
10-20 15:04:09.021 6976-6976/? E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
10-20 15:04:09.021 6976-6976/? E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:372)
10-20 15:04:09.021 6976-6976/? E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400)
10-20 15:04:09.021 6976-6976/? E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195)
10-20 15:04:09.031 6976-6976/? E/AndroidRuntime: Error reporting crash
10-20 15:04:09.031 6976-6976/? E/AndroidRuntime: android.os.DeadObjectException
10-20 15:04:09.031 6976-6976/? E/AndroidRuntime:     at android.os.BinderProxy.transactNative(Native Method)
10-20 15:04:09.031 6976-6976/? E/AndroidRuntime:     at android.os.BinderProxy.transact(Binder.java:496)
10-20 15:04:09.031 6976-6976/? E/AndroidRuntime:     at android.app.ActivityManagerProxy.handleApplicationCrash(ActivityManagerNative.java:4686)
10-20 15:04:09.031 6976-6976/? E/AndroidRuntime:     at com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException(RuntimeInit.java:95)
10-20 15:04:09.031 6976-6976/? E/AndroidRuntime:     at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693)
10-20 15:04:09.031 6976-6976/? E/AndroidRuntime:     at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690)
10-20 15:04:09.031 6976-6976/? I/Process: Sending signal. PID: 6976 SIG: 9

Manifest:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.a0111601.testsplash">

    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".splash"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:label="@string/app_name"
            android:theme="@android:style/Theme.Translucent.NoTitleBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

        </activity>

        <activity
            android:name=".ConnectingScreen"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="com.example.a0111601.CONNECTINGSCREEN" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

        <activity
            android:name=".MainActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="com.example.a0111601.MAINACTIVITY" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

    </application>

</manifest>
3

2 Answers 2

13
//Add bellow line in your manifest 

<manifest ... >
  <uses-permission android:name="android.permission.BLUETOOTH" />
  ...
</manifest>
Sign up to request clarification or add additional context in comments.

3 Comments

How does that help? BLUETOOTH_PRIVILEGED error will still occur when bluetooth is turned off on the device.
I believe the error above is specific to having the permission removed from the manifest. Android still lets you instantiate a Bluetooth adapter if bluetooth is off on the device
I have the same exact error while having <uses-permission android:name="android.permission.BLUETOOTH" /> in my manifest. There must be an additional requirement that is not so trivial to figure out.
5

Add the following permission for the Bluetooth admin:

<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

1 Comment

I tried this one, too, but this does not solve the issue.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.