Problems with android bluetooth permissions

28,286

Solution 1

OK, I have found the problem, I don't know why but ACRA was giving a wrong message because it said that app had not bluetooth permissions and the app do had them.

I create a new project and copy files, then ACRA said that in onStart method I didn't have super.onStart();

I added it and fixed the problem!.

Solution 2

you need both

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

and

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

declarations in the AndroidManifest.xml

Share:
28,286
J. Arenas
Author by

J. Arenas

Updated on September 25, 2020

Comments

  • J. Arenas
    J. Arenas over 3 years

    First, sorry for my bad English, I'm Spanish (And new to android developing). I am developing a simple Bluetooth file sender, I am basing on BluetoothChat android example step by step.

    Now I have a bluetooth activate request to the user, and select yes or no option application crashes.

    I have the permissions declared in the Manifest.

    The thing is, if user select yes to activate bluetooth, bluetooth actually activates but app still crashes after that.

    I don't know if ACRA is in conflict with this, I'm using it because mi device is huawei u8650 and I don't find usb drivers to run app directly in the device from eclipse, so I move the .apk file every time to SD card.

    Here is the manifest:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.BTSender"
        android:versionCode="1"
        android:versionName="1.0" >
        <uses-sdk android:minSdkVersion="10" />    
        <uses-permission android:name="android.permission.BLUETOOTH"/>
        <uses-permission android:name="android.permission.INTERNET"/>
        <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
        <application
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name" android:name="MyApplication">
            <activity
                android:name=".BluetoothSenderActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    </manifest>
    

    and here is the main ( and only ) activity:

    package com.BTSender;
    
    import android.app.Activity;
    import android.bluetooth.BluetoothAdapter;
    import android.content.Intent;
    import android.os.Bundle;
    import android.util.Log;
    import android.widget.Toast;
    
    public class BluetoothSenderActivity extends Activity {
    
        private BluetoothAdapter BTAdapter;
        private String TAG = "BTSender";
        private final int REQUEST_ENABLE_BT = 2;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            // Creating window layout
            Log.v(TAG, "**Creating window**");
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            Log.v(TAG, "**Window created");
            // Get the bluetooth adapter
            BTAdapter = BluetoothAdapter.getDefaultAdapter();
            // If null, that means bluetooth is not supported on the device
            if (BTAdapter == null) {
                Toast.makeText(this, R.string.BluetoothNotSupported,
                    Toast.LENGTH_LONG).show();
                finish();
                return;
            }
        }
    
        @Override
        public void onStart() {
            // Check if Bluetooth is enabled, otherwise request user to enable it
            if (!BTAdapter.isEnabled()) {
                // IT NEEDS BLUETOOTH PERMISSION
                // Intent to enable bluetooth, it will show the enable bluetooth
                // dialog
                Intent enableIntent = new Intent(
                        BluetoothAdapter.ACTION_REQUEST_ENABLE);
                // this is to get a result if bluetooth was enabled or not
                startActivityForResult(enableIntent, REQUEST_ENABLE_BT);
                // It will call onActivityResult method to determine if Bluetooth
                // was enabled or not
            } else {
                // Bluetooth is enabled
            }
        }
    
        // this will be called when in onStart method startActivityForResult is
        // executed
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            Log.v(TAG, "** onActivityResult **");
            // determine from which activity
            switch (requestCode) {
            // if it was the request to enable Bluetooth:
            case REQUEST_ENABLE_BT:
                if (resultCode == Activity.RESULT_OK) {
                    // Bluetooth is enabled now
                    Log.v(TAG, "** Bluetooth is now enabled**");
                } else {
                    // user decided not to enable Bluetooth so exit application
                    Log.v(TAG, "** Bluetooth is NOT enabled**");
                    Toast.makeText(this, R.string.BluetoothNotEnabled,
                        Toast.LENGTH_LONG).show();
                    finish();
                }
            }
        }
    }
    

    I have read answers in Stackoverflow recently and this is my first question. I would appreciate any answers. Also tips on improve my developing. Thanks in advance!

    java.lang.RuntimeException: Unable to start activity      
    ComponentInfo{com.BTSender/com.BTSender.BluetoothSenderActivity}:  
    java.lang.SecurityException: Need BLUETOOTH permission: Neither user 10076 nor current 
    process has android.permission.BLUETOOTH.
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1654)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1670)
        at android.app.ActivityThread.access$1500(ActivityThread.java:117)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:123)
        at android.app.ActivityThread.main(ActivityThread.java:3695)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:507)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
        at dalvik.system.NativeStart.main(Native Method)
    Caused by: java.lang.SecurityException: Need BLUETOOTH permission: Neither user 10076    
    nor current process has android.permission.BLUETOOTH.
        at android.os.Parcel.readException(Parcel.java:1322)
        at android.os.Parcel.readException(Parcel.java:1276)
        at android.bluetooth.IBluetooth$Stub$Proxy.isEnabled(IBluetooth.java:496)
        at android.bluetooth.BluetoothAdapter.isEnabled(BluetoothAdapter.java:351)
        at com.BTSender.BluetoothSenderActivity.onStart(BluetoothSenderActivity.java:51)
        at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1129)
        at android.app.Activity.performStart(Activity.java:3791)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1627)
        ... 11 more
    java.lang.SecurityException: Need BLUETOOTH permission: Neither user 10076 nor current   
    process has android.permission.BLUETOOTH.
        at android.os.Parcel.readException(Parcel.java:1322)
        at android.os.Parcel.readException(Parcel.java:1276)
        at android.bluetooth.IBluetooth$Stub$Proxy.isEnabled(IBluetooth.java:496)
        at android.bluetooth.BluetoothAdapter.isEnabled(BluetoothAdapter.java:351)
        at com.BTSender.BluetoothSenderActivity.onStart(BluetoothSenderActivity.java:51)
        at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1129)
        at android.app.Activity.performStart(Activity.java:3791)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1627)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1670)
        at android.app.ActivityThread.access$1500(ActivityThread.java:117)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:123)
        at android.app.ActivityThread.main(ActivityThread.java:3695)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:507)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
        at dalvik.system.NativeStart.main(Native Method)
    

    If it helps. When installing the app it says the three permissions, internet, bluetooth and bluetooth_admin, and it runs BluetoothAdapter.getDefaultAdapter(); without problems, even it runs the intent for bluetooth request, but it is when the onActivityResult comes into play when the app crashes it's like the app have lost the bluetooth permissions but thats is strange.