我正在开发具有蓝牙功能的应用程序。我使用片段扫描并列出蓝牙设备。单击时,会回调提供所选蓝牙设备的主要活动。
我开始使用带有 Android 6 (API 23) 的智能手机,然后不得不修改代码以用于 Android 5.0 (API 21)。
我只是将 minSDK 更改为 API21 并重新构建项目,没有任何问题。
该应用程序在智能手机上运行没有任何问题。搭载 Android 5 的平板电脑运行该应用程序,但在我选择蓝牙设备时因空指针异常而崩溃。
我还没有找到任何解决此问题的方法,也不知道如何进行。也许有人可以帮忙?:-)
日志是:
me: FATAL EXCEPTION: main
Process: de.tuhh.et5.tills.biocontrol, PID: 26512
java.lang.NullPointerException: Attempt to invoke interface method 'void de.tuhh.et5.tills.biocontrol.activity.BLEListFragment$OnBLEDeviceSelectedListener.OnBLEDeviceSelected(android.bluetooth.BluetoothDevice)' on a null object reference at de.tuhh.et5.tills.biocontrol.activity.BLEListFragment.onListItemClick(BLEListFragment.java:92)
at android.app.ListFragment$2.onItemClick(ListFragment.java:160)
at android.widget.AdapterView.performItemClick(AdapterView.java:305)
at android.widget.AbsListView.performItemClick(AbsListView.java:1185)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:3222)
at android.widget.AbsListView$3.run(AbsListView.java:4138)
at android.os.Handler.handleCallback(Handler.java:815)
at android.os.Handler.dispatchMessage(Handler.java:104)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5568)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:955) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:750)
Run Code Online (Sandbox Code Playgroud)
由于代码很多,我将尝试总结重要的代码段:
错误是指这个方法
@Override
public void onListItemClick(ListView mBluetoothLeDeviceList, View v, int position, long id) {
if(DEBUG)d("onListItemClick()");
mBluetoothLeDeviceList.getChildAt(position).setBackgroundColor(Color.GREEN); // set background
mBluetoothLeDeviceList.getChildAt(position).setFocusable(false); // not clickable again
mCallback.OnBLEDeviceSelected(mListAdapter.getDevice(position));
}
Run Code Online (Sandbox Code Playgroud)
带有 mCallback... 的最后一行生成空指针异常。蓝牙设备肯定不为空,所以刚出现在 android 5.0 下的回调肯定有问题(对我来说听起来不正确:-))
创建回调:
OnBLEDeviceSelectedListener mCallback;
Run Code Online (Sandbox Code Playgroud)
和界面
public interface OnBLEDeviceSelectedListener {
void OnBLEDeviceSelected(BluetoothDevice device);
}
Run Code Online (Sandbox Code Playgroud)
这确保侦听器在主要活动中实现:
try {
mCallback = (OnBLEDeviceSelectedListener) context;
} catch (ClassCastException e) {
throw new ClassCastException(context.toString()
+ " must implement OnBLEDeviceeSelectedListener");
}
Run Code Online (Sandbox Code Playgroud)
主要活动实现 BLEListFragment.OnBLEDeviceSelectedListener 并包含
@Override
public void OnBLEDeviceSelected(BluetoothDevice device) {
.
.
.}
Run Code Online (Sandbox Code Playgroud)
就是这样。我觉得很奇怪,它可以在一台设备上运行,而在另一台设备上崩溃而没有任何编译错误。
我感谢任何想法或提示。
感谢和问候
Make sure you implement both methods in fragment like this.
@Override
public void onAttach(Context context) {
super.onAttach(context);
//Your callback initialization here
}
@Override
public void onAttach(Activity activity) {
super.onAttach(context);
//Your callback initialization here
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12981 次 |
| 最近记录: |