Android:尝试使用NullPointerException启动BluetoothSettings活动强制关闭

时间:2010-11-19 11:19:11

标签: android bluetooth settings

我正在尝试打开蓝牙设置的标准窗口(设备名称,可发现性等)。

但是,startActivity(intent)的一般方法以指向BluetoothSettings.java onCreate:135.的NullPointerException结束

使用Android代码进行检查,我发现在第135行,他们从意图中获得了一些额外内容。所以我准备了相同的附加功能(我在android核心BluetoothDevicePicker接口中找到的名称)并发出它 - 与NullPointerException效果相同。

可能是我准备的额外内容的错误名称?

当我打开手动操作的蓝牙设置时,有没有一种方法可以从系统本身提交的意图中看到那些额外的(特别是名字)?

非常感谢。

我的代码是:

Intent settingsIntent = new Intent();
settingsIntent.setClassName("com.android.settings",      com.android.settings.bluetooth.BluetoothSettings");
settingsIntent.putExtra("android.bluetooth.devicepicker.extra.LAUNCH_PACKAGE", "mypackage.bttoggle");
settingsIntent.putExtra("android.bluetooth.devicepicker.extra.DEVICE_PICKER_LAUNCH_CLASS", "mypackage.bttoggle.BluetoothWidget");
PendingIntent settingsPendingIntent = PendingIntent.getActivity(context, 0, settingsIntent, 0);
views.setOnClickPendingIntent(R.id.btnSettings, settingsPendingIntent);

这是一个小部件,所以我需要使用PendingIntent。

此代码在运行时获得以下异常:

  

错误/ AndroidRuntime(4905):未捕获的处理程序:主程序正在退出   未捕获的异常ERROR / AndroidRuntime(4905):   java.lang.RuntimeException:无法启动活动   ComponentInfo {com.android.settings / com.android.settings.bluetooth.BluetoothSettings}:   java.lang.NullPointerException ERROR / AndroidRuntime(4905):at   android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2596)   错误/ AndroidRuntime(4905):at   android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2621)   错误/ AndroidRuntime(4905):at   android.app.ActivityThread.access $ 2200(ActivityThread.java:126)   错误/ AndroidRuntime(4905):at   android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1932)   错误/ AndroidRuntime(4905):at   android.os.Handler.dispatchMessage(Handler.java:99)   ERROR / AndroidRuntime(4905):在android.os.Looper.loop(Looper.java:123)   错误/ AndroidRuntime(4905):at   android.app.ActivityThread.main(ActivityThread.java:4595)   错误/ AndroidRuntime(4905):at   java.lang.reflect.Method.invokeNative(Native Method)   错误/ AndroidRuntime(4905):at   java.lang.reflect.Method.invoke(Method.java:521)   错误/ AndroidRuntime(4905):at   com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:860)   错误/ AndroidRuntime(4905):at   com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)   ERROR / AndroidRuntime(4905):at dalvik.system.NativeStart.main(Native   方法)ERROR / AndroidRuntime(4905):引起:   java.lang.NullPointerException ERROR / AndroidRuntime(4905):at   com.android.settings.bluetooth.BluetoothSettings.onCreate(BluetoothSettings.java:135)   错误/ AndroidRuntime(4905):at   android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)   错误/ AndroidRuntime(4905):at   android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2544)   错误/ AndroidRuntime(4905):... 11更多

经过调查,我发现在BluetoothSettings.java的第135行有:

public class BluetoothSettings extends PreferenceActivity
{

 ... 132 mNeedAuth = intent.getBooleanExtra(BluetoothDevicePicker.EXTRA_NEED_AUTH, false);
 133 mFilterType = intent.getIntExtra(BluetoothDevicePicker.EXTRA_FILTER_TYPE, 134 BluetoothDevicePicker.FILTER_TYPE_ALL);
 135 mLaunchPackage = intent.getStringExtra(BluetoothDevicePicker.EXTRA_LAUNCH_PACKAGE);
 136 mLaunchClass = intent.getStringExtra(BluetoothDevicePicker.EXTRA_LAUNCH_CLASS); ...

我查看了BluetoothDevicePicker以找到附加内容的名称:

public interface BluetoothDevicePicker { public static final String EXTRA_NEED_AUTH = "android.bluetooth.devicepicker.extra.NEED_AUTH";
public static final String EXTRA_FILTER_TYPE = "android.bluetooth.devicepicker.extra.FILTER_TYPE";
public static final String EXTRA_LAUNCH_PACKAGE = "android.bluetooth.devicepicker.extra.LAUNCH_PACKAGE";
public static final String EXTRA_LAUNCH_CLASS = "android.bluetooth.devicepicker.extra.DEVICE_PICKER_LAUNCH_CLASS";

所以,我在我的代码中使用它们来准备那些特殊的附加功能。

2 个答案:

答案 0 :(得分:16)

此代码适用于我

    Intent intentBluetooth = new Intent();
    intentBluetooth.setAction(android.provider.Settings.ACTION_BLUETOOTH_SETTINGS);
    startActivity(intentBluetooth);     

您需要在手机上进行测试,否则您将在模拟器上遇到奇怪的错误(不支持蓝牙)。

答案 1 :(得分:3)

@Zelimir但它显示所有其他选项,因此可以只显示蓝牙选项