Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Problems with android bluetooth permissions

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.

like image 463
J. Arenas Avatar asked Jul 21 '12 11:07

J. Arenas


People also ask

What permissions does Bluetooth need?

If you want your app to initiate device discovery or manipulate Bluetooth settings, you must declare the BLUETOOTH_ADMIN permission. Most apps need this permission solely for the ability to discover local Bluetooth devices.

Why does Bluetooth need location permission?

Your app needs this permission because a Bluetooth scan can be used to gather information about the location of the user. This information may come from the user's own devices, as well as Bluetooth beacons in use at locations such as shops and transit facilities.”


1 Answers

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

like image 178
d.popov Avatar answered Sep 24 '22 02:09

d.popov