android蓝牙权限问题
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/11591895/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Problems with android bluetooth permissions
提问by J. Arenas
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.
首先,抱歉我的英语不好,我是西班牙人(而且是 android 开发新手)。我正在开发一个简单的蓝牙文件发送器,我一步一步地基于 BluetoothChat android 示例。
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.
我不知道ACRA是否与此冲突,我使用它是因为mi设备是huawei u8650并且我没有找到usb驱动程序直接在eclipse中运行应用程序,所以我每次移动.apk文件时间到 SD 卡。
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!
我最近阅读了 Stackoverflow 中的答案,这是我的第一个问题。我将不胜感激任何答案。还有关于改善我的发展的提示。提前致谢!
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.access00(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.access00(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.
如果有帮助。安装应用程序时,它说三个权限,internet、bluetooth 和 bluetooth_admin,并运行 BluetoothAdapter.getDefaultAdapter();没有问题,即使它运行蓝牙请求的意图,但是当应用程序崩溃时 onActivityResult 发挥作用时,它就像应用程序丢失了蓝牙权限,但这很奇怪。
采纳答案by J. Arenas
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.
好的,我找到了问题,我不知道为什么,但 ACRA 给出了错误消息,因为它说该应用程序没有蓝牙权限,而该应用程序确实有这些权限。
I create a new project and copy files, then ACRA said that in onStart method I didn't have super.onStart();
我创建了一个新项目并复制文件,然后 ACRA 说在 onStart 方法中我没有 super.onStart();
I added it and fixed the problem!.
我添加了它并解决了问题!。
回答by d.popov
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
声明中的 AndroidManifest.xml