ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

android – 在应用程序关闭后保存BluetoothDevice对象

2019-07-04 02:11:17  阅读:167  来源: 互联网

标签:android global-variables bluetooth


我想保存我的应用程序连接的最后一个蓝牙设备.如果有先前的蓝牙连接,我想不提示用户.他们可以选择连接到新设备,但他们不需要.如果他们选择不选择连接,他们将定期使用该应用程序,然后当需要蓝牙设备时,它将连接到最新的设备.

我尝试使用下面Tudor Luca的答案中提供的代码,但该对象不会写入该文件.我收到一个NotSerializableException.我想保存的对象是一个使用import android.bluetooth.BluetoothDevice导入的BluetoothDevice.

这是我试图使蓝牙设备可序列化:

import java.io.Serializable;
import android.bluetooth.BluetoothDevice;

public class SerializableObjects implements Serializable {
    private BluetoothDevice device;

    public SerializableObjects( BluetoothDevice device ) {
        this.device = device;
    }

    public BluetoothDevice getDevice() {
        return this.device;
    }
}

LogCat返回:

12-11 17:46:24.032: W/System.err(24641): java.io.NotSerializableException: android.bluetooth.BluetoothDevice
12-11 17:46:24.032: W/System.err(24641):    at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1535)
12-11 17:46:24.032: W/System.err(24641):    at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1847)
12-11 17:46:24.032: W/System.err(24641):    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1689)
12-11 17:46:24.032: W/System.err(24641):    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1653)
12-11 17:46:24.032: W/System.err(24641):    at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:1143)
12-11 17:46:24.032: W/System.err(24641):    at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:413)
12-11 17:46:24.032: W/System.err(24641):    at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1241)
12-11 17:46:24.032: W/System.err(24641):    at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1575)
12-11 17:46:24.032: W/System.err(24641):    at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1847)
12-11 17:46:24.032: W/System.err(24641):    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1689)
12-11 17:46:24.032: W/System.err(24641):    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1653)
12-11 17:46:24.032: W/System.err(24641):    at my.eti.commander.LocalObjects.writeObjectToFile(LocalObjects.java:29)
12-11 17:46:24.032: W/System.err(24641):    at my.eti.commander.MainMenu$1.handleMessage(MainMenu.java:460)
12-11 17:46:24.032: W/System.err(24641):    at android.os.Handler.dispatchMessage(Handler.java:99)
12-11 17:46:24.036: W/System.err(24641):    at android.os.Looper.loop(Looper.java:130)
12-11 17:46:24.036: W/System.err(24641):    at android.app.ActivityThread.main(ActivityThread.java:3687)
12-11 17:46:24.036: W/System.err(24641):    at java.lang.reflect.Method.invokeNative(Native Method)
12-11 17:46:24.036: W/System.err(24641):    at java.lang.reflect.Method.invoke(Method.java:507)
12-11 17:46:24.036: W/System.err(24641):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
12-11 17:46:24.036: W/System.err(24641):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
12-11 17:46:24.036: W/System.err(24641):    at dalvik.system.NativeStart.main(Native Method)

解决方法:

无法直接序列化BluetoothDevice类.即使你序列化它,我认为你不能在应用程序关闭后重新使用该对象.相反,我有一个辅助类,它将存储设备的地址.您可以保存设备地址和名称,稍后再读取该信息.然后,您可以执行绑定设备的发现/搜索并获取相应的设备.

这是我通常使用的辅助类

public class BluetoothState implements Serializable {
    public static final int STATE_NOT_CONNECTED = 1;
    public static final int STATE_CONNECTED = 1;

    public static final String filename = "btState.pref";

    public static int connectionState = STATE_NOT_CONNECTED;
    public static String deviceAddress = "00:00:00:00:00:00";
    public static String deviceName = "";

    public static void setConnectionState(boolean connected,BluetoothDevice device) {
        if(connected)
            connectionState = STATE_CONNECTED;
        else
            connectionState = STATE_NOT_CONNECTED;

        if(device != null) {
            deviceAddress = device.getAddress();
            deviceName = device.getName();
        }

    }

    public static void saveConnectionState(Context cxt) throws IOException {        
        FileOutputStream fos = cxt.openFileOutput(filename, Context.MODE_PRIVATE);
        ObjectOutputStream oos = new ObjectOutputStream(fos);       
        oos.writeInt(connectionState);
        oos.writeUTF(deviceAddress);
        oos.writeUTF(deviceName);
    }

    public static void loadConnectionState(Context cxt) throws IOException {        
        FileInputStream fis = cxt.openFileInput(filename);
        ObjectInputStream ois = new ObjectInputStream(fis);     
        connectionState = ois.readInt();
        deviceAddress = ois.readUTF();
        deviceName = ois.readUTF();
    }

    public static BluetoothDevice getDevice() {
        BluetoothAdapter btAdapter = BluetoothAdapter.getDefaultAdapter();
        if(!btAdapter.isEnabled())
            btAdapter.enable();

        Set<BluetoothDevice> pairedDevices = btAdapter.getBondedDevices();

        for(BluetoothDevice d : pairedDevices)
            if(d.getAddress().equalsIgnoreCase(deviceAddress))
                return d;

        return null;        
    }

}

标签:android,global-variables,bluetooth
来源: https://codeday.me/bug/20190704/1372530.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有